web-dev-qa-db-ja.com

Sudoでコマンドを実行し、sudoでBashスクリプトを実行します

Sudoでコマンドを実行することとSudoでbashスクリプトを実行することは同じだといつも思っていました。しかし、今日、私はそれらが異なっていることに気づきました。これが私がテストしたものです:

me@my_machine:~$ Sudo echo $(whoami)

ターミナルからコマンドを実行し、出力を取得します:me。このリンクを読んだ後: https://superuser.com/questions/384544/why-does-Sudo-u-root-echo-whoami-not-return-root 、私はこれを理解しています。

次に、test.shという名前のbashスクリプトを作成します。

#!/usr/bin/env bash
echo $(whoami)

そして、次のスクリプトを実行します:Sudo ./test.sh、驚いたことに、出力は次のようになります:root

では、Sudoを使用してコマンドを実行することと、Sudoを使用してBashスクリプトを実行することは異なりますか?

コマンドsを含むwhoamiBashスクリプトがある場合、それをSudoで実行しますか?meの代わりにrootを取得するにはどうすればよいですか?

1
Yves

シェルがコマンドを実行するため

_Sudo echo $(whoami)
_

最初に、Sudoを呼び出す引数を把握する必要があります。 echoは単純な文字列であるため、シェルはそれに対して何もしませんが、$(whoami)は展開する必要のあるコマンド置換です。これは、whoamiを実行し、コマンド置換をその出力に置き換えることによって行われます。これで、Sudoを呼び出す準備が整いました。

これは、Sudoechoと、whoamiの出力(非特権ユーザーとして実行された)を引数として実行されることを意味します。

whoamiwithSudoを実行する場合は、スクリプトに入れて、Sudoを使用してスクリプトを実行できます。 、または使用できます

_Sudo sh -c 'echo "$(whoami)"'
_

ここでは、_sh -c_スクリプトがrootとして実行されるため、whoamiもrootとして実行されます。

ポイントは、whoamiを実行するシェルがrootユーザーとして実行されていることです。

最初のコマンドSudo echo $(whoami)whoamiを実行するシェルは、rootではなく通常のユーザーとして実行されます。

3
Kusalananda