他のユーザーが実行するコマンドに引数を渡す

他のユーザーが実行するコマンドに引数を渡す

いくつかのパラメータを受け入れて他のユーザーとして実行する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代わりに使用するので、この問題なしにパラメータを正しく渡すことは非常に困難です。sususudo

ちょうど小さなコードスニペットを実行したい場合は、次のこともできます。

target_user="foo"
sudo -u "$target_user" sh -s "$@" <<'EOF'
  echo "$@"
EOF

これにより起動され、sh現在のスクリプトのパラメータが渡され、次にheredocを介して提供されたスクリプトが実行されます。

答え2

EOF引用符の中に入れると、シェルの解釈のecho $1ために「ここの文書」()を効果的に参照できます。ただし、シェルには位置パラメーターはありません。今はテストできませんが、次のようないくつかのことが機能する可能性があります。$1user2

  • 引用しないでください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共有プラットフォーム

関連情報