su vs sudo -s vs sudo -i vs sudo bash


89

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

su
sudo -s
sudo -i
sudo bash

suはルートパスワードを知る必要があることを知っています、そしてsudo私はsudoersファイルにいなければなりませんが、一度実行すると違いは何ですか?

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


3
sudo su - ルートパスワードを必要とせず-、ホームディレクトリが正しく設定されていることを確認するために、この方法を使用することを好みます。
イェンスティマーマン

回答:


114

を使用suすると、別のユーザーになります。デフォルトではルートですが、潜在的に別のユーザーになります。と言うsu -場合、環境はそのユーザーのログイン環境にも置き換えられるため、表示される内容はそのユーザーとしてログインすることと区別できません。su別のユーザーがログインしたときに、そのユーザーによるアクションから、ユーザーが何をしているのかをシステムが伝える方法はありません。

物事は非常に異なっていsudoます:

  • sudo 実行するコマンドは、ターゲットユーザーとして実行されます(デフォルトではrootですが、変更可能です)が-u、実行するコマンドをログに記録し、ユーザー名でタグ付けして、後で責任を割り当てることができます。:)

  • sudo非常に柔軟です。たとえば、特定のユーザーまたはユーザーのグループが実行できるコマンドを制限できます。でsu、それはすべてまたは何もありません。

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

    誰かにsudo権限sudo -ssudo bash能力を与えることなく、誰かに特権を与えることができることを意味するため、ここでこれについて言及します。suシステム全体を実行しているのに対し、彼らは仕事をするのに必要な権限しか持っていません。ただし、これに注意する必要があります。sudo viたとえば、誰かに発言する能力を与えた場合、相手はから脱出viして、実質的にの場合と同じ力を持つことができますsudo -s

  • ルートパスワードの代わりにsudoerのパスワードを使用するため、複数のsudoer sudo間のアクセス許可を分離します。

    これにより、管理上の問題が解決されsuます。つまり、rootパスワードが変更された場合、使用するためにパスワードを知っていなければならなかったすべての人に通知するsu必要がありました。sudosudoersのパスワードを個別に変更できます。実際、システム上のrootユーザーのアカウントをパスワードロックして、sudoすべてのsysadminタスクをを介して強制的に実行するのが一般的ですsudo。多くの信頼できるsudoerを使用する大規模な組織では、sysadminの1人が去っても、rootパスワードを変更して残っている管理者に配布する必要はありません。

主な違いsudo bashとはsudo -sつまり-s短く、あなたはいくつかの方法で、ユーザーのデフォルトのシェルで実行するコマンドを渡すことができます:

  1. sudo -s some-commandどちらがsome-commandシェルの下で実行されるかを言うことができます。基本的にの略記ですsudo $SHELL -c some-command

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

これらの動作は両方ともオプションです。はるかに一般的には、-s単独で与えるので、ユーザーのシェルをインタラクティブに実行するだけです。そのモードでは、最初に環境変数を調べ、それが設定されていない場合はユーザーのログインシェル設定(通常は)であるため、とはsudo bash異なるシェルを実行する可能性があるという点で異なります。bashSHELL/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そのtrapを避けるように言うことができます。あなたはおそらくあまりにも妄想的ではないので、他のすべて影響を受けやすい環境変数のトラップも避けます。EDITORたとえば、VCSコマンドを実行する前に、を確認することも忘れていませんか?したがってsudo -i

sudo -i作業ディレクトリもユーザーのホームディレクトリに変更されるため、実行時に使用sudo -sしていたディレクトリと同じディレクトリにとどまることがわかっている状況で使用したいcd場合がありますsudo。ただし、あなたがいた場所に戻っsudo -iたりcd戻ったりするのはまだ安全です。


2
「viの殻」とはどういう意味ですか?
クリスロン14年

11
@crisron:内からvi:sh入力してEnterキーを押します。これで、viサブシェルになり、そのシェルを生成したプロセスのすべての特権が与えられます。viルート権限で実行されている場合、シェルも実行されます。または、を介してシェル以外の何かを実行することができます。:!cmdコマンドからの出力をを介して編集バッファに読み込みます:r !cmd。これらすべてがロックダウンされている場合、Makefileターゲットはシェルスクリプトであり、Vimには:makeコマンドがあり、任意のシェルを効果的に実行できますエディター内からのスクリプト。このコメントボックスを保持するには、いたずらの可能性が非常に大きい。
ウォーレンヤング14年

2
誰かがPATHのbashに偽物を入れることができるなら、その誰かはあなたのPATHに偽のsudoを入れることができます。完全なパスを使用してsudoを呼び出す必要があることを本当に確認するには:/usr/bin/sudo
-lesmana

1
@lesmana:編集でそれを取り上げました。基本的に、PATH唯一の問題ではありません。
ウォーレンヤング

6
素晴らしい説明; それを読んで大きな頭痛。
ロビ

27

ubuntuフォーラムのポスト私はしばらく前に作られました。

次の実験を検討してください。

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はルートによって上書きされる可能性があります。これにより、後で特定のグラフィカルアプリを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、ユーザーの環境によって汚染されていないルートシェルが必要な場合に実行する適切なコマンドです。


1
環境がどれだけ「汚染されている」かは、sudo/etc/sudoersおよび関連ファイル)の構成にも依存します。などの構成設定always_set_homeenv_resetenv_keepenv_checkそしてenv_reset、これらはユーザとコマンドに応じて変化し得ます。sudoers(5)マンページの「コマンド環境」およびSUDOERS OPTIONSセクションを参照してください。
カートJ.サンプソン

個人的には、sudo -Hszshと、bashを使用するように変更する可能性のあるすべてのアプリケーションアカウントを使用するため、設定によって環境が汚染されないようにする必要があります。これにより、特定の数の環境変数が無制限に渡されますが、通常、重要な環境変数は/etc/profile.d/*によって上書きされます。
エドグリム

7

sus witch u serまたはs ubstitute u ser)は、ユーザーを切り替えます。su基本的に、目的のユーザーの特権で別のシェルインスタンスを起動します。デフォルトでは、rootユーザーに切り替えます。特定のユーザーを切り替えたい場合は、次のようにユーザーを渡す必要があります。

$ su bob  # switches to bob (requires bob's password)

su -は、環境変数がルートにリセットされることをsu意味し、古いユーザーとしての環境変数を意味します。

たとえば、使用する場合はルートのホームディレクトリ、を使用するsu -場合は古いユーザーのホームディレクトリsu

sudo(s uper u ser do)は、ユーザーが別のユーザーのセキュリティ特権でプログラムを実行できるようにするコマンドラインユーティリティですroot。デフォルトではスーパーユーザーです。/etc/sudoers特定のアクションに対する権限を持つユーザーをリストする構成ファイルを 使用します

sudoは/ ˈsuːduː /と読みます。構文sudo commandすなわちS魔女のU SERと行い、このコマンドを。

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

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

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

  • を使用sudoすると、誰かが行うすべてを記録できます。
  • を使用sudoすると、ユーザーがrootパスワードを知る必要がなくなります。
  • を使用しsudoて、コマンドの実行を制限できます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.