即使设置了 Apache 权限,也在浏览器中运行 Bash 脚本

即使设置了 Apache 权限,也在浏览器中运行 Bash 脚本

我有一个程序位于 Docker 容器中。我希望能够转到浏览器页面并运行 Docker 容器,以便程序启动。

因此,我创建了一个运行 Docker 命令的 bash 脚本(运行容器.sh):

#!/bin/sh
sudo docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix myproject

然后我创建了一个运行该 shell 脚本的 PHP 文件(网页脚本.php):

<?php
    exec('/usr/lib/cgi-bin/runcontainer.sh');
?>

我正在运行安装了 apache2 的 ubuntu 16.04 。

问题:
php webscript.php如果我在 bash 终端中 运行,该程序就会运行。容器启动,程序启动。但是,如果我尝试从网络浏览器(firefox)中尝试,则不会。

我去http://localhost/cgi-bin/webscript.php,我看到了该页面,但 Docker 容器从未启动。所以,我查看了 /var/log/apache2/error.log,并看到了这个错误:sudo: no tty present and no askpass program specified

基于类似的问题,我跑去 sudo apachectl -S看apache用户和组的名称。两者都是 www-data。因此,我将/usr/lib/cgi-bin/目录下的用户和组设置为www-data。

即使 www-data 具有完全权限,我仍然看到该sudo: no tty present and no askpass program specified错误。我发现的其他答案说更改 sudoers 文件以授予 www-data ALL 访问权限。但我不想这样做,因为这似乎不安全。

答案1

我进行了一些实验(使用 Cron 代替 Apache 并/bin/ls代替runcontainer.sh)来重现您遇到的错误消息。基于此,我建议您首先验证是否www-data可以在没有密码的情况下运行您想要的命令。

要检查是否可以在没有密码的情况下运行命令,请以 root 用户身份登录,然后

# su - -s /bin/bash www-data
$ sudo /usr/lib/cgi-bin/runcontainer.sh

另外,您还应该检查/etc/sudoers您是否已/usr/lib/cgi-bin/runcontainer.shwww-data用户启用。

%www-data ALL=(ALL) NOPASSWD: /usr/lib/cgi-bin/runcontainer.sh

如果上述工作有效,我们就可以专注于下一个级别。

相关内容