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

myd*_*rms 6 sudo environment-variables

我在防火墙后面使用 apt,所以我在http_proxy环境变量中指定了一个代理。

我所做的是将以下行添加到root 用户的.profile.bashrc(为了更好的衡量):

export http_proxy=http://proxyserver:8080
Run Code Online (Sandbox Code Playgroud)

当我执行以下操作时,它会正确打印代理的值:

sudo echo $http_proxy
Run Code Online (Sandbox Code Playgroud)

但是,当我调用 时sudo apt-get update,它似乎没有将http_proxy变量视为 root 用户。

只有当我 su 到 root 时,才能apt-get按预期工作,通过代理,所以它显然看到了变量。

所以我的问题是,如上所述,为什么sudo apt-get看不到变量?

更新我刚刚了解到,当我调用时sudo echo,它会响应当前用户配置文件中设置的变量值。但即便如此,为什么不sudo apt-get使用那个变量值呢?

Sha*_*dur 6

在 的情况下它不会“似乎不起作用”,当你这样做时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


myd*_*rms 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故意清除所有环境变量因此将其列入白名单作为基本的安全预防措施。