`sudo` 如何搜索可执行文件的路径?

Kam*_*oij 8 ubuntu sudo rubygems

我在 Ubuntu 10.10 上使用 ruby​​gems (1.3.7) 和需要 root 权限的 gem。当我将我的设置与安装了 ruby​​gems 1.3.6 的 ubuntu 9.10 进行比较时,我看到以下差异gem environment

1.3.7 / 10.10 - EXECUTABLE DIRECTORY: /var/lib/gems/1.8/bin

1.3.6 / 09.10 - EXECUTABLE DIRECTORY: /usr/bin

无论我是否使用,输出都是相同的sudo。为了解决这个问题(我不知道为什么它首先不同),我尝试修改我的路径变量。

我的问题是,在哪里sudo寻找可执行文件?如果我安装 gem(使用sudo),则可执行文件/var显然放在路径中。我将此路径添加到我的~/.profile/etc/environment文件中,但我无法sudo执行可执行文件。

如果我运行:

  • $ gemname 它正确运行我的工具。
  • $ sudo gemname它只是告诉我command not found
  • $ sudo echo $PATH确实显示了正确的路径。
  • $ sudo -i gemname 它运行正确。
  • $ sudo sudo -V 显示 PATH 被保留。

请问sudo荣誉~/.profile和/或/etc/environment?如果是这样,当目录显示在$PATH环境变量中时,他们为什么找不到我的可执行文件?

我已经阅读了 的文档sudo,我还搜索并浏览了大量关于 stackoverflow 和 serverfault 的主题(例如How to override a PATH environment variable in sudo?,但我的示例显示$PATH包含正确的路径),但它们实际上从未展示如何通过sudo.

jus*_*ert 11

请注意,在您的第三个命令中,您的 shell$PATH在 sudo 看到它之前展开,因此输出是您的 shell 的路径,而不是 sudo 看到的 PATH。你想要的是类似sudo echo \$PATH或的东西sudo sh -c 'echo $PATH'

除此之外,请查看sudo(8)手册页的 SECURITY NOTES 部分。我相信 Ubuntusudo使用 SECURE_PATH 构建选项构建。在sudo sudo -V.

sudo -i模拟初始登录,因此将读取文件.profile(尽管它读取的文件取决于root的shell是什么)。如果没有-i,它会从调用者的环境中继承保留的环境变量,以及我上面提到的 PATH 卫生。

至于最初为什么改变路径,我怀疑这种改变是开发人员故意选择的。请参阅bugs.debian.org上的更多讨论。