“sudo”如何search可执行文件的path?

我正在使用rubygems(1.3.7),在Ubuntu 10.10上需要root权限的gem。 当我用rubygems 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或不。 为了解决这个问题(我不知道为什么它在第一位),我试图修改我的pathvariables。

我的问题是, sudo在哪里查找可执行文件? 如果我安装一个gem(使用sudo ),可执行文件显然被放置在/varpath中。 我添加了这个path到我的~/.profile/etc/environment文件,但我不能得到sudo来执行可执行文件。

如果我运行:

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

sudo是否遵守~/.profile和/或/etc/environment ? 如果是这样,他们为什么不能find我的可执行文件,而目录显示在$PATH环境variables?

我已经阅读了sudo的文档,我也search并浏览了很多关于stackoverflow和serverfault的主题(例如, 如何覆盖sudo中的PATH环境variables?但是我的示例显示$PATH包含正确的path),但他们从来没有真正显示如何通过sudo运行一个gem。

    请注意,在你的第三个命令中,你的shell在sudo查看之前展开$PATH ,所以输出是你shell的path,而不是sudo所看到的PATH。 你想要的就像sudo echo \$PATHsudo sh -c 'echo $PATH'

    除此之外,请看一下sudo(8)手册页的SECURITY NOTES部分。 我相信Ubuntu会使用SECURE_PATH构build选项来构buildsudo 。 在sudo sudo -V的输出中查找“覆盖用户$ PATH的值”行。

    sudo -i模拟初始login,所以会读取像.profile这样的文件(尽pipe它读取的文件取决于根目录的shell)。 如果没有-i ,它会从其调用者的环境中inheritance保留的环境variables,以及上面提到的PATH环境。

    至于为什么路线发生了变化,我怀疑这个变化是开发者们故意的select。 请参阅关于bugs.debian.org的更多讨论。

    我们来看看部分:

    • gemname它正确运行我的工具。

    没关系 :)

    • sudo gemname它只是告诉我命令未find。

    gemname不在你的$PATH

    • sudo echo $ PATH它显示正确的path。

    这很酷:在bash运行程序之前发生variables扩展。 所以当你运行这个时,它会调用sudo 之前扩展到你的用户$PATH ,所以传递给sudo的那一行更像是:

     $ sudo echo "/usr/bin:/bin:" 
    • sudo -i gemname它运行正常。

    sudo -i作为loginshell运行,并且尊重.profile和/或.login 。 由man页说:

    它还初始化环境,使DISPLAY和TERM保持不变,在Linux和AIX系统上设置HOME,MAIL,SHELL,USER,LOGNAME和PATH以及/ etc / environment的内容。 所有其他的环境variables被删除。