通过sudo传递PATH


13

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

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

所有站点都在VCS中进行了检查(git,但这并不重要),并将所有者和组设置为我的用户,而Mongrel则在杂项用户的严格限制下运行,呵呵。因此,Mongrel必须在root(可以自动更改UID)或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

我也可以说,它在Debian稳定版(lenny)中也是如此。


Answers:


12

经历了相同的问题几个小时。在debian lenny中,您可以通过添加

Defaults        exempt_group=<your group> 

到sudoers文件。

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

值得注意的是,这从需要时,他们sudo来输入密码免除用户。


3

如果您secure_path设置了/etc/sudoers,您可以随心所欲地玩env_reset/,env_keep并且对路径没有任何影响。如果您看到类似这样的内容,请将其注释掉。

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

不,当然没有设置。
whitequark 2010年

0

我想说一下man sudo中的env_reset和env_keep选项。但这听起来好像已经完成了(您只是错误地将env_keep称为“ keepenv”)。如果禁用 env_reset选项(启用了默认值),我认为不应该擦除任何 env变量。但这不太安全。

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

前面的选项在/ etc / sudoers文件中设置。还有-isudo 的命令行选项。这将导致sudo运行/root/.profile或/root/.login。您可以在此处设置所需的路径。


1
不,当关闭env_reset时,它仍然会更改(而不是擦除)PATH。可能这样做是为了添加/ * / sbin目录。不,-i选项不合适,因为它启动了交互式外壳程序,我只需要运行命令。
whitequark 2010年

好的,重新安装Debian(由于迁移到LVM)和RubyGems之后,问题消失了。您的答案是最有用的,因此现在可以接受。
whitequark 2010年

-1

好吧,你做错了什么。另外,您没有指定对/ etc / sudoers文件所做的操作。这是您应该做的-这是一个CentOS系统,顺便说一句:

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

须藤的grep -5 PATH的/ etc / sudoers的默认env_keep = “颜色的显示HOSTNAME HISTSIZE INPUTRC KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \ LANG LC_ADDRESS LC_IDENTIFICATION \ LC_NUMERIC \ LANGUAGE LINGUAS \ _XKB_CHARSET XAUTHORITY PATH LC_CTYPE LC_COLLATE LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_PAPER LC_TELEPHONE LC_TIME LC_ALL”

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

1
我检查了两次以上!检查更新后。
whitequark 2010年

我遇到了同样的问题,我肯定有您提到的正确设置
Draemon 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.