为什么以下为 sudo 保留环境变量的方法不起作用?

Tim*_*Tim 2 sudo environment-variables

来自/sf/answers/2058041891/

到目前为止,我在这里看到的其他解决方案基于一些系统定义,但实际上可以通过正确调用它来sudo使用当前 PATH(使用env命令)和/或环境的其余部分(使用-E选项) :

sudo -E env "PATH=$PATH" <command> [arguments]
Run Code Online (Sandbox Code Playgroud)

事实上,我们可以用它来做一个别名:

alias mysudo='sudo -E env "PATH=$PATH"'
Run Code Online (Sandbox Code Playgroud)

(也可以自己命名别名sudo,替换原来的sudo.)

鉴于

-E, --preserve-env 指示用户希望保留其现有环境变量的安全策略。如果用户没有保护环境的权限,安全策略可能会返回错误。

我想知道为什么以下不起作用

sudo -E <command> [arguments]
Run Code Online (Sandbox Code Playgroud)

?

鉴于这"PATH=$PATH" <command> [arguments]也是一个命令,我想知道为什么以下不起作用:

sudo  "PATH=$PATH" <command> [arguments]
Run Code Online (Sandbox Code Playgroud)

?

谢谢。

Ste*_*itt 9

sudo -E <command> [arguments]
Run Code Online (Sandbox Code Playgroud)

在您的情况下不起作用,因为 Debian 定义了secure_pathin /etc/defaults,它覆盖了PATHeven with的值-E

sudo  "PATH=$PATH" <command> [arguments]
Run Code Online (Sandbox Code Playgroud)

应该可以工作,因为PATH=$PATH被 识别和处理sudo。在我的情况下sudo "PATH=$PATH" env显示了我的当前PATH值。(请注意,这PATH=$PATH <command>不是普遍认可的命令;它对应于由 shell 和 识别的构造sudo,但不一定在其他上下文中。)。

然而,sudo它本身并不使用它$PATH来查找<command>并且仍然使用secure_path.

sudo -E env "PATH=$PATH" <command> [arguments]
Run Code Online (Sandbox Code Playgroud)

之所以有效,是因为"PATH=$PATH"将 的当前值存储PATH在命令中,如sudo和 then所见envsudo替换其环境中PATH给定的 的值envenv然后从其参数中读取值以构建环境<command>

在这里,env命令由sudoin查找secure_path,但env它本身<command>在提供的$PATH.