私はいつもコマンドを実行するのとsudo
bashスクリプトを実行する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
取得できますか?me
root
答え1
$(whoami)
この回答では、質問に示されているコマンド置換を実行するユーザーについて説明します。実際、この設定はそれ自体で現在のユーザーのユーザー名を出力する正しい方法なので、echo $(whoami)
絶対に使用されないことを願っています。whoami
echo
コマンド置換をまったく呼び出す必要はなく、場合によっては必要になる場合があります。調整コマンド置換のコマンド出力です。使用しないでくださいecho $(...)
。
実行すると、whoami
問題のある権限を持たないユーザーのユーザー名が印刷され、sudo whoami
出力されますroot
。
シェルにコマンドを実行させる
sudo echo $(whoami)
まず、どのパラメータを呼び出すかを知る必要がありますsudo
。 echo
は単純な文字列なので、シェルはこれを使用して何もしませんが、$(whoami)
拡張コマンドの置き換えが必要です。コマンド置換を実行しwhoami
、それを出力に置き換えてそれを実行します。それではと呼ぶことができますsudo
。
これは、(無許可のユーザーとして実行されます)の出力が引数として実行されることを意味しsudo
ます。echo
whoami
whoami
コマンド置換内で実行するにはそして sudo
、スクリプトに入れて、sudo
以前と同じように実行スクリプトを使用するか、次のインラインスクリプトを使用できます。
sudo sh -c 'echo "$(whoami)"'
ここでsh -c
スクリプトはrootとして実行されているので、whoami
rootとしても実行されます。
ポイントは実行中のシェルwhoami
rootユーザーとして実行します。
whoami
最初のコマンドで実行されたシェルは、sudo echo $(whoami)
rootユーザーではなく通常のユーザーとして実行されます。