我在防火墙后面使用 apt,因此我在http_proxy
环境变量中指定了代理。
我所做的是以下行添加到root 用户的.profile
和(为了更好的衡量):.bashrc
export http_proxy=http://proxyserver:8080
当我执行以下操作时,它会正确打印代理的值:
sudo echo $http_proxy
但是,当我调用 时sudo apt-get update
,它似乎没有将http_proxy
变量视为 root 用户。
仅当我 su 到 root 时,才apt-get
通过代理按预期工作,因此它显然可以看到该变量。
所以我的问题是,如上所述,为什么sudo apt-get
看不到该变量?
更新我刚刚了解到,当我调用 时sudo echo
,它会回显当前用户配置文件中设置的变量值。但即便如此,为什么sudo apt-get
不使用那个变量值呢?
答案1
sudo apt-get
在这种情况下,它并不“似乎不起作用” ,似乎有效当你这样做时sudo echo $http_proxy
。
当您输入 shell 命令时,它会全局化并展开所有变量和别名前它执行。
这样sudo echo $http_proxy
就变得sudo echo http://proxyserver:8080
顺利了。
$http_proxy
看不到的原因apt-get
是因为清除了除指令sudo
中明确列入白名单的环境变量之外的所有环境变量。/etc/sudoers
env_keep
有关如何操纵处理sudo
环境变量的方式的更多信息(或者更确切地说,它通常如何不) 可以在 中找到man sudoers
。
答案2
只是为了让您知道,因为这是我所决定的,针对这种情况,因此更好的解决方案是修改/etc/apt/apt.conf
为代理添加一行:
Acquire::http::Proxy "http://yourproxyaddress:proxyport";
由于该系统几乎永久驻留在代理后面,因此从http_proxy
长远来看,这是比使用环境变量更好的解决方案。
答案3
啊,我刚刚在这个页面上看到了一些东西:
https://help.ubuntu.com/community/AptGet/Howto#Setting_up_apt-get_to_use_a_http-proxy
如果您通常使用 sudo 运行 apt-get,则需要首先以 root 身份登录才能正常工作,除非您还向 /etc/sudoers 添加一些显式环境设置,例如
Defaults env_keep = "http_proxy https_proxy ftp_proxy"
您需要这样做的原因是因为sudo
故意清除所有环境变量点头因此将其列入白名单作为基本的安全预防措施。
答案4
我认为你只需要使用 sudo 的“-E”选项,例如
sudo -E echo $http_proxy