php shell_exec()命令无法正常工作

4ioopgfo  于 2022-12-17  发布在  PHP
关注(0)|答案(8)|浏览(341)

我正在尝试运行一个.sh文件从php。我尝试这样做与shell_exec()。但它不工作,我参考了许多问题,这在堆栈溢出,但无法解决
我的php代码是(web.php)

<?php
    echo shell_exec('/var/www/project/xxe.sh');
    echo "done";
    ?>

只打印已完成的。但它是从终端工作(php/var/www/project/web. php)
在www.example.com中xxe.sh我调用了一个python文件

python vin.py

我还将两个.sh n .py文件的文件权限更改为777,请帮助

7tofc5zh

7tofc5zh1#

如果你说它可以在终端上工作,而不能在apache上工作,那么apache的php.ini文件可能禁用了shell_exec()
请参见http://www.php.net/manual/en/ini.core.php#ini.disable-functions
apache的php.ini文件可能类似于

disable_functions=exec,passthru,shell_exec,system,proc_open,popen

从此列表中删除shell_exec并重新启动Web服务器,尽管这有安全风险,我不推荐这样做。

j8yoct9x

j8yoct9x2#

shell_exec可能不知道要在哪个目录中查找可执行文件的位置目录。在shell_exec之前,我解决了这个问题:

putenv('PATH=/usr/local/bin');

然后终端可以找到可执行文件。还要检查命令每一部分的权限,以确保apache用户有读和执行权限。

zy1mlcev

zy1mlcev3#

如果它在shell中运行良好,我认为apache是chroot的,所以php找不到/var/...
或者httpd用户的用户没有权限输入/var/...
如果你擅长PHP,打开dir /var/...和readdir(),检查目录是否存在,文件是否存在。
此问题可能对您有所帮助。scanning /home/ with opendir()

vohkndzv

vohkndzv4#

问题通常是当你在php中执行代码的时候,在很多linux发行版中它是以webservers用户www-data的身份运行的。通常这个用户没有设置一个环境,因此没有PATH。通过在你的文件中使用完整的路径,你通常可以克服这个问题。
xxe.sh

/usr/bin/python /path/to/script/vin.py
qncylg1j

qncylg1j5#

试图运行由github接收后webhook触发的脚本时。
下面是我的项目目录所在的位置(克隆的git repo):

/var/www/html/my-repo

我在上面的目录中创建了一个名为webhook.php的脚本:

<?php
#webhook.php

$cmd = shell_exec("git pull 2>&1");

#for debugging
echo $cmd;
?>

在/var/www/html中执行以下命令

sudo chown www-data:www-data -R my-repo/

转到http://www.myserver.com/my-repo/webhook.php进行测试
将脚本的路径添加到github webhook。

mspsb9vt

mspsb9vt6#

我在这个问题上纠缠了好几个小时。
我已经想到了一个解决方案。1.将你的脚本移动到一个python文件“script.py“中,并将这个文件放置在你的服务器根目录下。2. shell_exec(“python script.py”);
不管怎么说,这对我有用。

5gfr0r5j

5gfr0r5j7#

在我的主机上,我不得不给予我的php文件一个不同的路径来执行shell_exec()。这不工作shell_exec('/usr/bin/php backgroundtask.php');
而这个做shell_exec('/opt/php/php-5.5.0/bin/php backgroundtask.php');
您可以访问this Reference.

gajydyqb

gajydyqb8#

我有同样的问题,因为PHP反斜杠。
PHP转义反斜杠,因此到达shell的命令

'COPY E:path1\path2\file.prn /B \127.0.0.1\"PRINTER NAME"'

所以我这样下命令

'COPY E:\\path1\\path2\\file.prn /B \\\\127.0.0.1\"PRINTER NAME"'.

必须对反斜杠进行双转义:一次用于PHP,一次用于shell。

相关问题