次のコマンドの違いは何ですか?
su
Sudo -s
Sudo -i
Sudo bash
su
についてはルートパスワードを知っている必要があり、Sudo
についてはsudoers
ファイルに存在する必要がありますが、一度実行すると違いは何ですか?
su
を実行した後、ホームディレクトリはSudo -s
になるため、su
と/root
には違いがあることを知っていますが、ホームディレクトリは/home/myname
のままですSudo -s
以降。しかし、これは私が見逃している根本的な違いの症状にすぎないと思います。
su
を使用すると、別のユーザーになりますデフォルトではrootですが、別のユーザーになる可能性もあります。 su -
と言うと、環境はそのユーザーのログイン環境にも置き換えられるため、表示される内容はそのユーザーとしてのログインと区別がつきません。ログイン時のユーザーのアクションから別のユーザーにsu
'を送信している間、システムがあなたの行動をシステムが認識できる方法はありません。
Sudo
を使用すると状況が大きく異なります。
ターゲットユーザーとしてSudo
executeを介して実行するコマンド—デフォルトではrootですが、-u
を使用して変更可能ですが、実行したコマンドをログに記録し、タグを付けますユーザー名を使用して、後で責任を割り当てることができます。 :)
Sudo
は非常に柔軟です。たとえば、特定のユーザーまたはユーザーグループが実行を許可されるコマンドを制限できます。 su
があれば、それはすべてか何もありません。
この機能は通常、役割を定義するために使用されます。たとえば、dump
およびtar
の実行を許可された「バックアップ」グループを定義できます。これらのグループはそれぞれ、システムディスクを適切にバックアップするためにルートアクセスを必要とします。
これは、Sudo -s
またはSudo bash
の機能を付与せずに、Sudo
の権限を誰かに付与できることを意味するため、ここで言及します。 su
を使用すると、システム全体を実行できるのに対し、彼らには仕事をするために必要な権限しかありません。ただし、これには注意する必要があります。たとえば、誰かにSudo vi
を言う能力を与えると、彼らはvi
からシェル化して、Sudo -s
と実質的に同じ能力を持つことができます。
ルートパスワードの代わりにsudoerのパスワードを使用するため、Sudo
は複数のsudoer間の権限を分離します。
これは、su
の管理上の問題を解決します。つまり、rootパスワードが変更された場合、su
を使用するためにそれを知っている必要があるすべての人に通知する必要がありました。 Sudo
を使用すると、sudoersのパスワードを個別に変更できます。実際、Sudo
を使用するシステムでrootユーザーのアカウントをパスワードロックして、すべてのsysadminタスクをSudo
で強制的に実行するのが一般的です。多くの信頼できるsudoerを持つ大規模な組織では、これは、システム管理者の1人が去ったときに、ルートパスワードを変更して、残っている管理者に配布する必要がないことを意味します。
Sudo bash
とSudo -s
の主な違いは、-s
が短く、いくつかの方法でユーザーのデフォルトのシェルで実行するコマンドを渡すことができることです。
シェルの下でSudo -s some-command
を実行するsome-command
と言うことができます。基本的には、Sudo $Shell -c some-command
の省略形です。
代わりに、Sudo -s < my-Shell-script
などのコマンドをシェルの標準入力に渡すことができます。これを heredoc と一緒に使用して、複数のコマンドを単一のSudo
呼び出しに送信し、Sudo
を繰り返し入力する必要を回避できます。
これらの動作はどちらもオプションです。より一般的には、-s
を単独で指定するため、ユーザーのシェルをインタラクティブに実行するだけです。そのモードでは、Sudo bash
とは異なり、bash
環境変数を最初に検索し、それが設定されていない場合は、ユーザーのログインシェル設定(通常は/etc/passwd
)で検索するため、Shell
とは異なるシェルを実行する可能性があります。
Sudo -s
によって実行されるシェルは、現在のユーザー環境を継承します。ログイン直後のように、実際にクリーンな環境が必要な場合は、Sudo
に比較的最近追加されたSudo -i
が代わりに必要です。大まかに言えば、Sudo -i
はSudo -s
に対してsu -
はsu
に対してであり、いくつかの重要な環境変数を除いてすべてリセットし、ユーザーのホームディレクトリに送り返します。標準入力またはSudo -i some-command
を介してそのシェルで実行するコマンドも指定しない場合、そのシェルはインタラクティブログインシェルとして実行されるため、ユーザーのシェル起動スクリプト(.bash_profile
など)が再度実行されます。
これらすべてにより、Sudo -i
はSudo -s
よりもかなり安全になります。どうして?誰かがSudo -s
の前に環境を変更できると、意図しないコマンドが実行される可能性があるためです。最も明らかなケースは、Shell
を変更することですが、man foo
の下でSudo -s
と言う場合、PAGER
を使用するなど、直接発生することも少なくなります。
「PAGER
を変更できる場合は、PATH
を変更でき、悪意のあるSudo
プログラムを置き換えることができます」と言うかもしれませんが、十分な偏執狂の人は、/usr/bin/Sudo /bin/bash
を言ってその罠を回避できます。ただし、それほど偏執的ではないので、other影響を受けやすいすべての環境変数のトラップも回避します。 [〜#〜] vcs [〜#〜] コマンドを実行する前に、たとえばEDITOR
を確認することを覚えていますか?したがって、Sudo -i
です。
Sudo -i
は、作業ディレクトリもユーザーのホームディレクトリに変更するので、cd
を実行したときにSudo
を付けたのと同じディレクトリにとどまりたい場合は、Sudo -s
を使用することもできます。ただし、Sudo -i
とcd
を使用して元の場所に戻す方が安全です。
ubuntuforumsの投稿 から私は少し前に作成しました:
次の実験を考えてみましょう:
applic@ion:~% Sudo su
[Sudo] password for applic:
root@ion:/home/applic# env > /tmp/Sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% Sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/Sudo_s
ここに私が見つけた違いがあります:
Sudo -s
の場合:
HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc
Sudo su
の場合:
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc
$HOME
の違いに注意してください。 rootになり、$HOME
を通常のユーザーの家に設定すると、問題が発生する可能性があります。たとえば、グラフィカルアプリを実行すると、通常のユーザーの~/.Xauthority
がrootによって上書きされる可能性があります。これにより、後でcronを介して特定のグラフィカルアプリを実行できないなど、通常のユーザーの問題が発生します。
要約する:
corrupted by user's
HOME=/root uses root's PATH env vars
Sudo -i Y Y[2] N
Sudo -s N Y[2] Y
Sudo bash N Y[2] Y
Sudo su Y N[1] Y
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
おそらく/etc/environment
によって設定されますPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
一番下の行はSudo -i
で、ユーザーの環境によって汚染されていないルートシェルが必要なときに実行する適切なコマンドです。
su
(s witch serまたはs ubstitute ser)では、ユーザーを切り替えることができます。 su
は基本的に、意図したユーザーの権限で別のシェルインスタンスを起動します。デフォルトでは、root
ユーザーに切り替えます。特定のユーザーを切り替える場合は、次のようにユーザーを渡す必要があります。
$ su bob # switches to bob (requires bob's password)
su -
は、環境変数がrootにリセットされることを意味し、su
は、古いユーザーとしての環境変数を意味します。
たとえば、su -
を使用する場合はルートのホームディレクトリ、su
を使用する場合は古いユーザーのホームディレクトリ。
Sudo(s uper ser do)は、ユーザーが別のユーザーのセキュリティ特権でプログラムを実行できるようにするコマンドラインユーティリティです。デフォルトはスーパーユーザー、つまりroot
です。設定ファイル/etc/sudoers
を使用して、特定のアクションに対する権限を持つユーザーをリストします
Sudoは/ ˈsuːduː /として読み取る必要があります。構文Sudo command
つまり、s witch serおよびdoこのコマンド。
su
はSudo -i
と同等で、rootアカウントへのログインをシミュレートします。作業ディレクトリは/root
になり、ルートの.profile
などを読み取ります。プロンプトが$から#に変わり、ルートアクセス権があることを示します。
Sudo -s
はrootとしてシェルを起動しますが、作業ディレクトリは変更しません。
Sudo bash
bash
は、Sudo
で実行するコマンドです。このコマンドは、スーパーユーザーとしてbash
を実行します。
Sudo
を使用すると、誰かが行ったすべてのことをログに記録できます。Sudo
を使用すると、ユーザーがrootパスワードを知る必要がなくなります。Sudo
を使用すると、実行を許可するコマンドを制限できます。