我在 macOS(15.2)上使用 sudo 保存环境变量时遇到了奇怪的行为:sudo -E
不保存环境变量PERL5LIB
。
复制步骤
在shell中设置环境变量:
export PERL5LIB=foo
。命令env | grep PERL5LIB
输出与预期一致:PERL5LIB=foo
。但是,命令
sudo -E env | grep PERL5LIB
不返回任何内容。相反,以下命令有效:sudo --preserve-env=PERL5LIB env | grep PERL5LIB
。它成功保留了PERL5LIB
。
这很令人困惑,因为我希望sudo -E
保留调用shell的所有环境变量,包括PERL5LIB
。但显然,对于这个特定的变量,它不是这样工作的。
问题
- 为什么在 macOS 上
PERL5LIB
没有保存?sudo -E
- 这种行为是特定的吗
PERL5LIB
,还是也会影响其他变量? - 在使用 sudo 时,有什么推荐的、可靠的方法来确保
PERL5LIB
保存?
使用aka可以将
env_delete
列表匹配的变量从环境中移除。将变量传递给 aka 会将其原始值重新添加,从而有效地否定其在列表中的存在。(当不生效时,列表不适用,但环境变量除非在列表中,否则会被移除,并附带一些附加条件。)sudo -E
sudo --preserve-env
--preserve-env=
env_delete
--preserve-env
env_delete
env_keep
“坏”环境变量的默认列表包括各种
PATH
脚本语言的类似设置,包括PERL5LIB
Perl、PYTHONPATH
Python、RUBYLIB
Ruby 等。(但不包括PATH
其本身,它是经过特殊处理的。)该列表特定于操作系统,可以通过以
sudo -V
root 身份运行获取。引用sudoers(5) 手册页:sudo --preserve-env=PERL5LIB
如果您明确想要保留 ,请使用PERL5LIB
。您可以env_delete
在文件中逐条更改该选项sudoers
。如果您添加特定规则,请记住最后一个匹配项适用,因此请将其放在 I-can-become-root 的通用规则之后(如果适用)。