sudo:不存在 tty 且未指定 Askpass 程序

sudo:不存在 tty 且未指定 Askpass 程序

我有一个 Perl 脚本,是从另一个脚本中派生出来的,该脚本是通过 mod_perl 从 Web 浏览器启动的。分叉脚本(最终作为 apache 运行)需要sudo service X stop作为备份恢复过程的一部分:X 服务依赖于恢复。我在 Windows 上运行正常,但现在移植到 CentOS,我遇到了标题中的错误。

设置:

  1. sudoers 文件已被注释掉# Defaults requiretty
  2. sudoers 文件有apache_usr localhost=(root) NOPASSWD: /sbin/service X stop(通过visudo -c检查)并且没有其他apache_usr

我尝试过的事情:

  1. sudo /sbin/service而不仅仅是sudo service在分叉进程中
  2. 带或不带注释的 sudoers 文件Defaults !visiblepw
  3. 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,我真的很好奇为什么需要进行此更改。

相关内容