web-dev-qa-db-ja.com

su vs Sudo -s vs Sudo -i vs Sudo bash

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

su
Sudo -s
Sudo -i
Sudo bash

suについてはルートパスワードを知っている必要があり、Sudoについてはsudoersファイルに存在する必要がありますが、一度実行すると違いは何ですか?

suを実行した後、ホームディレクトリはSudo -sになるため、su/rootには違いがあることを知っていますが、ホームディレクトリは/home/mynameのままですSudo -s以降。しかし、これは私が見逃している根本的な違いの症状にすぎないと思います。

93
Snitse

suを使用すると、別のユーザーになりますデフォルトではrootですが、別のユーザーになる可能性もあります。 su -と言うと、環境はそのユーザーのログイン環境にも置き換えられるため、表示される内容はそのユーザーとしてのログインと区別がつきません。ログイン時のユーザーのアクションから別のユーザーにsu 'を送信している間、システムがあなたの行動をシステムが認識できる方法はありません。

Sudoを使用すると状況が大きく異なります。

  • ターゲットユーザーとしてSudoexecuteを介して実行するコマンド—デフォルトでは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 bashSudo -sの主な違いは、-sが短く、いくつかの方法でユーザーのデフォルトのシェルで実行するコマンドを渡すことができることです。

  1. シェルの下でSudo -s some-commandを実行するsome-commandと言うことができます。基本的には、Sudo $Shell -c some-commandの省略形です。

  2. 代わりに、Sudo -s < my-Shell-scriptなどのコマンドをシェルの標準入力に渡すことができます。これを heredoc と一緒に使用して、複数のコマンドを単一のSudo呼び出しに送信し、Sudoを繰り返し入力する必要を回避できます。

これらの動作はどちらもオプションです。より一般的には、-sを単独で指定するため、ユーザーのシェルをインタラクティブに実行するだけです。そのモードでは、Sudo bashとは異なり、bash環境変数を最初に検索し、それが設定されていない場合は、ユーザーのログインシェル設定(通常は/etc/passwd)で検索するため、Shellとは異なるシェルを実行する可能性があります。

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

これらすべてにより、Sudo -iSudo -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 -icdを使用して元の場所に戻す方が安全です。

122
Warren Young

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
  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で、ユーザーの環境によって汚染されていないルートシェルが必要なときに実行する適切なコマンドです。

27
unutbu

sus 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このコマンド。

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

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

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

  • Sudoを使用すると、誰かが行ったすべてのことをログに記録できます。
  • Sudoを使用すると、ユーザーがrootパスワードを知る必要がなくなります。
  • Sudoを使用すると、実行を許可するコマンドを制限できます。
9
Premraj