いくつかのパラメータを受け入れて他のユーザーとして実行するbashスクリプトがあります。test.sh
#!/bin/bash
sudo su user2 <<'EOF'
echo $1
EOF
ただし、空白で印刷されます。
$ ./test.sh haha
環境変数がリセット(?)されたためであることがわかっています。この主張をどのように伝えることができますか?セキュリティに関しては、環境リセットを無効にしてはいけないと聞きました。この問題を解決するために私が考えることができる唯一の方法は、$1
ファイルに書き込んでからuser2が再度読むことです。しかし、もっと良い方法があるべきだと思います。
答え1
スクリプト全体を別のユーザーとして実行するための一般的なアプローチは、スクリプトの先頭に次のような内容を追加することです。
target_user="foo"
if [ "$(whoami)" != "$target_user" ]; then
exec sudo -u "$target_user" -- "$0" "$@"
fi
ここでは。sudo
代わりに使用するので、この問題なしにパラメータを正しく渡すことは非常に困難です。su
su
sudo
ちょうど小さなコードスニペットを実行したい場合は、次のこともできます。
target_user="foo"
sudo -u "$target_user" sh -s "$@" <<'EOF'
echo "$@"
EOF
これにより起動され、sh
現在のスクリプトのパラメータが渡され、次にheredocを介して提供されたスクリプトが実行されます。
答え2
EOF
引用符の中に入れると、シェルの解釈のecho $1
ために「ここの文書」()を効果的に参照できます。ただし、シェルには位置パラメーターはありません。今はテストできませんが、次のようないくつかのことが機能する可能性があります。$1
user2
引用しないでください
EOF
:sudo su user2 << EOF echo $1 EOF
環境を介して値を渡す:
export my_val="$1" sudo su user2 << 'EOF' echo "$my_val" EOF
答え3
これはうまくいくかもしれません:
#!/bin/bash
su - user2 -c 'echo "$0" "$@"' -- "$@"
二重引用符をエスケープする必要がないように、単純な引用符を使用して'
コマンド引数を渡します。su
"
引用:
su -cで使用するbash関数パラメータをエスケープします。
bash - suが提供するシェルにパラメータを渡す - Think Tank 101 - CC copyrightベースのQ&A共有プラットフォーム