我正在使用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 \$PATH或sudo 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不在你的$PATH
这很酷:在bash运行程序之前发生variables扩展。 所以当你运行这个时,它会在调用sudo 之前扩展到你的用户$PATH ,所以传递给sudo的那一行更像是:
$ sudo echo "/usr/bin:/bin:"
sudo -i作为loginshell运行,并且尊重.profile和/或.login 。 由man页说:
它还初始化环境,使DISPLAY和TERM保持不变,在Linux和AIX系统上设置HOME,MAIL,SHELL,USER,LOGNAME和PATH以及/ etc / environment的内容。 所有其他的环境variables被删除。