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
使用那个变量值呢?
在 的情况下它不会“似乎不起作用”,当你这样做时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
。
啊,我刚刚在这个页面上看到了一些东西:
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
故意清除所有环境变量,因此将其列入白名单作为基本的安全预防措施。