suコマンドの使い方|Linuxでユーザーを切り替える方法とsudoの違い

コマンドリファレンス

Linuxで作業中に別のユーザーへ切り替えたいときに使うのが su コマンドです。ユーザー名を省略すると root(管理者)へ切り替わります。このページでは、「どのユーザーのパスワードを入力するのか」「susu - は何が違うのか」「切り替えた後どうやって元に戻るのか」という3つのつまずきポイントを、実際のコマンド出力を示しながら解説します。

結論:ユーザー切り替えの3行

su - alice      # alice に切り替える(alice のパスワードを入力)
su -            # root に切り替える(root のパスワードを入力)
exit            # 元のユーザーに戻る
  • 入力するのは切り替え先ユーザーのパスワードです(自分のパスワードではありません)。
  • ハイフンを付けた su - のほうが安全で、実務ではこちらが基本です。
  • Ubuntu では root にパスワードが設定されていないため su - は失敗します。sudo -i を使ってください(後述)。

suコマンドとは

su は substitute user(ユーザーの代替)の略で、現在のシェルの子プロセスとして別ユーザーのシェルを起動するコマンドです。「今のユーザーが別人になる」のではなく、「別人のシェルが上に積まれる」というイメージが正確です。だから exit で1つ戻れば元のユーザーに帰ってきます。

実務では、管理者作業のために root へ入る、postgreswww-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 は「ログインシェル」(環境変数・HOMEPATH などをそのユーザー基準に初期化)。
  • -c は 1 回だけコマンドを実行して終了。
  • オプションや挙動は実装(util-linux / BSD / BusyBox)で一部異なります。本ページの実行例は util-linux 2.39.3(Ubuntu 24.04)で確認しています。

主なオプション一覧

オプション説明使用例
- / -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 で確認してください。

ハイフンの有無で何が変わるか(実測)

最も混乱しやすいのが su USERsu - 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 USERsu - 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 は子シェルを起動しているだけなので、そのシェルを終了すれば戻ります。exitlogout、または 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 ilogname を使います。

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)により制御され、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玄をフォローする

コメント