当前位置: 首页 > 知识库问答 >
问题:

PHP脚本在从网页(NGINX Web服务器)调用时不会执行bash脚本[关闭]

郭翰翮
2023-03-14

我正在尝试为我拥有的一些受控插头插座设置一个web界面,这些插座由Raspberry Pi控制。我想有一个网页上的链接,我可以用来打开和关闭开关夫妇。我一直在尝试使用PHP来实现这一点,但由于某些原因,它根本不起作用。

我尝试了各种建议(见以下链接)。每当我点击链接时,我得到的只是一个白色页面,它没有做它应该做的事情,即打开和关闭开关。从命令行运行PHP脚本的工作与预期的一样,问题似乎只有在尝试从网页运行它时才会出现。

我查看了权限,并为脚本设置了权限:chmod 777/path/to/script

我试着将脚本存储在我的主文件夹和/var/www/html文件夹中,但毫无乐趣。NGINX日志或PHP-FPM日志中没有显示任何错误。

我尝试过编辑sudoers文件,让www.-data访问脚本(www.-data ALL:=/path/to/cript/),甚至尝试使用www.-data的所有权限(www.-data ALL=(ALL: ALL)ALL)都不起作用。

我确实认为这可能是因为我试图运行的脚本涉及启动SSH会话,但我甚至无法使用本地命令在/home/pi/目录或/var/www/html中创建空白文件。

我已经把我试图运行的脚本和我用来调用脚本的PHP以及我用来尝试其他命令的第二个PHP文件放在下面。

任何正确方向的帮助或指点都将不胜感激。我认为脚本正在运行,但它在某个地方失败了,我不知道在哪里。我在web浏览器中得到的唯一东西是echo$username行,因此我知道它部分工作,但当我尝试执行命令时,什么也没有发生。

PHP脚本:

<?php
   $username = posix_getpwuid(posix_geteuid())['name'];
   echo $username;
   exec("/home/pi/scripts/switch2off");
?>

测试脚本:

<?php
  exec("touch /var/www/html/s/test.txt");
?>

SWITCH2OFF脚本

#! /bin/bash
ssh pi@example 'python /home/pi/switches/switch_2_off.py'

NGINX配置:


limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
        listen 80;
        listen [::]:80;
        return 301 https://$server_name$request_uri;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name example.com;

        location /.well-known/ {
                allow all;
        }
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name example.com;

        include snippets/ssl-example.conf;
        include snippets/ssl-params.conf;

        root /var/www/html;

        location / {
                limit_req zone=one burst=5;
                root /var/www/html;
                auth_basic "Please Log In";
                auth_basic_user_file /etc/nginx/.htpasswd;
                proxy_set_header X-Content-Type-Options: nosniff;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                add_header X-Frame-Options "allow-from example.com";
        }

        location /.well-known/ {
                allow all;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

}

server {
    error_page 401 403 404 /404.html;
}

PHP-FPM日志:


[03-Aug-2020 05:00:01] NOTICE: Terminating ...
[03-Aug-2020 05:00:01] NOTICE: exiting, bye-bye!
[03-Aug-2020 05:00:29] NOTICE: fpm is running, pid 620
[03-Aug-2020 05:00:29] NOTICE: ready to handle connections
[03-Aug-2020 05:00:29] NOTICE: systemd monitor interval set to 10000ms


我的研究/我尝试过的事情:

Nginx提供服务。php文件作为下载,而不是执行它们-我从这里开始,因为最初我遇到了配置问题,它不是运行php脚本,而是将它们作为下载。

运行一个带有html按钮的shell脚本-这就是我从中获得PHP脚本代码的地方

PHP代码没有被执行,相反,代码显示在页面上——这和我看到的问题不太一样。即使在查看源代码时,web浏览器也不会显示php文件中的任何代码

https://askubuntu.com/questions/520566/why-wont-this-php-script-execute-bash-script

https://unix.stackexchange.com/questions/115054/php-shell-exec-permission-on-linux-ubuntu

https://www.linode.com/docs/web-servers/nginx/serve-php-php-fpm-and-nginx/

共有1个答案

别帅
2023-03-14

谢谢你的帮助。我发现了问题。它不是用PHP或NGINX实现的。/var/www/上的所有者。由于某种原因,ssh被设置为pi。我已将其更改为www-data,脚本现在已从网页开始工作。我仍然不确定为什么我的第二个创建文件的脚本不起作用(可能是权限问题),但我在试验中发现其他命令也能起作用(如ls),这让我回想起它一定是某个地方的权限错误。

因此,我回顾了所有的脚本和文件夹,并进行了检查,结果是。ssh文件夹。快速的chown解决了这个问题。

再次感谢您的建议和帮助!

 类似资料:
  • 我试图从一个简单的BASH脚本执行一个简单的PHP脚本。这个网站上的答案不能回答我的问题。 这是我的BASH脚本 这是我的PHP脚本 从命令行运行BASH脚本时,出现以下错误。 我试过键入/usr/bin/php-q/home/username/subfolder/durable2。这很好。它跑起来了

  • 问题内容: 我想从PHP脚本执行系统上存在的Bash脚本。我的系统上有两个脚本。其中一个是称为at at 的PHP脚本,另一个是称为at at 的Bash脚本。 我的client.php脚本看起来像 我的睾丸看起来像 当我在终端上执行以下操作时 我在终端上得到以下输出 但是当我在打开页面时 我得到以下输出 即使执行了chmod + x testscript,我仍然收到此错误。 我如何从浏览器中获取

  • 问题内容: 假设我在网址“ http://mywebsite.com/myscript.txt”处有一个包含脚本的文件: 而且我想先运行该脚本而不先将其保存到文件中。我该怎么做呢? 现在,我已经看到了语法: 但这似乎不像我保存到文件然后执行时那样。例如,readline不起作用,而输出仅为: 同样,我尝试过: 具有相同的结果。 最初我有一个解决方案,例如: 但这似乎草率,我想要一个更优雅的解决方案

  • 问题内容: 我试图找出一种从Golang执行脚本(.sh)文件的方法。我发现了几种简单的执行命令的方法(例如os / exec),但是我要执行的是执行整个sh文件(该文件设置了变量等)。 为此,使用标准的os / exec方法似乎并不简单:尝试输入“ ./script.sh”并将脚本内容加载到字符串中都不能用作exec函数的参数。 例如,这是我要从Go执行的sh文件: 从Go程序中: 其中mong

  • 问题内容: 要使Node.js Web服务器功能(如Apache)执行PHP脚本,需要执行哪些步骤?有什么方法可以将PHP集成到Node.js中? 注意:我不想直接在Node.js中执行PHP脚本,而是通过Apache实例或类似的东西“路由”。 问题答案: Node.js仅支持JavaScript。这是关于如何使PHP与Node.js一起运行的教程。 http://blog.mixu.net/20

  • 问题内容: 我在树莓派上有一个带有2个按钮(打开和关闭)的PHP网页,“打开”按钮重定向到On.php,“关闭”按钮重定向到Off.php在“ / usr / lib / cgi-bin”中,我有一个python脚本我想执行(script.py),我可以通过在终端上键入以下内容来完美地执行它 如果我从终端执行此操作,它将起作用。 问题是我的“ / var / www”文件夹中的PHP文件(On.p