2011-12-26 57 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 – 2015-12-08 16:51:41

+1

相關:[爲什麼要通過sudo和蘇中運行時是PATH變量不同?](http://unix.stackexchange.com/q/8646/21471)在Unix SE – kenorb 2015-12-24 18:30:23

回答

242

的竅門是通過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" 
+10

這可以說是最好的選擇,可以避免信息泄露和安全漏洞。 'sudo -E'確實是一種一次性獲得相同效果的方式,儘管 – sehe 2011-12-26 14:55:51

+0

我遇到了一個叫做sudo(jhbuild)的進程問題,我不能告訴它通過-E標誌爲sudo,所以這是我的解決方案。 – jgomo3 2013-05-13 12:23:26

+42

請注意,您應該*永遠不要*直接編輯'etc/sudoers'。相反,在覆蓋'sudoers'文件之前,使用'visudo'命令,該命令會對語法進行編輯。這樣,如果編輯時出錯,您不會自行鎖定。 – Henning 2013-11-15 08:37:51

322

首先你需要export HTTP_PROXY。其次,您需要仔細閱讀man sudo,並注意-E標誌。這工作:

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

這裏是從該名男子頁報價:

-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

偉大的唯一問題是修改一些配置文件,例如pacman for arch使-E通過 – 2011-12-26 09:01:51

+4

允許-E (保留環境),您需要在允許運行wget的sudo規則中指定SETENV標記 - 示例: ALL =(root)NOPASSWD:SETENV: 2014-09-16 16:13:23

+30

此「-E」不會如果變量是PATH或PYTHONPATH,則不起作用。 – apporc 2016-06-27 06:23:48

18

您還可以在艾哈邁德Aswani的回答兩個env_keep報表合併成一個單一的語句像這樣的:

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哪個軟件包找到了正確的答案,不像'sudo哪個軟件包'。然而,'sudo PATH = $ PATH package'不會比'sudo package'更進一步(找不到文件)。另一方面,從'sudo bash'調用的shell啓動一個普通的'package'保留了擴展路徑,並給出了'package' sudo權限(兩個鴿子一石二鳥)。所以反應真的取決於你啓動的命令 – XavierStuvw 2017-01-05 18:16:34

+1

sudo的PATH解決方案是另一回事 - 任何人都應該找到這篇文章來尋找這個問題,我建議你看看http://unix.stackexchange.com/questions/83191/how-to - 製作 - 須藤-保存路徑 – jpj 2017-01-06 09:16:55