Bash バージョン: GNU bash、バージョン 4.1.2(1)-リリース(x86_64-redhat-linux-gnu)
これはうまくいきます:
#!/bin/bash
exec /usr/local/bin/python2.7 /app/add_container_host.py $@
しかし、特定のユーザーとして実行する必要があるため、次のように変更しました。
#!/bin/bash
su -c '/usr/local/bin/python2.7 /app/add_container_host.py $@' $USER
そして、Pythonスクリプトはもはやパラメータを取得しません。
一重引用符を二重引用符に変更してみました。これはPythonスクリプトの代わりに$@
独自に供給されます。su -c
$@
実行時にこれをPythonスクリプトに渡す方法はありますかsu -c
?
答え1
問題はあなたが使用する引用です。の変数を拡張できるように二重引用符を使用する必要があります$@
。それ以外の場合はリテラルとして残り、拡張されません。
これは例です
$ cat runme.bash
#!/bin/bash
echo "run with double quotes"
su -c "echo $@" user1
echo "run with single quotes"
su -c 'echo $@' user1
$ ./runme.bash "a b c"
run with double quotes
a b c
run with single quotes
$
また、引数リストを引用符で囲まれたリストに渡す必要があります。そうしないと、コマンドはsu -c ...
混乱し、目的のユーザーに2番目の引数を解析しようとしますsu
。
他の例
$ ./runme.bash a b c
run with double quotes
su: user b does not exist
run with single quotes
$
デバッグのヒント
スクリプトが実際に実行する操作を表示するには、を切り替えて-x
実行できますbash
。
$ bash -x ./runme.bash a b c
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a' b c user1
su: user b does not exist
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1
$
引用された主張
$ bash -x ./runme.bash "a b c"
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a b c' user1
a b c
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1
$
答え2
su
引数文字列で適切に拡張されたパラメータに頼るのではなく、シェル位置パラメータをコマンドの引数として渡すことを検討してください-c
。
たとえば、
#!/bin/sh
su testuser -c 'for arg; do echo "$0 ($(whoami)): $arg"; done' -- su "$@"
それから
$ ./suscript foo "bar baz"
Password:
su (testuser): foo
su (testuser): bar baz
答え3
here-doc ブロックにコマンドをラップすると役に立ちます。
#!/bin/sh
su testuser -s /bin/sh <<EOF
add_container_host.py "$@"
EOF
以下のように試してみることもできます。
su testuser -c 'add_container_host.py "$@"' -- argv0 "$@"
それを除いて数を実行また良い選択です。