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

mfx*_*x28 9 command-line sudo scripts

我目前在浏览器中收到此错误。我不想通过 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
Run Code Online (Sandbox Code Playgroud)

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

[sudo] password for www-data: sudo: no password was provided
Run Code Online (Sandbox Code Playgroud)

我已经将自己添加进去了sudoers,但仍然没有解决方案。

Dan*_*Dan 10

正如@danzel在对此答案的评论中提到的那样,请确保脚本不可写,www-data否则允许用户以某种方式进行修改的错误意味着您向有权访问该网页的任何人授予了对操作系统的完全访问权限。

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

您需要将 添加www-data到 sudoers 文件中,以使 sudo 命令在没有密码(而不是您的用户)的情况下运行。

然而,这是非常危险的,因为您授予 sudo 访问您的 Web 服务器的权限,特别是如果这是一个任何人都可以访问的环境。如果有另一种方法可以在不使用 sudo 的情况下执行脚本,那么这应该是您的解决方案。

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

www-data ALL=NOPASSWD: /path/to/your/script
Run Code Online (Sandbox Code Playgroud)

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

echo $PASSOWRD | sudo -S /path/to/command
sudo -S /path/to/command < password.secret
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,将以 root 身份执行的脚本不能由“www-data”写入,因为这将导致“www-data”能够以 root 身份执行_所有操作_。除此之外,我建议在答案顶部添加一个巨大的警告。 (2认同)