2015-10-02 179 views
4

我一直在敲打我的腦袋相當長一段時間的,因爲現在這個...PHP:文件的寫權限

我想我的虛擬服務器(CentOS的7上安裝MyBB的論壇,Apache HTTP服務器, PHP 5.4.3),我遇到了文件權限問題。 MyBB需要兩個文件可寫,其中一個是config.php,第二個是settings.php,它們都在目錄inc中。

我設置的權限上這兩個文件爲666我寫了一個簡單的測試PHP頁面模仿的能力的方式MyBB的測試,以寫:

<?php 
echo('config: '); 
$configwritable = @fopen('forum/inc/config.php', 'w'); 
if ($configwritable) { 
     echo('yes'); 
} else { 
     echo('no'); 
} 
echo('<br/>'); 
echo('settings: '); 
$configwritable = @fopen('forum/inc/settings.php', 'w'); 
if ($configwritable) { 
    echo('yes'); 
} else { 
    echo('no'); 
} 
?> 

頁輸出

config: no 
settings: yes 

但如果我列出的文件,它們顯示出這樣的

[email protected]# ls -l forum/inc/config.php forum/inc/settings.php 
-rw-rw-rw-. 1 krkavec krkavec 0 2. říj 22.49 forum/inc/config.php 
-rw-rw-rw-. 1 krkavec krkavec 0 2. říj 22.51 forum/inc/settings.php 

這怎麼可能?這兩個文件屬於同一用戶,同一組,具有相同的大小(零),在同一個目錄中,具有相同的權限,幾乎具有相同的修改時間(相差兩分鐘),幾乎除了其他所有內容他們的名字是相同的。

爲了讓事情更不可思議,我試圖玩弄刪除並重新創建文件,觀看:

1:刪除這兩個文件

[email protected]# rm -f forum/inc/config.php forum/inc/settings.php 

和頁面輸出:

config: no 
settings: no 

這是可以的,因爲inc目錄不應該是可寫的。

2:創建settings.php

[email protected]# F=forum/inc/settings.php ; touch $F ; chown krkavec:krkavec $F ; chmod 666 $F 
[email protected]# ls -l forum/inc/settings.php forum/inc/config.php 
ls: cannot access forum/inc/config.php: No such file or directory 
-rw-rw-rw-. 1 krkavec krkavec 0 2. říj 23.15 forum/inc/settings.php 

和頁面輸出:

config: no 
settings: yes 

這是完全正常和預期 - 該文件是存在的,並且具有可寫權限。

3:創建config.php

[email protected]# F=forum/inc/config.php ; touch $F ; chown krkavec:krkavec $F ; chmod 666 $F 
[email protected]# ls -l forum/inc/settings.php forum/inc/config.php 
-rw-rw-rw-. 1 krkavec krkavec 0 2. říj 23.23 forum/inc/config.php 
-rw-rw-rw-. 1 krkavec krkavec 0 2. říj 23.15 forum/inc/settings.php 

和頁面輸出:

config: no 
settings: yes 

BAM!我完全希望配置是可寫的。

任何幫助,非常感謝。

EDIT:我根據馬克·B的和drew010的建議

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

echo('config var_dump: '); 
var_dump(stat('forum/inc/config.php')); 
echo('<br/>config: '); 
$configwritable = fopen('forum/inc/config.php', 'w'); 
if ($configwritable) { 
    echo('yes'); 
} else { 
    echo('no'); 
} 
echo('<br/>'); 
echo('settings var_dump: '); 
var_dump(stat('forum/inc/settings.php')); 
echo('<br/>settings: '); 
$configwritable2 = fopen('forum/inc/settings.php', 'w'); 
if ($configwritable2) { 
    echo('yes'); 
} else { 
    echo('no'); 
} 
?> 

以及頁的輸出(與存在兩個文件)修改的測試頁是:

config var_dump: array(26) { [0]=> int(64768) [1]=> int(19155212) [2]=> int(33206) [3]=> int(1) [4]=> int(1000) [5]=> int(1000) [6]=> int(0) [7]=> int(0) [8]=> int(1443821772) [9]=> int(1443821772) [10]=> int(1443821772) [11]=> int(4096) [12]=> int(0) ["dev"]=> int(64768) ["ino"]=> int(19155212) ["mode"]=> int(33206) ["nlink"]=> int(1) ["uid"]=> int(1000) ["gid"]=> int(1000) ["rdev"]=> int(0) ["size"]=> int(0) ["atime"]=> int(1443821772) ["mtime"]=> int(1443821772) ["ctime"]=> int(1443821772) ["blksize"]=> int(4096) ["blocks"]=> int(0) } 
config: 
Warning: fopen(forum/inc/config.php): failed to open stream: Permission denied in /var/www/html/test.php on line 8 
no 
settings var_dump: array(26) { [0]=> int(64768) [1]=> int(19155069) [2]=> int(33206) [3]=> int(1) [4]=> int(1000) [5]=> int(1000) [6]=> int(0) [7]=> int(0) [8]=> int(1443821763) [9]=> int(1443823158) [10]=> int(1443823158) [11]=> int(4096) [12]=> int(0) ["dev"]=> int(64768) ["ino"]=> int(19155069) ["mode"]=> int(33206) ["nlink"]=> int(1) ["uid"]=> int(1000) ["gid"]=> int(1000) ["rdev"]=> int(0) ["size"]=> int(0) ["atime"]=> int(1443821763) ["mtime"]=> int(1443823158) ["ctime"]=> int(1443823158) ["blksize"]=> int(4096) ["blocks"]=> int(0) } 
settings: yes 
+0

您是否測試了另一個變量名?例如'configwritable2'?另外,省略@ -sign。 – Jan

+0

開始調試。 'var_dump(stat('forum/inc/config.php'))',並且備份文件系統鏈,直到事情開始有意義。 –

+0

第一步:刪除@標誌 – Michael

回答

2

對於一些神奇,不明原因,當我將settings.php更名爲config.php,然後創建新的settings.php並正確設置權限時,兩個文件都是可寫的。

但是,我不知道爲什麼該文件必須重命名。結果與問題中描述的步驟3之後的結果相同,只不過它起作用。

任何建議爲什麼要完成這頂帽子和背後的原因是非常受歡迎的。

編輯:它是由SELinux安全上下文造成的,它阻止了apache寫入文件。運行chcon -t httpd_sys_rw_content_t config.php解決了這個問題。

+0

您有我的投票。 – revo