简而言之:如何让 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