web-dev-qa-db-ja.com

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

Sudoを使用して、Ubuntuで実際のrootユーザーとしてコマンドを実行するにはどうすればよいですか?実行するまで、これが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
Cerin

実際、それはdoes rootとして実行します。しかし、あなたに起こっていることは、バックティックが評価されているということですbeforeSudoは、コマンドを評価するために必要なので、実行されます。もっと直接的に、なぜこれだけではないのですか?

Sudo whoami

バックティックのwhoamiは、実際には現在のユーザーとしてサブシェルで評価されます。そのため、自分が何をしているかがわかります。

26
FatalError

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

tmpvar=`whoami`
Sudo echo "$tmpvar"
7
Kevin

ここでいくつかの推測が起こっているようです…

バックティックは明らかに他の人が説明したことを実行しており、「Sudo」を呼び出す前にwhoamiを展開し、予想どおりバックティックを「root」に戻します。

しかし、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として動作するのとは異なる動作をする可能性があるため、少し奇妙に思えます。

1
Jan Steinman

Sudoを使用すると、root権限で任意のコマンドを実行できますが、rootユーザーとしては実行できません。これが役立つ理由は、この設定では複数の人がルート権限を持つことができますが、すべてのログなどは誰が変更を行ったかを示しているためです。

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

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

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

0
Manfred Moser