sudo suに環境変数を渡す方法

sudo suに環境変数を渡す方法

デフォルトでは、次のことを行う必要があります。

DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'

これはうまくいきません。環境変数$ DUMMYをsuに渡すには? -p は -l と一緒には使用できません。

答え1

専門家のヒント:走るには決して良い理由はありません。sudo su。他のユーザーとしてコマンドを実行するには、を使用しますsudo -u username command。ルートシェルが必要な場合、sudo -iまたはを実行しますsudo -l。ルートアカウントを有効にすると、単独でsu実行することもできますが、sudo su役に立ちません。はい、どこでも見ることができることを知っています。

つまり、ユーザーのセッションコンテキストを維持するスイッチがsudoあります。-E

 -E, --preserve-env
        Indicates to the security policy that the user wishes to preserve 
        their existing environment variables.  The security policy may
        return an error if the user does not have permission to 
        preserve the environment.

したがって、最初に変数をエクスポートしてから次のように実行する必要がありますsudo -E

$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy

不要bash -c。ただし、実行すると、sudo -Eu bob echo "$DUMMY"ルートシェルを起動する前に変数が拡張されるため、コマンドが実際に機能していることを証明できません。

$ sudo -u bob echo $DUMMY  ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY'  ## works as expected
D:dummy

答え2

ログインシェルを呼び出すことなくこれを行うことができます。

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'

または:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'

このコマンドは環境変数のオプションを保持します-psu

答え3

-Eは私のために仕事をします。男たちsudoから――

-E--preserve-env
ユーザーが既存の環境変数を保持したいセキュリティポリシーを表します。ユーザーが環境を保護する権限を持っていない場合、セキュリティポリシーはエラーを返す可能性があります。

答え4

私もこの問題に遭遇し、環境変数を設定ファイルにエクスポートして問題を解決しました。以下は私のサンプルコードです。

echo export runner_token=$(echo $resp_json | jq -r '.token') >> /etc/profile
su -p - ubuntu -c '$HOME/actions-runner/config.sh --url https://github.com/${gh_repo_user}/${gh_repo_name} --token "$runner_token"  --name MAC-AWS-RUNNER --labels ${gh_runner_labels}'

関連情報