web-dev-qa-db-ja.com

Sudoを使用するときに環境変数を保持する方法

Sudoでコマンドを使用すると、環境変数は表示されません。例えばHTTP_PROXYを設定した後、コマンドwgetSudoがなくても正常に機能します。ただし、Sudo wgetと入力すると、プロキシ設定を回避することはできません。

366
Ahmed Aswani

トリックは、Sudo visudoコマンドを介してsudoersファイルに環境変数を追加し、以下の行を追加することです。

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

ArchLinux wiki から取られています。

Ubuntu 14では、多変数行に対してエラーを返すので、別々の行に指定する必要があります。

Defaults  env_keep += "http_proxy"
Defaults  env_keep += "https_proxy"
Defaults  env_keep += "HTTP_PROXY"
Defaults  env_keep += "HTTPS_PROXY"
283
Ahmed Aswani

まずexport HTTP_PROXYが必要です。次に、man Sudoを注意深く読み、-Eフラグに注意を払う必要があります。これは動作します:

$ export HTTP_PROXY=foof
$ Sudo -E bash -c 'echo $HTTP_PROXY'

これがmanページからの引用です。

-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.
421

個別の変数を個別に使用可能にしたい場合は、それをコマンドの一部にすることができます。

Sudo http_proxy=$http_proxy wget "http://stackoverflow.com"
48
buckaroo1177125

Ahmed Aswaniの答えにある2つのenv_keepステートメントを、次のように単一のステートメントにまとめることもできます。

Defaults env_keep += "http_proxy https_proxy"

次のように1つのコマンドだけにenv_keepを指定することも検討してください。

Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"

21
Stian S

環境変数をスクリプトに保持する必要がある場合は、このようなhereドキュメントにコマンドを配置できます。特に、物事を設定する変数がたくさんある場合は、このように整然と見えます。

# prepare a script e.g. for running maven
runmaven=/tmp/runmaven$$
# create the script with a here document 
cat << EOF > $runmaven
#!/bin/bash
# run the maven clean with environment variables set
export ANT_HOME=/usr/share/ant
export MAKEFLAGS=-j4
mvn clean install
EOF
# make the script executable
chmod +x $runmaven
# run it
Sudo $runmaven
# remove it or comment out to keep
rm $runmaven
0
Wolfgang Fahl