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

Posted

技术标签:

【中文标题】sudo:没有 tty 存在,也没有指定 askpass 程序使用 shell_exec 时【英文标题】:sudo: no tty present and no askpass program specified When useing shell_exec 【发布时间】:2015-11-06 20:28:48 【问题描述】:

我有一个 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:不存在 tty 且未指定 askpass 程序”? 我真的可以在这方面使用一些帮助。我已经阅读了每篇关于 4 个谷歌页面的文章,我想用谷歌搜索它。

【问题讨论】:

【参考方案1】:

从命令提示符运行

sudo visudo

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

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

希望这行得通!

【讨论】:

【参考方案2】:

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

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

然后我运行如下:

echo 'password' | sudo -S command

【讨论】:

Apache ALL=(ALL) ALL 不会让您受到攻击吗?我项目的目标之一是尽量减少攻击向量。我可以看到这是如何工作的,但我认为这不是我所需要的。

以上是关于sudo:没有 tty 存在,也没有指定 askpass 程序使用 shell_exec 时的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins sudo:不存在 tty,也没有使用 NOPASSWD 指定 askpass 程序 [重复]

text 当试图从Jenkins运行shell时,如何解决“sudo:没有tty存在且没有指定askpass程序”

sudo:没有 tty 存在,也没有在 github 操作中指定 askpass 程序

从 Windows 上的 plink.exe 在 Linux 上执行 sudo 命令

sudoers NOPASSWD: sudo: 没有 tty 并且没有指定 askpass 程序

如何在 shell 脚本中使用 tee 和 sshpass