sudo:没有tty和未指定askpass程序。在使用shell_exec时

3
我有一个php页面,试图使用以下命令运行服务重启: $list = shell_exec('sudo /sbin/service NetworkManager restart');
我需要编辑我的sudoers文件以允许此操作。因此:
#Defaults requiretty

apache ALL=(ALL) NOPASSWD: /sbin/service 当这种方法失败时,作为测试,我运行了以下命令:
apache ALL=(ALL) NOPASSWD: ALL
我已经运行了一个没有sudo命令的shell_exec: $list = shell_exec('whoami');
echo $list;
这将返回预期的“apache”。所以我运行了: $list = shell_exec('id');
echo $list;
这将返回“uid=48(apache)gid=48(apache)groups=48(apache),10(wheel)”
我将文件的权限与正在执行相同操作的工作系统进行了比较,并且它们匹配。之后,出于测试目的,我将所有文件权限更改为777。仍然没有任何进展。在apache错误日志中,我得到了一行“sudo:no tty present and no askpass program specified”。据我所知,这适用于sudoers文件中的#Defaults requiretty行,但如上所述,该行已被注释掉。我已经进行了更多的测试,并且我当前的sudoers文件条目是:
#Defaults requiretty
ALL ALL=(ALL) NOPASSWD: ALL
我知道不要以这种方式运行服务器,因为这是巨大的安全风险,但此时我完全不知道是什么在阻止我。Selinux已关闭,所有权限都是777,并且文件的所有权与我拥有的工作系统匹配。即使关闭了所有可能的安全性,我仍然在我的/var/log/httpd/error_log中看到“sudo:no tty present and no askpass program specified”行。以下命令的输出: $list = shell_exec('sudo echo "yes" 2>&1 ');
echo $list;
也是“sudo:no tty present and no askpass program specified”?
我真的需要一些帮助。我已经阅读了关于此问题的每篇文章,Google搜索了4页。
2个回答

2

从命令提示符运行

sudo visudo

然后转到文件的最后一行并添加以下行:

%www-data ALL=NOPASSWD: <Your-Command-Here>

希望这能起作用!


1
尽管我的设置有些不同(我不是试图在没有密码的情况下实现它),但我在sudoers文件中使用了这个:
apache ALL=(ALL) ALL
Defaults:apache !requiretty

我然后运行以下内容:
echo '{password}' | sudo -S {command}

apache的ALL=(ALL) ALL难道不会让您暴露于攻击之下吗?我的项目目标之一就是最小化攻击向量。我可以看出它的工作原理,但我认为这不完全是我需要的。 - mando222

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接