su – 別ユーザー(既定は root)に切り替える

ユーザー/権限管理

su は、現在のシェルを保ったまま別ユーザーとしてコマンドを実行する、またはそのユーザーのシェルに切り替えるためのコマンドです(既定の対象は root)。
対象ユーザーのパスワードで認証するのが基本で、su - で「ログインシェル」として完全に切り替えられます。
実務では、管理者作業のために root に入る、あるいは postgres などのサービス用ユーザーに一時的に切り替える用途で使います。

構文(Syntax)

su [OPTION...] [USER]
su [OPTION...] [USER] -c "COMMAND"

# 代表例
su -                # root のログインシェルへ(root のパスワードが必要)
su USER             # USER に切り替え(USER のパスワードが必要)
su - USER           # USER のログインシェルへ
su -c "CMD" root    # root として 1 コマンドだけ実行して戻る
su -s /bin/bash USER  # USER で使うシェルを指定
  • - または -l は「ログインシェル」(環境変数・HOMEPATH などをそのユーザー基準に初期化)。
  • -c は 1 回だけコマンドを実行して終了。
  • オプションや挙動は実装(util-linux / BSD / BusyBox)で一部異なります。

主なオプション一覧

オプション説明使用例
- / -lログインシェルとして切り替え(環境を初期化)su -
-c CMD1 回だけコマンドを実行su -c "id -u" root
-m / -p現在の環境変数を保持して切り替え(実装により同義)su -m USER
-s SHELL使用するシェルを指定su -s /bin/bash USER
-g GROUP主要グループを指定(util-linux 系)su -g www USER
-G LIST補助グループを指定(util-linux 系)su -G adm,cdrom USER
--help, --versionヘルプ/バージョン表示su --help

注意: macOS/BSD の su-g/-G を持たないなど差異があります。必要な場合は man su で確認してください。

実行例

管理者(root)にログインシェルで切り替える

説明: root の環境に完全切替(HOME=/root 等)。
コマンド:

su -
# (root のパスワード入力を求められます)
whoami && echo "$HOME"

出力例:

root
/root

root として 1 回だけコマンドを実行して戻る

説明: 実行後は元のユーザーに戻ります。
コマンド:

su -c "id -u" root

出力例:

0

別ユーザーに切り替え(ログインシェル)

説明: サービス用ユーザーに切り替えて作業する例。
コマンド:

su - postgres
# または
su -s /bin/bash postgres

出力例(例):

postgres@host:~$

環境を保持して切り替える(-m / -p)

説明: PATH など現在の環境を引き継ぎます(セキュリティ上の注意あり)。
コマンド:

su -m USER

エラー例:root がロックされている/ログイン不可

説明: root にパスワードが設定されていない(Ubuntu 既定など)場合は失敗します。
コマンド:

su -

出力例(例):

Authentication failure

説明: システムユーザーはログインシェルが /usr/sbin/nologin などで拒否されることがあります。
コマンド:

su - nobody

出力例(例):

This account is currently not available.

関連コマンド

  • sudo : 呼び出し元ユーザーの認証で一時的に権限昇格(細かな制御・監査向き)。
  • runuser : root 専用の su 風コマンド(パスワード不要、スクリプト向き・util-linux)。
  • login : ログイン処理。
  • passwd : ユーザーのパスワード変更(root アカウントの有効化/無効化にも関与)。
  • newgrp : 現在の主要グループを切り替える。

備考

  • 認証の違い: su対象ユーザーのパスワードで認証します(既定は root のパスワード)。一方 sudo呼び出し元ユーザーのパスワードで認証し、権限は sudoers で細かく制御します。
  • root がロックされる環境: Ubuntu などは root がロック(パスワード未設定)されているため、su は失敗します。必要なら管理者が sudo passwd root で有効化します(推奨可否は組織方針次第)。
  • PAM と制限: su は PAM(/etc/pam.d/su)により制御され、wheelsudo グループに所属していないと実行を拒否する設定(pam_wheel)が有効な場合があります。
  • 環境引き継ぎの注意: -m/-p で環境変数や PATH を保持すると、想定外のバイナリが実行されるリスクがあります。管理作業では基本的に su - を推奨。
  • シェル階層: su現在のシェルの子プロセスとして新しいシェルを起動します。終了すれば元のシェルに戻ります(exit で抜ける)。
  • 実装差分: util-linux、BSD、BusyBox でサポートオプションが異なります。スクリプトでの利用時は特に移植性に注意してください。

参考

  • man 1 su(各ディストリ付属のマニュアル)
  • PAM 設定例: /etc/pam.d/supam_wheel(8)
  • util-linux su ドキュメント(Linux 環境)
  • FreeBSD/macOS の su マニュアル(BSD 実装)
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント