web-dev-qa-db-ja.com

sudoを使用して別のユーザーとしてbashサブシェルで一連のコマンドを実行するにはどうすればよいですか?

私は複数のコマンドをSudoする必要があるbashスクリプトを書いています。私がすることができます:

( whoami ; whoami )

しかし、私はこれを行うことができません:

Sudo ( whoami ; whoami )

どうすればこれを解決できますか?

39
qrest

Sudo内でシェルを実行:Sudo bash -c 'whoami; whoami'

単一引用符内では、'自体を除く任意の文字を使用できます。そのコマンドで本当に単一引用符が必要な場合は、'\''を使用します(技術的には、単一引用符リテラルの終了、リテラル'文字、単一引用符付きのリテラルの開始ですが、これは効果的な方法です一重引用符で囲まれたリテラル文字列に一重引用符を挿入します)。

コマンドを標準入力としてSudo'ed bashに hereドキュメント で渡すことができます:

Sudo bash <<"EOF"
whoami
id
EOF

このようにすると、特に複数のレベルがある場合など、正しい引用をいじる必要がありません。

Sudo bash <<"EOF"
whoami
echo $USER ~
Sudo -u Apache bash <<"DOF"
whoami
echo $USER ~
DOF
EOF

生成する:

root
root /root
Apache
apache /usr/share/httpd

(内側のターミネータはインデントできないことに注意してください。行内で単独にする必要があります。ヒアドキュメントでインデントを使用する場合は、<<-の代わりに<<を使用できますが、スペースではなくタブでインデントする必要があります。)

56

たとえばこれを試して、私はそれをテストしました:

Sudo bash -c "cd /;ls;ls|grep o"

この例では、最初にdirを/ rootに変更し、次にルートディレクトリを一覧表示し、最後にルートディレクトリの場合、名前が「o」の文字を持つディレクトリのみをフィルタリングします。

しかし、私がより良い方法は、必要なすべてを実行し、すべての複雑なアクションに終了コードを与えるスクリプトを作成することです。次に、上の例のように単一のコマンドのグループの代わりにSudoスクリプトを使用できます。

3
Znik