「sudo -u root echo `whoami`」がrootを返さないのはなぜですか?


11

Ubuntuで実際のrootユーザーとしてコマンドを実行するには、sudoをどのように使用しますか?私が最初に実行するまで、これはsudoのデフォルトの動作だと思っていました:

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

ただし、これは私が望む動作のタイプですが、1行のみです。

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root

11
なぜエコーwhoami?sudo whoami ..がrootを返すと言ってください
Neo

回答:


26

実際に、ルートとして実行されます。ただし、バックティックはコマンドを評価するために必要であるため、実行 に評価さsudoれています。より直接的に、なぜこれだけではないのですか?

sudo whoami

あなたのwhoami中のバックチック実際にあなたが何を見る理由は、現在のユーザーとしてサブシェルで評価されます。


2
これは間違っています。sudoはroot権限で実行されますが、rootとしては実行されません。
Manfred Moser、2012年

@モーザー、それではなぜ彼のコマンドは「ルート」を出力するのですか?
セリン

4
@ManfredMoser:(0ゼロ)のUIDで実行されます。これは、まさに「ルート」と呼ばれるものです。(実際にUIDを変更せずに機能sudo拡張しただけで問題はありませんでした。しかし、それはそうではありません。)
user1686

1
M. Moser 、set-UID がプロセスの有効なユーザーID のみを変更することを指摘していた可能性があり、実際にsudoは、プロセス自体が実際のユーザーIDを変更する必要があります。しかし、xyrの回答を読むと、これは実際にはそうではなかったようです。
JdeBP 2012年

7

サブシェル(whoami)が最初に実行され、結果(myuser)がsudoコマンドに配置されます。sudo見えるものはecho myuser。それを以下のショートカットと考えてください:

tmpvar=`whoami`
sudo echo "$tmpvar"

1

ここでいくつかの疑わしいことが起こっているようです…

バッククォートは明らかに他の人が説明したことを行ってwhoamiおり、 'sudo'を呼び出す前に拡張し、期待どおりにバックティックをオフのままにします。

しかし、sudo(8)で実際に起こっていることを理解することは役に立ちます。だから私は実際にmanページを見ました!

「実際の有効なuidとgidは、ターゲットユーザーのものと一致するように設定されています...」

したがって、観察された動作は、有効なユーザーIDと実際のユーザーIDの違いとは関係がないようです。

「sudo printenv」を実行して、単に「printenv」と比較することもまた実例であり、実際に少し驚いた。[i]一部[/ i]のエクスポートされた変数が利用可能で他は利用できないことを示しています:呼び出しユーザーのHOME、PATH、PS1、SHELL、TERM、およびEDITORを報告しますが、MANPATH、CVSROOT、LD_LIBRARY_PATH、またはENV。プログラムが元のユーザーまたはrootとして動作する場合とは異なる動作をする可能性があるため、これは少し奇妙に思えます。


0

sudoを使用すると、rootユーザーとしてではなく、root権限で任意のコマンドを実行できます。これが便利な理由は、この設定では複数のユーザーがroot権限を持つことができるにもかかわらず、すべてのロギングなどが誰が変更を行ったかを示すためです。

この設定は、ルートパスワードを共有するよりも優れています。そのため、Ubuntuを含む多くのディストリビューションでrootユーザーを持つことは置き換えられました。

一方、sudo suはrootユーザーになるため、実際には使用しないでください。

この違いは、観察された(正しい)動作も説明します。


6
いいえ。動作を説明するのは、シェルでのコマンド置換がどのように機能するかという非常に単純な問題です。特権とは何の関係もありません。
JdeBP 2012年

-2

Sudoは、一時的に、自分が誰であるか(そもそもsudoが許可されている場合)にrootレベルの特権を付与します。

rootになるには、デフォルトでUbuntuでブロックされているrootとしてログインする必要があります。

これには注意が必要です。sudoはrootではありません。Fredがsudoとして何かを実行していることを示したい場合、SUDO環境変数をche3dする場合、SUDO_COMMANDが最も便利です。


ルートはUbuntuでブロックされていますか?よろしいですか?私はそれが推奨されないことを知っていますが、通常の方法で変更できるUUIDを使用してあいまいなパスワードを実際に設定することで、初心者が少し難しくするだけだと思いました。
Marty Fried、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.