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


回答:


39

ログインシェルを呼び出さずに実行できます。

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

または:

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

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


3
私は「-E」プリザーブ環境変数が考えるsudo.ws/man/sudo.man.html
アンディを

1
@Andyしかし、sudoの設定によってしばしば禁止されています。
ジル 'SO-悪であるのをやめる'

@cuonglm-ありがとう。これは動作します。ログインシェルを呼び出すべきではありません。
ウマン

1
@kenorb:いいえ、-pのオプションでありsuません、sudoこの場合には
cuonglm

-m変数を保存するという他のスレッドがあり-c、違いは何ですか?そして、この答えの日にコメントの1 -E stackoverflow.com/questions/10488758/...
Vishrant

49

プロのヒント:実行する正当な理由はありません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
環境変数を保存するためのより良い方法は、それを追加することですenv_keepの中でsudoers。おそらく次のようになりますDefaults env_keep += "DUMMY"
lcd047

@ lcd047しかし、それはのすべての呼び出しに対して環境を保存しますsudo。また、単一の変数の場合は面倒です。これは、常にエクスポートする必要がある場合にのみ役立ちます。
テルドン

はい、それはトレードオフですが、すべての環境変数が等しく有害であるわけではありません。オーバー運ぶ間に実質的な差がありますLD_PRELOADし、オーバー運んでLESSCHARDEF。ここでは、便利さを勝ち取った議論とは思わない
...-lcd047

1
@ lcd047あなたの提案は確かに答えとして投稿する価値があります。私のポイントは、任意の変数をエクスポートするのは実用的ではないということです。はい、常にエクスポートしたい特定の変数がある場合、これは進むべき方法ですが、同じセッションで定義された変数に対して一度だけ実行したい場合はそうではありません。
テルドン

7

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

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


残念ながら、管理者が-Eの使用を制限していない場合にのみ、ジョブを実行します。
-TorstenS

0

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

su--userオプションを使用できるため、この部分は無視しますsudo

command介して実行に環境変数を渡しますsudo。ただし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
"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.