「su」、「sudo -s」、「sudo -i」、「sudo su」の違いは何ですか?


148

私はすでにマニュアルからそれを読みましたが、違いを見ることができません。

su -ユーザーIDを変更するか、スーパーユーザーになります

sudo -s [command]

-s(シェル)オプションはpasswdに指定されている、それが設定されている場合、SHELL環境変数で指定されたシェルやシェルを実行します(5)。コマンドが指定されている場合、実行のためにシェルに渡されます。それ以外の場合、対話型シェルが実行されます。

sudo -i マニュアルの説明を消す


7
また、su user信頼できないシェルからのログインには使用しないでくださいsu - user。参照してくださいunix.stackexchange.com/q/7013/8250
Lekensteyn

@Lekensteynうわー、素晴らしい例。LOL :)のためのTHX
törzsmókus

1
常に古い戒めを覚えておいてください
törzsmókus

言わないsudo -i悪いですが、あなたは確かにそれを使用して***物事をfとすることができます
Kolobキャニオン

回答:


118

これらのコマンドの主な違いは、機能へのアクセスを制限する方法にあります。

su (これは「代替ユーザー」または「ユーザー切り替え」を意味します) -まさにそれを行い、ターゲットユーザーの権限で別のシェルインスタンスを起動します。それを行う権利があることを確認するために、ターゲットユーザーのパスワード要求します。そのため、rootになるには、rootパスワードを知る必要があります。rootとしてコマンドを実行する必要があるマシン上に複数のユーザーがいる場合、すべてのユーザーがrootパスワードを知っている必要があります-同じパスワードになることに注意してください。ユーザーの1人から管理者権限を取り消す必要がある場合は、rootパスワードを変更し、アクセスを維持する必要のある人だけに伝える必要があります。

sudo (うーん...ニーモニックとは何ですか?スーパーユーザーDO?)はまったく異なります。呼び出されたときに特定のアクション(などルート、などのコマンドを実行)する権限を持っているユーザーを一覧表示し、設定ファイル(の/ etc / sudoersファイル)を使用して、それがために要求することを開始したユーザーのパスワード -で人を確保するために、ターミナルは、実際にリストされて/etc/sudoersいるのと同じ「ジョー」です。個人の管理者権限を取り消すには、構成ファイルを編集するだけです(または、その構成にリストされているグループからユーザーを削除します)。これにより、特権の管理がよりクリーンになります。

この結果、多くのDebianベースのシステムでは、rootユーザーはパスワードを設定していません。つまり、rootとして直接ログインすることはできません。

また、/etc/sudoersいくつかの追加オプションを指定できます。つまり、ユーザーXはプログラムYなどしか実行できません。

頻繁に使用されるsudo su次のように組み合わせは動作します:最初のsudoをお願いしますあなたのパスワード、そして、あなたがそうすることを許可している場合、(次のコマンドを起動suスーパーユーザーとして)。suによって呼び出されるためroot、ターゲットユーザーのパスワードを入力する必要はありません。そのsudo suため、/etc/sudoersファイルによるスーパーユーザーアクセスが許可されている場合、別のユーザー(ルートを含む)としてシェルを開くことができます。


2
私はsu「ユーザーの切り替え」とは見たことはありませんが、常にスーパーユーザーとして見ています。他のユーザー名のないデフォルトの動作(それは理にかなっていますが)。ウィキペディアから:「1974年にはスーパーユーザー[1]とも呼ばれていたsuコマンドは、現在のアカウントに関連付けられているアカウントを変更できるため、「代理ユーザー」、「なりすましユーザー」または「ユーザー設定」とも呼ばれましたターミナル(ウィンドウ)。」
ジンボブ博士

5
@dr jimbob:その通りですが、「ユーザー切り替え」はそれが何をするのかをより良く説明していると思います-歴史的には「スーパーユーザー」の略です。ウィキペディアの記事が私の答えに非常に似ていることも嬉しく思います-以前に記事を見たことがありませんでした:)
セルゲイ

11
「su」の正式な意味は「代理ユーザー」です。「man su」を参照してください。
エンジェルオスフィア

1
@ AngelO'Sphere:おもしろいことに、Ubuntuのマンページには「代用」については一切言及されていません。gnu.orgのマンページ(gnu.org/software/coreutils/manual/html_node/su-invocation.html)には、実際に「su:代替ユーザーおよびグループIDでコマンドを実行」と書かれています。gnu.orgは正規のソースであると思います:)
セルゲイ

1
どうsudo su
カズウォルフ

59

sudoroot権限で自分のユーザーアカウントでコマンドを実行できます。su実際にルートとしてログインするようにユーザーを切り替えることができます。

sudo -sルート権限でシェルを実行します。sudo -iまた、rootユーザーの環境も取得します。

suとの違いを確認するには、それぞれを実行してsudo -sから実行cd ~pwdます。最初のケースでは、rootであるため、rootのホームディレクトリに移動します。2番目のケースでは、自分自身がルート特権を持っているため、自分のホームディレクトリに移動します。

この質問の詳細については、こちらをご覧ください


20
「あなた自身がルート権限を持っている」というのは、実際に起こっていることではありません:)実際、「ルート権限を持っている自分」になることはできません。両方のケースでwhoamiと入力してみてください。cd ~結果が異なるという事実は、$ HOME環境変数を設定しないsudo -sの結果です。
セルゲイ

