通过 sudo 传递 PATH

whi*_*ark 15 linux sudo path gem

简而言之:如何让 sudo 每次都不刷新 PATH?

我在我的服务器上部署了一些网站(Debian 测试),这些网站是用 Ruby on Rails 编写的。我使用 Mongrel+Nginx 来托管它们,但是当我需要重新启动 Mongrel(例如,在进行一些更改之后)时会出现一个问题。

所有站点都在 VCS 中检查(git,但这并不重要)并且将所有者和组设置为我的用户,而 Mongrel 运行在权限受到严格限制的 mongrel 用户下。所以Mongrel必须在root下启动(它可以自动改变UID)或mongrel。

为了管理 mongrel,我使用 mongrel_cluster gem,因为它允许只用一个命令启动或停止任意数量的 Mongrel 服务器。但是它需要目录 /var/lib/gems/1.8/bin 位于 PATH 中:这不足以以绝对路径启动它

在 root .bashrc 中修改 PATH 没有任何改变,调整 sudo 的 env_reset 和 env_keep 也没有。

所以问题是:如何将目录添加到 PATH 或将用户的 PATH 保留在 sudo 中?

更新:一些例子

$ env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ sudo cat /etc/sudoers | egrep -v '^$|^#'
Defaults    env_keep = "PATH"
root    ALL=(ALL) ALL
%sudo ALL=NOPASSWD: ALL
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Run Code Online (Sandbox Code Playgroud)

我也可以说它在 Debian stable (lenny) 中也是这样工作的。

小智 13

为同样的问题苦苦挣扎了几个小时。在 debian lenny 中,您可以通过添加来修复它

Defaults        exempt_group=<your group> 
Run Code Online (Sandbox Code Playgroud)

到 sudoers 文件。

这是绕过编译的 --secure-path 选项的唯一方法(据我所知)。

值得注意的是,这将免除用户在执行 sudo 时需要输入密码。