Sudoでコマンドを使用すると、環境変数は表示されません。例えばHTTP_PROXYを設定した後、コマンドwget
はSudo
がなくても正常に機能します。ただし、Sudo wget
と入力すると、プロキシ設定を回避することはできません。
トリックは、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"
まず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.
個別の変数を個別に使用可能にしたい場合は、それをコマンドの一部にすることができます。
Sudo http_proxy=$http_proxy wget "http://stackoverflow.com"
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"
環境変数をスクリプトに保持する必要がある場合は、このような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