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 にすでに含まれていた由緒正しいコマンド。