我有一个 Perl 脚本,是从另一个脚本中派生出来的,该脚本是通过 mod_perl 从 Web 浏览器启动的。分叉脚本(最终作为 apache 运行)需要sudo service X stop
作为备份恢复过程的一部分:X 服务依赖于恢复。我在 Windows 上运行正常,但现在移植到 CentOS,我遇到了标题中的错误。
设置:
- sudoers 文件已被注释掉
# Defaults requiretty
- sudoers 文件有
apache_usr localhost=(root) NOPASSWD: /sbin/service X stop
(通过visudo -c
检查)并且没有其他apache_usr
行
我尝试过的事情:
sudo /sbin/service
而不仅仅是sudo service
在分叉进程中- 带或不带注释的 sudoers 文件
Defaults !visiblepw
- sudoers 文件中上面的 NOPASSWD 行
(ALL)
中用(root)
还有什么可以尝试的?
答案1
简而言之,这就是 sudo 的设计方式。看这里。
它的主机查找方式略有不同,以免在没有网络连接/快速 DNS 服务器时出现滞后。
如果您的机器名称是“salt”,那么您正确的 sudoers 行是:
apache_usr salt=(root) NOPASSWD: /sbin/service X stop
换句话说,对于 sudoers 而言,localhost 不是有效的主机名。
答案2
您提到“sudoers 文件已注释掉# Defaults requiretty
”。
requiretty
如果您的 sudo 版本默认启用(我的版本默认启用),则这不会产生任何影响。为相关用户使用有针对性的默认规范:
Defaults:apache_usr !requiretty
答案3
当我写的时候ALL=(root)
,它就起作用了。尽管该脚本与我试图停止的服务在同一台服务器上运行。它是通过与主 IP 不同的 IP 在浏览器中访问的,但尽管如此,如果我运行ping -c 1 localhost
我得到的结果127.0.0.1
,我真的很好奇为什么需要进行此更改。