2014-10-02 187 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