suとsudoの違い


suとsudoはオプションの違いはあるものの、できることはほぼ重複している。
ただ、suは切替先ユーザー(root)のパスワードが要求されるのに対し、sudoは元のユーザーのパスワードが要求される。sudoは/etc/sudoersで権限を細かく設定できるので、どちらか片方だけ覚えるならsudoだけを覚えておくとよい。

オプションによって実行後のカレントディレクトリや環境変数が変わってきて、それでハマることがあるので違いをまとめておく。
(Amazon Linuxで確認。CentOSでもほぼ同じと思うが、他のディストリビューションでは違う可能性あり)

コマンド .bash_profile .bashrc pwd HOME PATH
su n y 変わらない /root /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/opt/aws/bin
su - y y /root /root /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin
sudo -i y y /root /root /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin
sudo -s n y 変わらない /root /sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin
sudo bash n y 変わらない /root /sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin
sudo bash --login y y 変わらない /root /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

.bash_profileはログインシェルのときだけ読み込まれ、その中から.bashrcを読み込む。

  • できるだけ忠実にrootの環境を再現したいときはsu -かsudo -iを使うとよい
  • su -とsudo -iで$PATHの/usr/local/binが違う。/usr/local/binがどこで設定されているのか、/etc/bashrcや/etc/profile.dを探しても見つからなかったが、man suに書いてある

ENV_SUPATH (string)
Defines the PATH environment variable for root. The default value is >/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin.

が効いているのだろうか。そうだとするとコンソールからrootでログインしたときは/usr/local/binは含まれていないのだろうか。

「CentOSのsudoまとめ」も参照。
http://qiita.com/aosho235/items/bfb8034fbe1c84d7489f

雑学

sudo は sudo パッケージに含まれている。
su は util-linux パッケージに含まれている。
つまり開発元が別。ソースをちら見してみたら、全然別物のようだった。

useradd などを提供する shadow-utils パッケージ(の源流)にも su が含まれている。Debian 系ではこちらの su が使われているのだろうか?
http://pkg-shadow.alioth.debian.org/features.php

sudo は 1980 年頃 Robert Coggeshall と Cliff Spencer によって書かれた。
su は Version 1 Unix にすでに含まれていた由緒正しいコマンド。