sudo:没有tty存在且没有指定askpass程序使用shell_exec时

时间:2015-08-13 18:13:15

标签: php linux apache sudo shell-exec

我有一个试图使用以下命令运行服务重启的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并且没有指定askpass程序"。据我所知,它适用于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:没有tty存在且没有指定askpass程序”? 我真的可以在这个上使用一些帮助。我已经阅读了4篇谷歌页面的每篇文章,我可以想到谷歌它的每一种方式。

2 个答案:

答案 0 :(得分:1)

从命令提示符运行

sudo visudo

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

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

希望这行得通!

答案 1 :(得分:0)

虽然我的设置有点不同(我没有密码尝试实现它),但我在sudoers文件中使用它:

apache ALL=(ALL) ALL
Defaults:apache !requiretty

然后我将事情视为:

echo '{password}' | sudo -S {command}