sudo相对执行路径工作机制及sudoers规则配置问题咨询
解决sudoers规则不允许相对路径执行vi的问题
你猜的没错,问题根源确实和相对路径的规则匹配逻辑有关。让我给你拆解一下原因,再提供几种安全的解决方案:
为什么相对路径会被拒绝?
sudo的规则匹配是严格匹配命令行传入的参数的。你配置的规则:
%pusers ALL=(ALL) NOPASSWD: /bin/vi /etc/httpd/conf/*
只匹配那些第一个参数是绝对路径且符合/etc/httpd/conf/*模式的命令。当用户cd到/etc/httpd/conf目录后执行sudo vi httpd.conf或sudo vi ./httpd.conf,命令的参数是httpd.conf或./httpd.conf(相对路径),和规则里的绝对路径模式完全不匹配,所以sudo直接拒绝了这个请求。
解决方案
根据你的安全需求,这里有几种可行的方案:
方案1:限制目录的相对路径访问(最安全)
这种方案既允许用户用相对路径编辑文件,又确保只能在/etc/httpd/conf目录下操作,避免误编辑其他目录的同名文件。
用visudo打开sudoers文件(一定要用visudo,它会检查语法错误,防止锁死sudo),添加以下内容:
# 定义命令别名,包含绝对路径和相对路径的vi命令 Cmnd_Alias EDIT_HTTPD_CONF = /bin/vi /etc/httpd/conf/*, /bin/vi *, /bin/vi ./* # 允许pusers组执行这些命令,无需密码 %pusers ALL=(ALL) NOPASSWD: EDIT_HTTPD_CONF # 限制这些命令只能在/etc/httpd/conf目录下执行 Defaults!EDIT_HTTPD_CONF cwd=/etc/httpd/conf
方案2:直接添加相对路径规则(简单但有轻微风险)
如果你能接受用户在其他目录下执行sudo vi httpd.conf时编辑当前目录的同名文件(风险较低,但不符合最小权限原则),可以直接扩展原规则:
%pusers ALL=(ALL) NOPASSWD: /bin/vi /etc/httpd/conf/*, /bin/vi httpd.conf, /bin/vi ./httpd.conf
方案3:不推荐的宽松方案
不要使用sudo -i或sudo -s让用户切换到root后操作,这会赋予用户完整的root权限,完全违背了你最初限制权限的目的。
验证规则
修改完成后,切换到pusers组的用户,测试两种场景:
- 在
/etc/httpd/conf目录下执行sudo vi httpd.conf——应该可以正常编辑 - 在其他目录(比如
/home/user)下执行sudo vi httpd.conf——方案1会拒绝,方案2会允许(根据你选的方案)
内容的提问来源于stack exchange,提问作者weildish