1
@Sergey、それはsudoしたかのように「whoami」コマンドを実行しているため、「root」であると言うので、一時的に(そのコマンドの期間中に)rootユーザーに見えますが、まだ完全ではない可能性がありますsudoersファイルに応じたルートアクセス。
タコ

1
@Octopus:私が言いたかったのは、Unixでは、プロセスは1つのUIDしか持つことができず、そのUIDがプロセスの許可を決定するということです。「自分がroot権限を持つ」ことはできません。プログラムは、ユーザーのUIDまたはルートのUID(0)で実行されます。
セルゲイ

5
「sudoersファイルによると、まだ完全なルートアクセス権を持っていない可能性があります」:sudoersファイルは、他のユーザーとしてどのコマンドを実行できるかを制御しますが、コマンドが実行される前に発生します。ただし、たとえばrootとしてプロセスを開始することが許可されると、実行中のプロセスはrootのUIDを持ち、システムへの完全なアクセス権を持つため、sudoがそれを制限する方法はありません。繰り返しますが、あなたは常に自分自身またはルートのいずれかであり、「ハーフアンドハーフ」はありません。そのため、sudoersファイルでシェルとしてrootとして実行できる場合、そのシェルでの許可は「通常の」ルートシェルと区別できません。
セルゲイ

36

この答えは、この質問のだましに対する私の答えのだましです。人々がそれを見つけることができるように、ここに標準的な答えを載せてください!

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

  • sudo -iルート環境を提供します~/.bashrc。つまり、あなたは無視されます。
  • sudo -sユーザーの環境を提供するので、あなた~/.bashrcは尊重されます。

以下に例を示しますlsl。私の~/.bin/ディレクトリには、でアクセスできますsudo -sが、ではアクセスできないアプリケーションがありますsudo -i。また、Bashプロンプトは次のように変更されますが、変更されsudo -iませんsudo -s

dotancohen@melancholy:~$ ls .bin
lsl

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ sudo -i

root@melancholy:~# which lsl

root@melancholy:~# exit
logout

dotancohen@melancholy:~$ sudo -s
Sourced .bashrc

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ exit
exit

けれどもが、sudo -sあなたが精通している環境を与えるために便利ですが、私はの使用をお勧めsudo -i二つの理由を:

  1. 「ルート」セッションにいることを視覚的に通知します。
  2. ルート環境は、の不正なラインなど、マルウェアで汚染される可能性がはるかに低い.bashrcです。

sudo -sが/ etc / profile、または/etc/profile.d/にあるものを処理していないようだ。
meffect

@dotancohen- sudo -sユーザーが使い慣れた環境を提供するとはどういう意味ですか?
動機付け

@dotancohen-sudo -sコマンドはすでに視覚的な合図を提供しているので、sudo -iがより良いオプションである理由について私は好奇心m盛です。
動機付け

9

su ユーザー「root」のパスワードを要求します。

sudo自分のパスワードを要求します(また、rootとして設定されたコマンドを実行できるかどうかも確認します。これは/etc/sudoers、デフォルトで「admin」または「sudo」グループに属するすべてのユーザーアカウントにsudoの使用を許可します)。

sudo -sルートとしてシェルを起動しますが、作業ディレクトリは変更しません。 sudo -irootアカウントへのログインをシミュレートします。作業ディレクトリはになり/root、root .profileなどはログイン時のようにソースされます。


1
答えをより完全にするため:sudo -sほぼ等しいsu($ HOMEは異なります)とsudo -i等しいsu -
-DJCrashdummy

@DJCrashdummy-なぜほぼ等しいと言うのですか?何が違うの?
動機

2

Ubuntuまたは関連システムでsuは、従来のスーパーユーザーの意味ではあまり使い道がありません。sudoそのケースをはるかにうまく処理します。ただし、susudoerの構成がばかげている1回限りの状況で別のユーザーになるのには最適です。

たとえば、ライブCD / USBからシステムを修復する場合、ハードドライブやその他の必要なものをchrootシステムにマウントすることがよくあります。このような場合、最初のコマンドは一般的に次のとおりです。

su - myuser  # Note the '-'. It means to act as if that user had just logged in.

そうsudoすれば、私はrootとしてではなく、通常のユーザーとして動作し、適切に使用します。


0
  • su rootパスワードを要求し、rootになり、対話型の非ログインシェルを開きます。
  • su - rootパスワードを要求し、rootになり、対話型ログインシェルを開きます。

  • sudo -s パスワードを要求し、rootになり、対話型の非ログインシェルを開きます。
  • sudo -i パスワードを要求し、rootになり、対話型ログインシェルを開きます。

ベストプラクティスは、これら2つを使用することです。


  • sudo suパスワードsuを要求し、しばらくrootになり、rootとして実行します。
  • sudo su -パスワードを要求し、しばらくrootになり、rootとして実行su -します。

したがって、この場合はをsu使用sudoして実行しているため、rootの実際のパスワードを知る必要はありません。結果はsuおよびと同じsu -です。


ログインシェルと非ログインシェルの違いは何ですか?
パイロット6

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.