sudo を使用してコマンドを実行し、sudo を使用して Bash スクリプトを実行します。

sudo を使用してコマンドを実行し、sudo を使用して Bash スクリプトを実行します。

私はいつもコマンドを実行するのとsudobashスクリプトを実行するsudoことが同じだと思いました。しかし、今日私は彼らが異なることを発見しました。私がテストした内容は次のとおりです。

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

端末でコマンドを実行して出力を取得しますme。このリンクを読んだ後:「sudo -u root echo whoami」がルートを返さない理由、私はこれを理解しています。

次に、次のようなbashスクリプトを作成しますtest.sh

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

このスクリプトを実行しましたが、驚くべきことに、sudo ./test.sh出力は次のようになりますroot

sudoそれでは、Bashスクリプトを実行するのとはsudo異なるコマンドを実行していますか?

コマンドを含むBashスクリプトがあり、whoamiそれを使用して実行する場合は、代わりにどのようにsudo取得できますか?meroot

ベストアンサー1

$(whoami)この回答では、質問に示されているコマンド置換を実行するユーザーについて説明します。実際、この設定はそれ自体で現在のユーザーのユーザー名を出力する正しい方法なので、echo $(whoami)絶対に使用されないことを願っています。whoami

echoコマンド置換をまったく呼び出す必要はなく、場合によっては必要になる場合があります。調整コマンド置換のコマンド出力です。使用しないでくださいecho $(...)

実行すると、whoami問題のある権限を持たないユーザーのユーザー名が印刷され、sudo whoami出力されますroot


シェルにコマンドを実行させる

sudo echo $(whoami)

まず、どのパラメータを呼び出すかを知る必要がありますsudoechoは単純な文字列なので、シェルはこれを使用して何もしませんが、$(whoami)拡張コマンドの置き換えが必要です。コマンド置換を実行しwhoami、それを出力に置き換えてそれを実行します。それではと呼ぶことができますsudo

これは、(無許可のユーザーとして実行されます)の出力が引数として実行されることを意味しsudoます。echowhoami

whoamiコマンド置換内で実行するにはそして sudo、スクリプトに入れて、sudo以前と同じように実行スクリプトを使用するか、次のインラインスクリプトを使用できます。

sudo sh -c 'echo "$(whoami)"'

ここでsh -cスクリプトはrootとして実行されているので、whoamirootとしても実行されます。

ポイントは実行中のシェルwhoamirootユーザーとして実行します。

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

おすすめ記事