centos7にbashスクリプトがあり、他のユーザーとしていくつかのコマンドを実行する必要があります。ただし、sudo
関数の外では期待どおりに機能しますが、bash関数の内部では機能しないようです。次のようにスクリプトを実行します。ssh [email protected] 'bash -s' < script.sh
test(){
sudo -Eu root bash
echo "inside $(whoami)"
# other commands ...
}
test
sudo -Eu root bash
echo "outside $(whoami)"
次のように実行してください。
ssh [email protected] 'bash -s' < script.sh
印刷:
outside root
inside centos
root
ユーザは再現性の例として提供される。この結果の理由は何ですか?別のユーザーとして関数内で複数のコマンドを実行するには?
ベストアンサー1
これをしないでください。
間違った順序で2行の出力を取得した場合は、何かが間違っていることを示唆する必要があります。
以下を使用してスクリプトを実行するとき
ssh [email protected] 'bash -s' < script.sh
次のようなことが発生します。
- スクリプトは
bash -s
シェルの標準入力ストリームに渡されます。 - スクリプトは
test
関数を定義して呼び出します。 sudo bash
関数のコマンドはルートシェルを起動します。- このシェルはスクリプトである標準入力ストリームを継承します。
- ルートシェルは関数呼び出しの後からスクリプトを読み続けます。これは現在ストリームがある場所なので実行されます。
これで、関数内で呼び出し後にコマンドを実行するtest
ルートシェルが起動しました。test
- 標準入力ストリーム(つまりシェルスクリプトストリーム)を継承する2番目のルートシェルを起動します。
これで、centos
ルートシェルを実行し、ルートシェルを実行するシェルが作成されました。
- 2番目のルートシェルは、スクリプトの最後の行である
echo "outside $(whoami)"
出力を実行します。outside root
- これ以上読み取ることができないので、2番目のルートシェルは終了します。
- 最初のルートシェルも同様です。
- 元
bash -s
のシェルが実行されecho "inside $(whoami)"
(以前に実行を開始した関数の一部であるため)inside centos
。 - シェル関数呼び出しが終了し、両方のルートシェルがスクリプトの残りの部分を読み取ったので、元のシェルはもう何も読み取る必要はなく、終了します。
sudo
他のコマンドを実行したり、対話型シェルを起動したりするために厳密に使用されます。ユーザーが行った変更は他のコマンドにのみ適用されます。コマンドが終了すると、元のユーザーに復元されます。スクリプトの途中で「別のユーザーに切り替える」を使用してから、スクリプトの一部を他のユーザーとして実行することはできませんsudo
(もちろん意図的に上記から解いた奇妙な方法で実行するスクリプトを作成します。ただし、このコーディングは難読化されたコード競合の一部です。
スクリプトからrootとしてコマンドセットを実行するには、呼び出しにコマンドを提供する必要がありますsudo
。たとえば、
sudo bash -c 'echo "Now running as $USER"; echo "whoami outputs $(whoami)"'
コマンドが終了すると、sudo bash -c
元のユーザーに復元されます。いつも。