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

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

https://stackoverflow.com/a/29400598/156458

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

sudo -E env "PATH=$PATH" <command> [arguments]

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

alias mysudo='sudo -E env "PATH=$PATH"'

(也可以命名别名本身sudo,替换原来的sudo。)

鉴于

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

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

sudo -E <command> [arguments]

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

sudo  "PATH=$PATH" <command> [arguments]

谢谢。

答案1

sudo -E <command> [arguments]

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

sudo  "PATH=$PATH" <command> [arguments]

应该有效,因为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]

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

在这里,命令由inenv查找,但它本身在提供的 中查找。sudosecure_pathenv<command>$PATH

相关内容