2014-10-02 63 views
1

我最近在我的Linux机器上设置了我的Apache2服务器。现在我想执行一个PHP脚本(index.php),该脚本运行一个shell脚本(foo.sh),该脚本在我的主目录中创建一个文件夹,但该目录未创建。“exec('sh foo.sh')”in PHP not working

这些都是原来的两个文件:

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命令?

+0

Apache用户可能没有写入主目录的权限。 – arco444 2014-10-02 11:02:56

+0

要非常小心 - 你可能会将自己暴露在“shellshocked”的bug中! – 2014-10-02 11:10:22

回答

1

这确实很可能是一个权限问题。

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

当你想通了,确保apache用户在你的主目录中有适当的权利。您可以将其添加到您的用户组(使用usermod -a -G ...,然后chmod g+w ~)或允许编写所有用户(chmod o+w ~)。

但是,这是一个不好的想法。您的php脚本(或其他以apache用户身份运行的脚本)可能会被分解并破解,从而让您的主目录开放供恶意攻击者修改和使用。另外,如果你正在运行一个RedHat-ish Linux,你的运行到SELinux中,通过defaut它可以阻止apache访问用户目录。在这种情况下,您还必须设置setsebool -P httpd_enable_homedirs on

而是,我会建议您使用不同的目录并为您的用户提供完全访问权限。沿着/var/www/testDir的路线,将apache作为所有者和组,并将自己添加到apache用户组可能是一个理智的想法。

0

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

-1

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

+0

PHP代码不会被允许在目标上执行chmod。目标位于''/ home'',它是(在任何配置合理的Linux上),例如''drwxr-xr-x root root''。没有apache用户(除非apache以root身份运行,并且没有SELinux,否则它将被允许写入''/ home/lorenzo'')被允许改变那里的任何东西。 – 2014-10-02 11:11:31

+0

@JonasWielicki我的意思是在php中也有一个函数。但是,您是否在我的答案中尝试了FIRST解决方案?在ssh shell中(如果它在外部服务器上运行),您必须能够从terminnal更改权限。如果它从你的机器上运行,你可以执行'sudo chmod -R 775 '或'sudo -i',然后执行chmod。注意:如果你被定义为sudoer,'sudo -i'授予你root权限,所以我建议你这样做。 – 2014-10-02 11:30:38

+0

我知道,从壳,它会工作(否则,我会downvoted)。我只想说,你不能从PHP脚本中做到这一点。 – 2014-10-02 11:51:24