次のコマンドの違いは何ですか?
su
sudo -s
sudo -i
sudo bash
su
ルートパスワードを知る必要があり、ファイルsudo
内にいなければならないことはわかっていますsudoers
が、実行すると何が違うのでしょうか?
su
との間には違いがあることはわかっています。sudo -s
なぜなら、/root
を実行した後はsu
ホームディレクトリ/home/myname
が になるからですsudo -s
。しかし、これは私が見逃している根本的な違いの症状にすぎないのではないかと思います。
答え1
su
あなたとなる別のユーザー — デフォルトでは root ですが、別のユーザーになる可能性もあります。 と入力すると、環境もそのユーザーのログイン環境に置き換えられるため、表示される内容はそのユーザーとしてログインした場合と区別がつかなくなります。 'd 中に別のユーザーに対して行った操作と、そのユーザーがログインしたときのアクションをsu -
システムが判別する方法はありません。su
状況は大きく異なりますsudo
:
実行するコマンド
sudo
実行するターゲット ユーザーとして (デフォルトでは root ですが、変更可能-u
)、実行したコマンドがログに記録され、ユーザー名でタグ付けされるため、後で責任を割り当てることができます。 :)sudo
は非常に柔軟です。たとえば、特定のユーザーまたはユーザー グループが実行できるコマンドを制限できます。 ではsu
、すべてか、何もないかのどちらかです。この機能は通常、ロールを定義するために使用されます。たとえば、 と の実行が許可された「バックアップ」グループを定義できます。これらのグループに
dump
はtar
、システム ディスクを適切にバックアップするためのルート アクセスが必要です。ここでこれについて言及するのは、誰かにや の能力を
sudo
与えずに特権を与えることができることを意味するからです。 は、仕事を行うために必要な許可のみを持ちますが、 ではシステム全体を実行できます。 ただし、これには注意が必要です。たとえば、 と言う能力を誰かに与えた場合、その人は を出して、 の場合と実質的に同じ権限を持つことができます。sudo -s
sudo bash
su
sudo vi
vi
sudo -s
root パスワードの代わりに sudoer のパスワードを使用するため、
sudo
複数の sudoer 間で権限が分離されます。これにより、 の管理上の問題が解決されます
su
。つまり、ルート パスワードが変更されると、それを使用するためにそのパスワードを知っている必要のあるすべてのユーザーにsu
通知する必要があります。 ではsudo
、sudoers のパスワードを個別に変更できます。実際、 を使用するシステムでは、sudo
すべてのシステム管理者タスクを 経由で実行するように強制するために、 root ユーザーのアカウントをパスワード ロックするのが一般sudo
的です。多くの信頼できる sudoers を持つ大規模な組織では、これは、システム管理者の 1 人が退職しても、ルート パスワードを変更して、残っている管理者に配布する必要がなくなることを意味します。
sudo bash
との主な違いは次sudo -s
のとおりです。
-s
より短いbash
デフォルトのシェルでスーパーユーザー権限で
sudo -s some-command
実行するように指定できます。これは基本的に の省略形です。some-command
sudo $SHELL -c some-command
代わりに、シェルの標準入力にコマンドを渡すこともできます
sudo -s < my-shell-script
。ヒアドキュメント複数のコマンドを 1 回のsudo
呼び出しに送信できるため、繰り返し入力する必要がなくなりますsudo
。これらの追加のコマンド引数がない場合でも、は とは異なるシェルを実行する可能性があるという点で
sudo -s
とは異なります。これは、 が最初に環境変数を参照し、それが設定されていない場合は、ユーザーのログイン シェル設定 (通常は ) を参照するためです。sudo bash
bash
SHELL
/etc/passwd
によって実行されるシェルは、sudo -s
現在のユーザー環境を継承します。実際に必要なのが、ログイン直後のようなクリーンな環境である場合はsudo -i
、 に比較的最近追加された を使用する必要がありますsudo
。大まかに言うと、sudo -i
は と同様sudo -s
にsu -
になります。つまりsu
、いくつかの重要な環境変数を除いてすべてをリセットし、ユーザーのホーム ディレクトリに戻ります。標準入力または を介してそのシェルで実行するコマンドも に与えない場合sudo -i some-command
、そのシェルは対話型ログイン シェルとして実行されるため、ユーザーのシェル起動スクリプト (例.bash_profile
) が再度実行されます。
これらすべてにより、sudo -i
は よりもかなり安全になりますsudo -s
。なぜでしょうか? の前に誰かが環境を変更できる場合sudo -s
、意図しないコマンドが実行されてしまう可能性があるからです。最も明白なケースは の変更ですが、の下にあるときにを介してSHELL
など、それほど直接的ではないケースでも発生する可能性があります。PAGER
man foo
sudo -s
「もし を変更できるならPAGER
、 を変更してPATH
、悪質なsudo
プログラムを代用すればいい」と言うかもしれないが、十分に偏執的な人は、その罠を避けることができると言うだろう/usr/bin/sudo /bin/bash
。あなたはおそらく、すべての罠も避けるほど偏執的ではないだろう。他のただし、影響を受けやすい環境変数があります。EDITOR
たとえば、何かを実行する前に、VCコマンド?したがってsudo -i
。
sudo -i
は作業ディレクトリをユーザーのホームディレクトリに変更するため、を実行したときとsudo -s
同じディレクトリに留まりたい場合は、 を使用することをお勧めします。ただし、 を実行して元の場所に戻る方が安全です。cd
sudo
sudo -i
cd
時々見かけるこの他のバリエーションは でsudo su
、これは とほぼ同等ですsudo -s
。同様に、sudo su -
は機能的に に非常に近いです。と は競合するコマンドなsudo -i
ので、このように組み合わせるのは少し奇妙です。そのため、代わりに フラグを使用することをお勧めします。sudo
su
sudo
答え2
から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
。ルートになっていて、$HOME
通常のユーザーのホームに設定すると、問題が発生する可能性があります。たとえば、グラフィカル アプリを実行すると、通常のユーザーの~/.Xauthority
ホームがルートによって上書きされる可能性があります。これにより、後で 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
ユーザーの環境によって汚染されていないルート シェルが必要な場合に実行する適切なコマンドです。
答え3
su
(s魔女あなたserまたはs代用するあなたser) を使用すると、ユーザーを切り替えることができます。su
基本的には、目的のユーザーの権限を持つ別のシェル インスタンスを起動します。デフォルトでは、ユーザーに切り替えますがroot
、特定のユーザーを切り替える場合は、次のようにユーザーを渡す必要があります。
$ su bob # switches to bob (requires bob's password)
su -
は環境変数がルートにリセットされることを意味し、su
は環境変数が古いユーザーとして意味します。
たとえば、 を使用する場合は root のホーム ディレクトリsu -
、 を使用する場合は古いユーザーのホーム ディレクトリですsu
。
sudo (s上等なあなたサーする) は、ユーザーが別のユーザーのセキュリティ権限でプログラムを実行できるようにするコマンドラインユーティリティです。デフォルトではスーパーユーザーです。特定のアクションに対する権限を持つユーザーをリストする root
構成ファイルを使用します。/etc/sudoers
sudoは次のように読みます/ˈsuːduː/。構文sudo command
例s魔女あなたserとするこのコマンド。
su
は と同等でありsudo -i
、ルート アカウントへのログインをシミュレートします。作業ディレクトリは になり/root
、ルート.profile
などが読み込まれます。プロンプトが $ から # に変わり、ルート アクセスがあることを示します。sudo -s
シェルをルートとして起動しますが、作業ディレクトリは変更しません。sudo bash
ここbash
で、 は実行するコマンドですsudo
。このコマンドはbash
スーパーユーザーとして実行されます。- を使用すると、
sudo
誰かが行うすべてのことを記録できます。 - を使用すると
sudo
、ユーザーがルート パスワードを知る必要がなくなります。 - を使用すると
sudo
、実行できるコマンドを制限できます。