「sudo su-」と「sudo -i」と「sudo / bin / bash」-どちらが使用されるか、または何が問題になるか


254

ルートを何十回も続けて入力する必要がある場合は、セッションをルートセッションに切り替えます。私は、インターネット上で使用されてきた様々なチュートリアルや指示では、私が見るsudo susudo su -sudo -iおよびsudo /bin/bashルートセッションを開くために使用されているが、私はこれらのときまたはその差が重要かの違いに明確ではありませんよ。

誰かが私のためにこれをクリアできますか?


11
sudo -sとについて質問するのを忘れましたsudo su
ラドゥラデアヌ




3
@RaduRădeanu私が質問をタイプしたとき、私は提案された質問をレビューしましたが、私の質問全体に実際に答えた人はいませんでした。リンクした質問にも同じことが言えます。それらには私のための多くの新しい情報が含まれていますが、それらにリンクしてくれてありがとう、以下の答えのユーザーの混乱が提供するほど完全ではないことがわかりました。
ポール

回答:


325

これを説明するには、プログラムが何をするのかを知る必要があります。

  • su-このコマンドsuは、別のユーザー(s witch u ser)に切り替えるために使用されますが、パラメーターを指定せずにコマンドを呼び出すことでrootユーザーに切り替えることもできます。suユーザーの環境に切り替えたパスワードを入力した後、切り替えるユーザーのパスワードを尋ねます。
  • sudo- sudoルート権限で単一のコマンドを実行することを意味します。しかし、とは違ってsu、それは現在のユーザーのパスワードを入力するように求められます。このユーザーは、sudoersファイル(またはsudoersファイルにあるグループ)に存在する必要があります。デフォルトでは、Ubuntuは15分間パスワードを「記憶」しているため、毎回パスワードを入力する必要はありません。
  • bash-コンピューターと対話するためのテキストインターフェイス。ログインシェル、非ログインシェル、インタラクティブシェルと非インタラクティブシェルの違いを理解することが重要です。

シェルの種類:

  • ログインシェル:ログインシェルは、指定されたユーザーとしてシステムにログインします。これにはユーザー名とパスワードが必要です。あなたがヒットするとctrl+ alt+のF1仮想端末にログインするために、あなたは成功したログインログインシェルの後に取得します。
  • 非ログインシェルログインせずに実行されるシェル。これに必要なのは、現在ログインしているユーザーです。gnomeでグラフィックターミナルを開くと、非ログインシェルになります。
  • interactive shell:コマンドを対話的に入力または中断できるシェル(ログインまたは非ログイン)。たとえば、gnomeターミナル。
  • 非対話型シェル:おそらく自動化されたプロセスから実行される(サブ)シェル。入力も出力も表示されません。

ケースは次のとおりです。

  • sudo susudoコマンドで呼び出しますsu。Bashは、対話型の非ログインシェルと呼ばれます。したがって、bashは実行のみを行い.bashrcます。ルートに切り替えた後も同じディレクトリにいることがわかります。

    user@host:~$ sudo su
    root@host:/home/user#
  • sudo su -今回はログインシェルであるため/etc/profile.profile.bashrcが実行され、ルートのホームディレクトリにルートの環境が表示されます。

  • sudo -isudo su --i(初期ログインのシミュレーション)オプションは、ターゲットユーザーのパスワードデータベースエントリで指定されたシェルをログインシェルとして実行するのとほぼ同じです。これは、次のようなログイン固有のリソースファイルことを意味し.profile.bashrcまたは.loginシェルによって読み込まれて実行されます。

  • sudo /bin/bashこれはsudo、コマンドで呼び出すことを意味します/bin/bash/bin/bash非ログインシェルとして起動されるため、すべてのドットファイルは実行されませんが、bash自体.bashrcが呼び出しユーザーを読み取ります。環境は変わりません。あなたの家は根の家ではありません。したがって、あなたはルートですが、呼び出しユーザーの環境にいます。

  • sudo -s$SHELL変数を読み取り、コンテンツを実行します。$SHELL含まれ/bin/bashている場合は呼び出しますsudo /bin/bash(上記を参照)。

小切手:

ログインシェルにいるかどうかを確認するには(shopt組み込みコマンドであるためbashでのみ動作します):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

18
明確化:sudo許可されたユーザーがスーパーユーザーまたは別のユーザーとしてコマンドを実行できるようにします。とにかく、あなたの努力のために+1。
ラドゥラデアヌ

2
@chaosこの素晴らしい答えをありがとう!それはほとんど私の質問に答えるので、先に進み、質問に答えたとマークしましたが、特定のシェルを実行することがいつ望ましいかを理解していません。私は本当にコマンドラインでUbuntuを使用していrootますが、ユーザーセッションを開くための最も一般的な使用sudo方法はroot、新しいものをインストールするときやメジャーな再構成を実行するときなど、権限を頻繁に使用する必要がある場合です。私はを使用してきましたがsudo /bin/bash、どうやらその方法は理解できない何らかの理由で悪いラップを持っているようです。
ポール

2
また、suはスーパーユーザーではなくユーザー切り替えを表していると言う方が「正しい」です。すなわち、phpスクリプトを実行します。suwww-data /usr/share/script.phpまたは対話型シェルの場合は単にsu www-dataです。ただし、ユーザー名のないsuでは、ルート(スーパーユーザー)アカウントが想定されます。
忘却14

カオス-「shopt -q login_shell && echo 'Login shell' || echo 'No login shell'」よく見かけるこれらの種類の提案ですが、なぜそんなに長くするのですか?&&演算子は、終了コード0の場合は「次のコマンドを実行する」ことを意味し、二重パイプ(||)は、他の(0でない場合は)このコマンドを実行することを意味します。基本的に、終了コード0で「ログインシェル」をエコーし​​、終了コード1(失敗)で「ログインなし」をエコーすると、基本的に何が言いますか。なぜ「shopt -q login_shell; echo $?」$?は、先行コマンドの結果/終了コードを意味します。すべてではないにしても、ほとんどのプログラムでは、0は成功を意味し、1つ以上は失敗を意味します。だから、エコーが... 0 =成功である場合
oblivian

2
@Paul:sudo -iが推奨されます。ここで読む:ubuntuforums.org/showthread.php?t=1817402、ここで:unix.stackexchange.com/questions/98531/...
マルコ・スッラ

0

違いを探すには、異なる呼び出し間で結果の環境を叩くかもしれません。

いくつかの重要な変数には、いくつかの「小さな」違いがあります。

  • PATHLD_LIBRARY_PATHLD_PRELOAD

または〜/の違い。ドットファイル処理(~/.config)。

コマンドが生成する$ HOMEベースのログファイル(~/.xsession.errorsなど)またはxauth Cookie(~/.Xauthority)の所有権も考慮してください。

これらのコマンドを試してください:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)

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