php shell_exec()命令不起作用

use*_*038 17 php shell python-2.7

我试图从PHP运行.sh文件.我尝试用shell_exec()来做.但它不起作用我在堆栈溢出中提到了许多与此相关的问题,但无法解决

我的PHP代码是(web.php)

    <?php
    echo shell_exec('/var/www/project/xxe.sh');
    echo "done";
    ?>
Run Code Online (Sandbox Code Playgroud)

只打印完成.但它是从终端工作(php /var/www/project/web.php)

在xxe.sh中我调用了一个python文件

    python vin.py
Run Code Online (Sandbox Code Playgroud)

我也将.sh n .py文件的文件权限更改为777,请帮忙

小智 7

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

putenv('PATH=/usr/local/bin');
Run Code Online (Sandbox Code Playgroud)

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


Jes*_*ase 5

问题通常是,当您从 php 中执行代码时,它会作为许多 Linux 发行版中的网络服务器用户 www-data 运行。通常该用户没有设置环境,因此没有 PATH。通过在文件中使用完整路径,通常可以克服这个问题。

xxe.sh

/usr/bin/python /path/to/script/vin.py
Run Code Online (Sandbox Code Playgroud)


Jas*_*Heo 5

如果它在 shell 中运行良好,我认为 apache 已经被 chroot 了。所以php找不到/var/...

或者httpd用户的用户没有权限进入/var/...

如果你擅长 PHP。打开 dir /var/... 并 readdir() 并检查目录是否存在并检查文件是否存在。

这个问题可能对你有帮助。使用 opendir() 扫描 /home/

  • 不是来自 shell,使用 diropen() 和 readdir() 在 php 中列出目录,并通过 web 打开 php。这是检查 apache 是否可以查看 /var/... 的方法。如果您不知道如何查看目录列表,请谷歌 (2认同)

Sam*_*amV 5

如果您说它在终端上有效,而不在apache上有效,则apache的php.ini文件可能会禁用shell_exec()

参见http://www.php.net/manual/zh/ini.core.php#ini.disable-functions

您的apache php.ini文件可能看起来像

disable_functions=exec,passthru,shell_exec,system,proc_open,popen
Run Code Online (Sandbox Code Playgroud)

shell_exec从此列表中删除并重新启动Web服务器,尽管这存在安全隐患,我不建议这样做。

  • 没有disable_function不包含shell_exec或exec (2认同)