";exec(';sh foo.sh';)”;在PHP中不起作用


"exec('sh foo.sh')" in PHP not working

我最近在Linux机器上安装了Apache2服务器。现在我想执行一个PHP脚本(index.PHP),它运行一个shell脚本(foo.sh),它在我的主目录中创建一个文件夹,但目录没有创建。

这是原始的两个文件:

foo.sh:

#!bin/bash
mkdir /home/lorenzo/testDir

index.php:

<?php
exec('sh test.sh');
?>

所以,我认为问题的出现可能是因为特权或其他原因,事实上,在我将文件更改为之后

foo.sh:

#!bin/bash
echo "Hello world"

index.php:

<?php
$temp=exec('sh test.sh');
echo $temp;
?>

我在我的网站上看到了输出Hello World

因此,PHP脚本被执行,并运行shell脚本。但是为什么shell脚本不能执行mkdir命令呢?

这很可能是权限问题。

首先你必须弄清楚apache运行在哪个用户上。这通常是www-data(在Debian ish Linux上,如Ubuntu)或apache(在RedHat ish Linux上)或类似的东西。ps -eF | grep apache将显示用户。

在您弄清楚之后,请确保apache用户在您的主目录中具有适当的权限。您可以将其添加到用户组(使用usermod -a -G ...,然后使用chmod g+w ~),也可以允许为所有用户进行写入(chmod o+w ~)。

但是,这两者都是一个糟糕的想法。您的php脚本(或以apache用户身份运行的任何其他脚本)可能会被入侵和破解,使您的主目录打开,供恶意攻击者修改和rm -rf

此外,如果您运行的是RedHat风格的Linux,运行到SELinux,默认情况下,SELinux会阻止apache访问用户目录。在这种情况下,您还必须设置setsebool -P httpd_enable_homedirs on

相反,我建议您使用不同的目录,并允许用户完全访问该目录。按照/var/www/testDir的思路,将apache作为所有者和组,并将自己添加到apache用户组可能是一个明智的想法。

这看起来像是一个权限问题。确保Apache具有对该目录的写入权限

您可能在服务器上存在权限问题。尝试在ssh命令行中使用chmod -R 775 <dirname>(or 777)。你也可以用chmod()在php代码中这样做,但我不建议你这样做,因为它会在每次php代码运行时运行它,而多次更改它是毫无意义的。它可以输出到屏幕上,但我敢打赌脚本想要制作文件的目录具有755权限。试着检查一下。