sudo:需要终端来读取密码;使用 -S 选项从标准输入读取或配置 askpass 助手

sudo:需要终端来读取密码;使用 -S 选项从标准输入读取或配置 askpass 助手

我目前在浏览器中收到此错误。我想通过 php 执行脚本,但不知何故我通过打印收到此错误echo shell_exec (...) 2>&1

sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper

我已经添加了-S并得到了这个:

[sudo] password for www-data: sudo: no password was provided

我已经把自己添加到其中sudoers但仍然没有解决方案。

答案1

作为@丹泽尔提到评论对于这个答案,请确保脚本不可写,www-data否则允许用户以某种方式修改的错误意味着您向有权访问该网页的任何人授予对操作系统的完全访问权限。

当您在浏览器中打开 PHP 页面时,该脚本不会随您的用户一起运行。相反,它使用用户www-data

您需要将其添加www-data到 sudoers 文件中,以使 sudo 命令无需密码就可以工作,而不是您的用户。

但是,这非常危险,因为您授予了对 Web 服务器的 sudo 访问权限,尤其是当这是一个任何人都可以访问的环境时。如果有另一种无需 sudo 即可执行脚本的方法,那应该是您的解决方案。

如果没有,请仅授予该特定脚本的访问权限,而不是ALL命令!

www-data ALL=NOPASSWD: /path/to/your/script

对于 Web 服务器用户来说,以下做法可能比之前的做法更糟糕,但我会将其留给您判断,因为它是问题的一部分。当您运行 时sudo -S ...,该命令将期望输入,而stdin无需在终端中提示。因此,该命令需要看起来像以下之一:

echo $PASSOWRD | sudo -S /path/to/command
sudo -S /path/to/command < password.secret

答案2

我在另一种情况下遇到了同样的问题(sudo:需要终端才能读取密码;使用 -S...),当时我有一个 bash 脚本打开一个 mysql 会话,当 sql 结果循环时,系统会提示用户输入密码。我必须让 sql 会话完成(在 bash 脚本内部),然后再询问用户密码,这样就解决了问题。

相关内容