web-dev-qa-db-ja.com

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

私は基本的にこれを行う必要があります:

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

これは機能しません。どうすれば環境変数$ DUMMYをsuに渡すことができますか? -pは-lと一緒には機能しません。

38
Umang

ログインシェルを呼び出さずにそれを行うことができます:

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

または:

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

suコマンドの-pオプションは、環境変数を保持します。

46
cuonglm

プロのヒント: 実際にSudo suを実行する十分な理由はありません 。別のユーザーとしてコマンドを実行するには、Sudo -u username commandを使用します。ルートシェルが必要な場合は、Sudo -iまたはSudo -lを実行します。 rootアカウントを有効にしている場合は、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
53
terdon

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

-E--preserve-env
ユーザーが既存の環境変数を維持することを望むセキュリティポリシーを示します。ユーザーが環境を保持する権限を持っていない場合、セキュリティポリシーはエラーを返すことがあります。

7
Amit Jha

以下は、セキュリティポリシーを変更する必要がないソリューションです。

suの部分は無視します。--userオプションSudo

command経由でSudo runに環境変数を渡したいと思います。ただし、Sudoでは、環境変数をコマンドに渡すことができません(これには有効なセキュリティ上の理由があり、一部の変数は危険な場合があります)。シェルを使用して環境変数を設定でき、Sudoはスクリプトを渡してシェルを実行できます。したがって、Sudoに環境変数を設定するスクリプトを実行するように伝えます。

var_a=someThing
var_b=someOtherThing

Sudo bash -c "
    export var_a=\"${var_a}\"
    export var_b=\"${var_b}\"

    the_command some_args
"
0
ctrl-alt-delor