为什么 `sudo env "PATH=$PATH"` 会做任何事情?

Har*_*der 3 sudo path environment-variables

谁能解释一下为什么会这样:

sudo env "PATH=$PATH" make install
Run Code Online (Sandbox Code Playgroud)

与此不同:

sudo make install
Run Code Online (Sandbox Code Playgroud)

我最近遇到了一种情况,make install除非按照上面所示运行,否则会失败。该错误与 libtool 有关,但这不是重点 - 为什么要sudo env "PATH=$PATH"执行任何操作?不应该PATH已经在我的 shell 会话的环境中了吗?

Kam*_*ski 5

sudo忽略PATH它进入环境是正常的。

\n\n

当您运行时sudo some_commandsudo使用它自己的一组目录而不是PATH. 该集合可能会也可能不会在sudo配置(/etc/sudoers, /etc/sudoers.d/*)中的某个位置定义。如果没有明确定义,/etc/sudoers则表示默认值为

\n\n
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"\n
Run Code Online (Sandbox Code Playgroud)\n\n

(这有点简化,其他选项可能会改变这种机制;请参阅man 5 sudoers获取详细信息)。

\n\n

不仅sudo使用自己的PATH来定位可执行文件;运行的命令也sudo继承了 other ,而不是shell 中的PATH原始命令。PATH

\n\n

env foo=bar baz是一种将变量设置为命令foo的值的方法。当你这样做时barbaz

\n\n
\n
sudo env "PATH=$PATH" make install\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

外壳膨胀$PATHsudo重置 的变量env,但在命令行参数env中获取旧的扩展值PATH=\xe2\x80\xa6。通过这种方式,您可以将您的代码注入PATH到 的环境中make,从而规避事实sudo更改(其他地方的问题PATH还有其他价值:首先使用它来搜索可执行文件)。PATHsudoenv

\n\n

您也许能够获得类似的结果

\n\n
sudo "PATH=$PATH" make install\n
Run Code Online (Sandbox Code Playgroud)\n\n

但以这种方式传递的变量受到安全策略插件施加的限制sudo。您所做的事情env不受限制。

\n\n
\n\n

比较这些的输出(注意soleenv打印其环境):

\n\n
export foo=bar\n                         env | grep \'^foo=\'\n             env foo=qux env | grep \'^foo=\'\nsudo                     env | grep \'^foo=\'\nsudo foo=baz             env | grep \'^foo=\'\nsudo         env foo=qux env | grep \'^foo=\'\nsudo foo=baz env foo=qux env | grep \'^foo=\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一组进行比较:

\n\n
                      env | grep \'^PATH=\'\nsudo                  env | grep \'^PATH=\'\nsudo     "PATH=$PATH" env | grep \'^PATH=\'\nsudo env "PATH=$PATH" env | grep \'^PATH=\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

一般来说,根据您的PATH设置和设置,sudo结果可能相同也可能不同。在你的情况下,我希望它们有所不同(因为有问题的两个命令的工作方式不同)。

\n