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 会话的环境中了吗?
sudo忽略PATH它进入环境是正常的。
当您运行时sudo some_command,sudo使用它自己的一组目录而不是PATH. 该集合可能会也可能不会在sudo配置(/etc/sudoers, /etc/sudoers.d/*)中的某个位置定义。如果没有明确定义,/etc/sudoers则表示默认值为
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"\nRun Code Online (Sandbox Code Playgroud)\n\n(这有点简化,其他选项可能会改变这种机制;请参阅man 5 sudoers获取详细信息)。
不仅sudo使用自己的PATH来定位可执行文件;运行的命令也sudo继承了 other ,而不是shell 中的PATH原始命令。PATH
env foo=bar baz是一种将变量设置为命令foo的值的方法。当你这样做时barbaz
\n\n\nRun Code Online (Sandbox Code Playgroud)\nsudo env "PATH=$PATH" make install\n
外壳膨胀$PATH。sudo重置 的变量env,但在命令行参数env中获取旧的扩展值PATH=\xe2\x80\xa6。通过这种方式,您可以将您的代码注入PATH到 的环境中make,从而规避事实sudo更改(其他地方的问题PATH还有其他价值:首先使用它来搜索可执行文件)。PATHsudoenv
您也许能够获得类似的结果
\n\nsudo "PATH=$PATH" make install\nRun Code Online (Sandbox Code Playgroud)\n\n但以这种方式传递的变量受到安全策略插件施加的限制sudo。您所做的事情env不受限制。
比较这些的输出(注意soleenv打印其环境):
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=\'\nRun 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=\'\nRun Code Online (Sandbox Code Playgroud)\n\n一般来说,根据您的PATH设置和设置,sudo结果可能相同也可能不同。在你的情况下,我希望它们有所不同(因为有问题的两个命令的工作方式不同)。
| 归档时间: |
|
| 查看次数: |
5626 次 |
| 最近记录: |