2013-07-20 19 views
55

すでに別のユーザーとしてコマンドを実行している場合は、some existing questionsがここにあります。しかし、質問と回答は、コマンドの長いグループではなく、という単一のコマンドに焦点を当てています。例えばBashで別のユーザーとしてコマンドのグループを実行する方法は?

、次のスクリプトを考えてみます。ここで注意すべき重要なポイントのカップルがあります

#!/bin/bash 
set -e 

root_command -p param1 # run as root 

# these commands must be run as another user 
command1 -p 'parameter with "quotes" inline' 
command2 -p 'parameter with "quotes" inline' 
command3 -p 'parameter with "quotes" inline' 

を:

  • 最後の3つのコマンドはsuかを使用して別のユーザーとして実行する必要がありますsudo。この例では3つのコマンドがありましたが、もっと多くのものがあったとします。

  • コマンド自体には一重引用符と二重引用符が使用されています。上記

第二の点は、次の構文を使用することを防ぐ:

su somebody -c "command" 

...コマンド自体は引用符が含まれているため。

コマンドを「グループ化」して別のユーザーアカウントで実行する適切な方法は何ですか?

+1

Unixスタックエクスチェンジで不運? – icedwater

+0

も参照してください。http://stackoverflow.com/questions/37586811/pass-commands-as-input-to-another-command-su-ssh-sh-etc/37586820#37586820 – tripleee

答えて

125

これを試してみてください:

su somebody <<'EOF' 
command1 -p 'parameter with "quotes" inline' 
command2 -p 'parameter with "quotes" inline' 
command3 -p 'parameter with "quotes" inline' 
EOF 

<<は、ここにdoc-を導入しています。次のトークンは区切り文字であり、区切り文字で始まる行までのすべてが標準入力としてコマンドに与えられます。デリミタを一重引用符で囲むことで、here-doc内での変数の置換が防止されます。

+0

あなたは、天才です。私はHEREDOCの使用を考えていましたが、正しい構文を見つけることができませんでした。ありがとう! –

+0

なぜ '-c'フラグは不要ですか? '-c'がなければ、パーミッションが拒否されました。 – rightfold

+0

'-c'はコマンドが標準入力から読み込まれるのではなく、引数として提供されるときに使用されます。 – Barmar

5

がよりエレガントな方法であることがバインドされているが、私は、例えば

を複数のスクリプトを使用して、過去にこの問題に近づき、「ドライバー」しましたので、私はbashの-fooでその素晴らしいではありませんよ

ドライバー

#!/bin/bash 
set -e 

su root script1 
su somebody script2 

SCRIPT1

#!/bin/bash 
set -e 

root_command -p param1 # run as root 

スクリプト2

#!/bin/bash 
set -e 

# these commands must be run as another user 
command1 -p 'parameter with "quotes" inline' 
command2 -p 'parameter with "quotes" inline' 
command3 -p 'parameter with "quotes" inline' 
0

このスクリプトは、スクリプトを実行している現在のユーザーが目的のユーザーであるかどうかを確認します。そうでない場合、スクリプトは所望のユーザと再実行される。

#!/usr/bin/env bash 

TOKEN_USER_X=TOKEN_USER_X 
USER_X=peter # other user! 

SCRIPT_PATH=$(readlink -f "$BASH_SOURCE") 

if [[ "[email protected]" != "$TOKEN_USER_X" ]]; then 

    ###### RUN THIS PART AS the user who started the script 

    echo "This script is $SCRIPT_PATH" 

    echo -n "Current user: " 
    echo $USER 

    read -p "insert: " 
    echo "got $REPLY" 

    su - $USER_X -c "$SCRIPT_PATH $TOKEN_USER_X" # execute code below after else (marked #TOKEN_USER_X) 

else 
    #TOKEN_USER_X -- come here only if script received one parameter TOKEN_USER_X 

    ###### RUN THIS PART AS USER peter 

    echo 
    echo "Now this script is $SCRIPT_PATH" 

    echo -n "Current user: " 
    echo $USER 

    read -p "insert: " 
    echo "got $REPLY" 

    exit 0 
fi 

echo 
echo "Back to initial user..." 
echo -n "Current user: " 
echo $USER 
関連する問題