2011-12-26 19 views
295

sudoで任意のコマンドを使用する場合、環境変数は存在しません。たとえば、HTTP_PROXYを設定した後、wgetというコマンドは、sudoなしで正常に動作します。しかし、私がsudo wgetと入力すると、プロキシの設定をバイパスすることはできません。SUDO使用時に環境変数を保持する方法

+0

http://superuser.com/questions/232231/how-do-i-make-sudo-preserve-my-environment-variables –

+1

関連:[須藤とsuコマンド経由で実行しているのに、なぜ異なるPATH変数です?](http://unix.stackexchange.com/q/8646/21471)UnixのSEで-Eを作るために、アーチのための例示パックマンのためにいくつかの設定ファイルを変更している – kenorb

答えて

242

トリックはsudo visudoコマンドでsudoersファイルに環境変数を追加し、これらの行を追加することです:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy" 

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

Defaults env_keep += "http_proxy" 
Defaults env_keep += "https_proxy" 
Defaults env_keep += "HTTP_PROXY" 
Defaults env_keep += "HTTPS_PROXY" 
+10

これはおそらく、情報漏洩とセキュリティホールを避けるための最良の選択肢です。 'sudo -E'は一回限りの効果を得るための確実な方法ですが、 – sehe

+0

私はsudo(jhbuild)を呼び出すプロセスの問題に遭遇しました。 sudoには-Eフラグが付いているので、これは私の解決策です。 – jgomo3

+42

'etc/sudoers'を直接決して編集しないでください。代わりに、 'sudoers'ファイルを上書きする前にあなたの編集を構文検査する' visudo'コマンドを使用してください。そうしておけば、編集中に間違えてしまっても、あなた自身をロックアウトすることはありません。 – Henning

322

まず、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 reserve their 
      existing environment variables. The security policy may eturn an error 
      if the user does not have permission to preserve the environment. 
+0

偉大な唯一の問題は、-Eを許可するには –

+4

を渡され、この "-E" のdoesn –

+30

<パスはwgetのために>: ALL =(root)のNOPASSWD:SETENV例 - wgetのために、あなたはwgetのの実行を可能にsudoのルールにSETENVタグを指定する必要があります(環境保全)変数がPATHまたはPYTHONPATHの場合は動作しません。 – apporc

18

あなたはまた、単一の文のようにアーメドAswaniの答えで2つのenv_keep文を組み合わせることができます。それは多変数の行のエラーを返すよう

は、Ubuntuの14のために、あなたは別々の行に指定する必要がありますこれは:

Defaults env_keep += "http_proxy https_proxy"

また、このような単一のコマンドのenv_keepを指定することを検討する必要があります。

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

34

個別に使用できるようにする変数は、コマンドの一部にすることができます。

sudo http_proxy=$http_proxy wget "http://stackoverflow.com" 
+0

'.bashrc'ファイル(' export' clausule)で 'PATH'に追加されたmyPathの下にある' package'に対して、この回答をテストしました。そうすれば 'sudo PATH = $ PATH which package'は' sudo which package'とは違って正しい答えを見つけます。しかし、 'sudo PATH = $ PATH package'は' sudo package'(ファイルが見つかりません)より進んでいません。一方、 'sudo bash'で起動されたシェルから普通の'パッケージ 'を起動すると、拡張パスが保存され、'パッケージ 'sudoの権利(1つの石を持つ2つのハト)が与えられます。だから応答は実際にあなたが起動しているコマンドに依存しています – XavierStuvw

+1

sudoのPATH解決策は別の問題です。誰かがこの問題を探してこの投稿を見つけたら、私はhttp://unix.stackexchange.com/questions/83191/how-to -make-sudo-preserve-path – jpj

関連する問題