通过 sudo 传递 PATH

通过 sudo 传递 PATH

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

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

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

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

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

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

更新:一些例子

$ 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

而且我可以说它在 Debian 稳定版(lenny)中也是这样运作的。

答案1

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

Defaults        exempt_group=<your group> 

到 sudoers 文件。

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

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

答案2

如果您已secure_path设置/etc/sudoers,您可以随意使用env_reset/ env_keep,这对路径没有任何影响。如果您看到类似这样的内容,请将其注释掉。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

答案3

我会建议查看 env_reset 和 env_keep 选项男人须藤。但听起来你已经这样做了(你只是错误地将 env_keep 称为“keepenv”)。如果你禁用env_reset 选项(默认启用),我认为它不应该删除任何环境变量。但这种方式不太安全。

sudo 还有一个 secure_path 选项;我认为默认情况下启用了该选项。您可以尝试禁用它。

上述选项在您的 /etc/sudoers 文件中设置。sudo 还有一个-i命令行选项。这将导致 sudo 运行 /root/.profile 或 /root/.login。您可以在那里设置所需的路径。

答案4

嗯,你做错了。另外,你没有指定你对 /etc/sudoers 文件做了什么。你应该这样做——顺便说一下,这是一个 CentOS 系统:

首先,这是使用正确的 env_keep 设置(注意 PATH 在其中):

sudo grep -5 PATH /etc/sudoers 默认值 env_keep = “颜色显示主机名 HISTSIZE INPUTRC KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR 用户名 \ LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \ _XKB_CHARSET XAUTHORITY PATH”

Defaults   timestamp_timeout = 15 

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple

-> export PATH=$PATH:hithere
-> sudo sh -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:hithere

看起来不错。现在让我们删除 env_keep 设置并重试:

-> sudo visudo
-> sudo grep -5 PATH /etc/sudoers
                    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                    LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                    LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                    _XKB_CHARSET XAUTHORITY"
 #_XKB_CHARSET XAUTHORITY PATH"

多么悲伤的路径:

 -> sudo sh -c 'echo $PATH'
 /usr/bin:/bin

相关内容