Linuxで作業中に別のユーザーへ切り替えたいときに使うのが su コマンドです。ユーザー名を省略すると root(管理者)へ切り替わります。このページでは、「どのユーザーのパスワードを入力するのか」「su と su - は何が違うのか」「切り替えた後どうやって元に戻るのか」という3つのつまずきポイントを、実際のコマンド出力を示しながら解説します。
結論:ユーザー切り替えの3行
su - alice # alice に切り替える(alice のパスワードを入力)
su - # root に切り替える(root のパスワードを入力)
exit # 元のユーザーに戻る
- 入力するのは切り替え先ユーザーのパスワードです(自分のパスワードではありません)。
- ハイフンを付けた
su -のほうが安全で、実務ではこちらが基本です。 - Ubuntu では root にパスワードが設定されていないため
su -は失敗します。sudo -iを使ってください(後述)。
suコマンドとは
su は substitute user(ユーザーの代替)の略で、現在のシェルの子プロセスとして別ユーザーのシェルを起動するコマンドです。「今のユーザーが別人になる」のではなく、「別人のシェルが上に積まれる」というイメージが正確です。だから exit で1つ戻れば元のユーザーに帰ってきます。
実務では、管理者作業のために root へ入る、postgres や www-data といったサービス用ユーザーに一時的に切り替えて動作確認する、といった用途で使います。
構文(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は「ログインシェル」(環境変数・HOME・PATHなどをそのユーザー基準に初期化)。-cは 1 回だけコマンドを実行して終了。- オプションや挙動は実装(util-linux / BSD / BusyBox)で一部異なります。本ページの実行例は util-linux 2.39.3(Ubuntu 24.04)で確認しています。
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
- / -l | ログインシェルとして切り替え(環境を初期化) | su - |
-c CMD | 1 回だけコマンドを実行 | 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で確認してください。
ハイフンの有無で何が変わるか(実測)
最も混乱しやすいのが su USER と su - USER の違いです。呼び出し元で独自の環境変数を定義してから、両方を実行して比較します。
$ export MYVAR="呼び出し元の値"
$ su alice -c 'echo MYVAR=[$MYVAR]; echo PWD=$PWD'
MYVAR=[呼び出し元の値]
PWD=/
$ su - alice -c 'echo MYVAR=[$MYVAR]; echo PWD=$PWD'
MYVAR=[]
PWD=/home/alice
ハイフン無しでは MYVAR がそのまま残り、カレントディレクトリも移動しません。ハイフンありでは環境が初期化され、切り替え先ユーザーのホームへ移動しています。ログインシェルかどうかも shopt で確認できます。
$ su alice -c 'shopt -q login_shell && echo ログインシェル || echo 非ログインシェル'
非ログインシェル
$ su - alice -c 'shopt -q login_shell && echo ログインシェル || echo 非ログインシェル'
ログインシェル
| 項目 | su USER | su - USER |
|---|---|---|
| 環境変数 | 呼び出し元のものが残る | 切り替え先ユーザー基準に初期化 |
| カレントディレクトリ | そのまま | 切り替え先のホームへ移動 |
| ログインシェル | いいえ | はい |
| 読み込まれる設定ファイル | ~/.bashrc | ~/.bash_profile(無ければ~/.profile) |
| 推奨度 | 環境を持ち込むため事故が起きやすい | こちらを使う |
ハイフン無しは PATH ごと持ち込むため、意図しない場所のバイナリをroot権限で実行してしまうリスクがあります。管理作業では su - を使ってください。ログインシェルで読み込まれる設定ファイルについては.bash_profileとは?場所・書き方・.bashrcとの違いを解説で詳しく扱っています。
パスワードは誰のものを入力するのか
su が要求するのは切り替え先ユーザーのパスワードです。bob が alice に切り替える場合、入力するのは alice のパスワードです。
# bob としてログイン中。alice のパスワードは pw123
$ su - alice
Password: <- ここで入力するのは alice のパスワード
$ whoami
alice
この点が sudo と正反対です。sudo は自分自身のパスワードで認証し、実行できる範囲を sudoers で管理者が制御します。「他人のパスワードを共有しなくて済む」ため、現在は sudo が主流になっています。
| コマンド | 入力するパスワード | 用途 |
|---|---|---|
su - USER | 切り替え先(USER)のもの | そのユーザーとして作業を続ける |
su - | root のもの | root として作業を続ける |
sudo CMD | 自分のもの | 1コマンドだけ管理者権限で実行 |
sudo -i | 自分のもの | root のログインシェルに入る(su -の代替) |
sudo -u USER CMD | 自分のもの | 任意のユーザーとして1コマンド実行 |
sudo 側の設定はsudo コマンドの使い方|root 権限の取得と sudoers の設定にまとめています。
実行例
管理者(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
切り替えを解除して元のユーザーに戻る
su は子シェルを起動しているだけなので、そのシェルを終了すれば戻ります。exit、logout、または Ctrl+D のいずれでも同じです。
$ whoami
mugi
$ su - alice
$ whoami
alice
$ exit
logout
$ whoami
mugi
何度も su を重ねると、その分だけシェルが積み上がります。今どこにいるか分からなくなったら whoami コマンドで確認し、exit を必要な回数だけ実行してください。
よくあるエラーと対処法
su: Authentication failure(Ubuntuでrootになれない)
$ su -
Password:
su: Authentication failure
パスワードを間違えたわけではなく、Ubuntu では root アカウントが既定でロックされているのが原因です。/etc/shadow のパスワード欄が * になっており、どんなパスワードでも認証が通りません。
$ sudo grep '^root:' /etc/shadow | cut -d: -f1,2
root:*
対処は2通りです。通常は上の方法を選んでください。
# 推奨:root にパスワードを設定せず sudo でrootシェルに入る
sudo -i
# 非推奨:root にパスワードを設定して su - を使えるようにする
sudo passwd root
後者は root への直接ログイン経路を作ることになり、誰が操作したかの記録も残りません。組織の方針で明示的に必要な場合を除き避けてください。
This account is currently not available.
$ su - nobody
su: warning: cannot change directory to /nonexistent: No such file or directory
This account is currently not available.
そのユーザーのログインシェルが /usr/sbin/nologin や /bin/false に設定されている場合に出ます。サービス用ユーザーは意図的にこう設定されています。動作確認のためにどうしてもシェルが必要なら、-s でシェルを明示します。
# ログインシェルの設定を確認する
$ getent passwd www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
# シェルを指定して切り替える(root権限が必要)
$ sudo su -s /bin/bash - www-data
su: Permission denied / user NOT in sudoers
su は PAM(/etc/pam.d/su)で制御されており、pam_wheel が有効な環境では wheel グループ(Debian系は sudo グループ)に所属していないと拒否されます。所属グループは id で確認できます。
$ id
uid=1000(mugi) gid=1000(mugi) groups=1000(mugi),27(sudo)
# グループへの追加(管理者が実行)
$ sudo usermod -aG sudo alice
権限まわりのエラー全般の切り分けはPermission deniedの原因と直し方|6つの切り分け手順を参照してください。
よくある質問(FAQ)
Q1. Linuxでユーザーを切り替えるコマンドは何ですか?
su - ユーザー名 です。ユーザー名を省略すると root へ切り替わります。切り替え先ユーザーのパスワードを入力し、exit で元に戻ります。
Q2. suとsudoはどう使い分けますか?
管理者権限が必要なコマンドが1つ2つなら sudo コマンド、まとまった管理作業を続けるなら sudo -i でrootシェルに入ります。su - はroot自身のパスワードを共有する必要があるため、複数人で運用するサーバーには向きません。
Q3. 「su」と「su -」はどちらを使うべきですか?
原則として su - です。ハイフン無しは呼び出し元の PATH や環境変数を持ち込むため、意図しないバイナリを高い権限で実行してしまう危険があります。
Q4. 今どのユーザーになっているか確認するには?
whoami コマンドで実効ユーザー名が分かります。id ならUID・GID・所属グループまで確認できます。元のログインユーザーを知りたい場合は who am i や logname を使います。
Q5. パスワードを入力せずに切り替えられますか?
root から他ユーザーへ su する場合はパスワードを聞かれません。スクリプトから使う場合は、パスワード入力を必要としない runuser(root専用、util-linux)や sudo -u USER コマンド を使います。
関連コマンド
sudo: 呼び出し元ユーザーの認証で一時的に権限昇格(細かな制御・監査向き)。useradd: 新しいユーザーを作成する。usermod: 既存ユーザーの所属グループやシェルを変更する。passwd: ユーザーのパスワード変更(root アカウントの有効化/無効化にも関与)。- Linuxユーザー一覧の確認方法 : 切り替え先の候補を調べる。
runuser: root 専用のsu風コマンド(パスワード不要、スクリプト向き・util-linux)。newgrp: 現在の主要グループを切り替える。
備考
- 認証の違い:
suは対象ユーザーのパスワードで認証します(既定は root のパスワード)。一方sudoは呼び出し元ユーザーのパスワードで認証し、権限はsudoersで細かく制御します。 - root がロックされる環境: Ubuntu などは root がロック(パスワード未設定)されているため、
suは失敗します。sudo -iで代替してください。 - PAM と制限:
suは PAM(/etc/pam.d/su)により制御され、wheelやsudoグループに所属していないと実行を拒否する設定(pam_wheel)が有効な場合があります。 - 環境引き継ぎの注意:
-m/-pで環境変数やPATHを保持すると、想定外のバイナリが実行されるリスクがあります。管理作業では基本的にsu -を推奨。 - シェル階層:
suは現在のシェルの子プロセスとして新しいシェルを起動します。終了すれば元のシェルに戻ります(exitで抜ける)。 - 実装差分: util-linux、BSD、BusyBox でサポートオプションが異なります。スクリプトでの利用時は特に移植性に注意してください。
参考
man 1 su(各ディストリ付属のマニュアル)- PAM 設定例:
/etc/pam.d/su、pam_wheel(8) - util-linux
suドキュメント(Linux 環境) - FreeBSD/macOS の
suマニュアル(BSD 実装)

コメント