回答:
別の方法は、完全なbashコマンドをに渡すことsudo
です。
#!/bin/bash
sudo bash -c 'command1; command2; command3;'
ただし、より良い方法は、代わりにスクリプトを起動するsudo
ことです。sudo
スクリプトの中に入れるのはあまり良い考えではありません。root権限(sudo script.sh
)でスクリプト全体を実行する方がはるかに優れています。必要に応じて、を使用sudo
して特定のコマンドの特権を削除できます。例えば:
#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami ## drop privileges for specific command.
上記のスクリプトを実行すると、次が返されます。
$ sudo ~/scripts/a.sh
root
/root
terdon
Bourneシェルではあり-c
ますが、あなたのような何かを書くことができるように、シェルに任意のスクリプトを渡すために使用できるフラグ
sudo sh -c 'something'
ただし、これは最も単純なコマンドにのみ役立ちます。スクリプトを正しく引用するのは非常に面倒であり、sshを介してリモートサーバーにコマンドを送信すると、引数のスクリプトが2回分析されるため、不便さがさらに大きくなります。スクリプトを送信し、スクリプトを実行する側で1回。
something
が複雑なスクリプトである場合、またはssh行を介して渡される必要がある場合は、標準出力にprepare_something_script
「何か」のスクリプトを書き込むことを目的とする関数を作成するのが一般的です。最も簡単な形式では、この関数はヒアドキュメントを使用して出力を生成できます。
prepare_something_script()
{
cat <<EOF
something
EOF
}
によって生成されたスクリプトprepare_something_script
は、sudoによって次のように付与された特権でローカルに実行できます。
prepare_something_script | sudo sh
スクリプトをsudoによって付与された特権を使用してリモートで実行する必要があるシナリオでは、次のように、スクリプトをbase 64でエンコードしてsshの標準入力のリダイレクトを回避するのが慣例です。
something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"
関数でそのコードを使用する場合は、something64変数をローカルとしてマークすることを忘れないでください。base64の一部の実装は-d
、デコードするフラグを提供します。これは、詳細な--decode
バリアントよりもサポートが不十分です。一部の実装では、-w 0
誤った改行を回避するために、エンコーディングコマンドにを追加する必要があります。
sudo -s
場合にのみ使用するのは適切ではありませんroot
。これは実際sudo sh
には、どのシェルを使用するかを明示的に示しているはずです。