环境变量似乎在 sudo 中不起作用

环境变量似乎在 sudo 中不起作用

我在防火墙后面使用 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/sudoersenv_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

相关内容