su と sudo -s と sudo -i と sudo bash の比較

su と sudo -s と sudo -i と sudo bash の比較

次のコマンドの違いは何ですか?

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、すべてか、何もないかのどちらかです。

    この機能は通常、ロールを定義するために使用されます。たとえば、 と の実行が許可された「バックアップ」グループを定義できます。これらのグループにdumptar、システム ディスクを適切にバックアップするためのルート アクセスが必要です。

    ここでこれについて言及するのは、誰かにや の能力をsudo与えずに特権を与えることができることを意味するからです。 は、仕事を行うために必要な許可のみを持ちますが、 ではシステム全体を実行できます。 ただし、これには注意が必要です。たとえば、 と言う能力を誰かに与えた場合、その人は を出して、 の場合と実質的に同じ権限を持つことができます。sudo -ssudo bashsusudo vivisudo -s

  • root パスワードの代わりに sudoer のパスワードを使用するため、sudo複数の sudoer 間で権限が分離されます。

    これにより、 の管理上の問題が解決されますsu。つまり、ルート パスワードが変更されると、それを使用するためにそのパスワードを知っている必要のあるすべてのユーザーにsu通知する必要があります。 ではsudo、sudoers のパスワードを個別に変更できます。実際、 を使用するシステムでは、sudoすべてのシステム管理者タスクを 経由で実行するように強制するために、 root ユーザーのアカウントをパスワード ロックするのが一般sudo的です。多くの信頼できる sudoers を持つ大規模な組織では、これは、システム管理者の 1 人が退職しても、ルート パスワードを変更して、残っている管理者に配布する必要がなくなることを意味します。

sudo bashとの主な違いは次sudo -sのとおりです。

  1. -sより短いbash

  2. デフォルトのシェルでスーパーユーザー権限でsudo -s some-command実行するように指定できます。これは基本的に の省略形です。some-commandsudo $SHELL -c some-command

  3. 代わりに、シェルの標準入力にコマンドを渡すこともできますsudo -s < my-shell-scriptヒアドキュメント複数のコマンドを 1 回のsudo呼び出しに送信できるため、繰り返し入力する必要がなくなりますsudo

  4. これらの追加のコマンド引数がない場合でも、は とは異なるシェルを実行する可能性があるという点でsudo -sとは異なります。これは、 が最初に環境変数を参照し、それが設定されていない場合は、ユーザーのログイン シェル設定 (通常は ) を参照するためです。sudo bashbashSHELL/etc/passwd

によって実行されるシェルは、sudo -s現在のユーザー環境を継承します。実際に必要なのが、ログイン直後のようなクリーンな環境である場合はsudo -i、 に比較的最近追加された を使用する必要がありますsudo。大まかに言うと、sudo -iは と同様sudo -ssu -になります。つまりsu、いくつかの重要な環境変数を除いてすべてをリセットし、ユーザーのホーム ディレクトリに戻ります。標準入力または を介し​​てそのシェルで実行するコマンドも に与えない場合sudo -i some-command、そのシェルは対話型ログイン シェルとして実行されるため、ユーザーのシェル起動スクリプト (例.bash_profile) が再度実行されます。

これらすべてにより、sudo -iは よりもかなり安全になりますsudo -s。なぜでしょうか? の前に誰かが環境を変更できる場合sudo -s、意図しないコマンドが実行されてしまう可能性があるからです。最も明白なケースは の変更ですが、の下にあるときにを介してSHELLなど、それほど直接的ではないケースでも発生する可能性があります。PAGERman foosudo -s

「もし を変更できるならPAGER、 を変更してPATH、悪質なsudoプログラムを代用すればいい」と言うかもしれないが、十分に偏執的な人は、その罠を避けることができると言うだろう/usr/bin/sudo /bin/bash。あなたはおそらく、すべての罠も避けるほど偏執的ではないだろう。他のただし、影響を受けやすい環境変数があります。EDITORたとえば、何かを実行する前に、VCコマンド?したがってsudo -i

sudo -iは作業ディレクトリをユーザーのホームディレクトリに変更するため、を実行したときとsudo -s同じディレクトリに留まりたい場合は、 を使用することをお勧めします。ただし、 を実行して元の場所に戻る方が安全です。cdsudosudo -icd

時々見かけるこの他のバリエーションは でsudo su、これは とほぼ同等ですsudo -s。同様に、sudo su -は機能的に に非常に近いです。と は競合するコマンドなsudo -iので、このように組み合わせるのは少し奇妙です。そのため、代わりに フラグを使用することをお勧めします。sudosusudo

答え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
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games おそらく/etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

要するに、これは、sudo -iユーザーの環境によって汚染されていないルート シェルが必要な場合に実行する適切なコマンドです。

答え3

sus魔女あなた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 commands魔女あなたserとするこのコマンド。

  • suは と同等でありsudo -i、ルート アカウントへのログインをシミュレートします。作業ディレクトリは になり/root、ルート.profileなどが読み込まれます。プロンプトが $ から # に変わり、ルート アクセスがあることを示します。

  • sudo -s シェルをルートとして起動しますが、作業ディレクトリは変更しません。

  • sudo bash ここbashで、 は実行するコマンドですsudo。このコマンドは bashスーパーユーザーとして実行されます。

  • を使用すると、sudo誰かが行うすべてのことを記録できます。
  • を使用するとsudo、ユーザーがルート パスワードを知る必要がなくなります。
  • を使用するとsudo、実行できるコマンドを制限できます。

関連情報