2011-08-04 81 views
12

我試圖讀取一個PHP文件,我得到一個權限被拒絕的錯誤,雖然每個人都有讀取權限的文件。權限被拒絕,儘管適當的權限使用PHP

的PHP代碼:

$config=file_get_contents('/opt/jenkins/home/config.xml'); 

錯誤:

Warning: file_get_contents(/opt/jenkins/home/config.xml): failed to open stream: Permission denied in [...] 

文件系統權限:

有指向/opt/jenkins/home//var/lib/jenkins,每一個符號鏈接正文已經讀取了符號鏈接,實際文件夾和文件的權限。

$ ls -lh /opt/jenkins/ 
lrwxrwxrwx 1 sysadmin sysadmin 16 2011-08-04 08:12 home -> /var/lib/jenkins 

$ ls -lh /var/lib/ | grep jenkins 
drwxr-xr-- 6 jenkins adm  4.0K 2011-08-04 10:04 jenkins 

$ ls -lh /var/lib/jenkins/config.xml 
-rwxr-xr-- 1 jenkins adm 3.9K 2011-08-04 10:05 /var/lib/jenkins/config.xml 

Apache配置

配置爲folllow符號鏈接(Options All)。爲/var/lib/jenkins/添加Directory指令沒有區別。

<Directory /opt/jenkins/home/> 
     Options All 
     AllowOverride All 
     Order Allow,Deny 
     Allow from All 
</Directory> 

其他信息

無論我使用的路徑通過符號鏈接("/opt/jenkins/home/config.xml")或實際路徑("/var/lib/jenkins/config.xml")我有同樣的問題。

apache2 version=2.2.14-5ubuntu8.4 
php version=5.3.2-1ubuntu4.9 

任何想法爲什麼我得到錯誤?

+1

['is_writable()'](http://php.net/manual/en/function.is-writable.php)返回'FALSE'? – alex

+0

是配置爲遵循符號鏈接的apache嗎? afaik有一個SymLink選項 – knittl

+0

感謝您的評論,但請仔細閱讀該問題(我想閱讀該文件,是的,Apache配置遵循符號鏈接)。 – Max

回答

11

您的目錄需要execute權限才能正常工作。它似乎並不具有世界執行,並自jenkins可能不是apache用戶和apache用戶不是adm組中,這是行不通的:

$ ls -lh /var/lib/ | grep jenkins 
drwxr-xr-- 6 jenkins adm  4.0K 2011-08-04 10:04 jenkins 

每例如:

[email protected]:~$ mkdir foo 
[email protected]:~$ echo hello > foo/bar 
[email protected]:~$ chmod 777 foo/bar 
[email protected]:~$ ls -lsah foo/bar 
4.0K -rwxrwxrwx 1 netcoder netcoder 6 2011-08-04 08:22 foo/bar 
[email protected]:~$ chmod 444 foo/ 
[email protected]:~$ ls -lsah | grep foo 
4.0K dr--r--r-- 2 netcoder netcoder 4.0K 2011-08-04 08:22 foo 
[email protected]:~$ cat foo/bar 
cat: foo/bar: Permission denied 

儘管foo/bar具有0777權限,但如果該目錄沒有執行權限,則讀取其內容將被拒絕。

您需要爲目標目錄和符號鏈接設置權限。

+0

因此,他需要在真正的目錄或符號鏈接上設置執行權限? –

+0

@Clement Herreman:兩者。編輯答案。 :) – netcoder

+0

它**必須設置在兩個或他在'file_get_contents()'中使用的那個? –

7

您需要在層次結構中的所有目錄上設置執行位,直到該文件。

chmod o+x /var/lib/jenkins 

應該這樣做。

(注:ls -lhd /var/lib/jenkins是有點比ls -lh ...|grep jenkins更好)

+0

正確。 +1爲ls -d。 – Max

0

最有可能你的apache用戶讀不準或訪問網絡文件

  1. 檢查哪些用戶正在運行Apache爲:

    $ ps aux | grep [a]pache 
    root  40283 0.0 0.2 472548 21116 ?  Ss 14:38 0:00 /usr/sbin/apache2 -k start 
    www-data 40287 0.0 0.1 472760 8800 ?  S 14:38 0:00 /usr/sbin/apache2 -k start 
    www-data 40288 0.0 0.1 472760 8540 ?  S 14:38 0:00 /usr/sbin/apache2 -k start 
    www-data 40289 0.0 0.1 472776 8540 ?  S 14:38 0:00 /usr/sbin/apache2 -k start 
    
  2. 檢查你的web文件的路徑所有權:

    $ namei -mol /home/john/app2/ 
    f: /home/john/app2/ 
    drwxr-xr-x root root/
    drwxr-xr-x root root home 
    drwx------ john john john   # <== Ahaa, no access for apache user! 
    drwxr-xr-x john john john app2 
    
  3. 調整權限,因此:

那麼在這一步,我將把它留給你,您可以(一)的讓Apache用戶「約翰」在這個例子中。或者你可以(b)移動web文件夾到家庭以外的地方。如果可以在不破壞安全良好實踐的情況下向團隊或甚至其他人授予執行訪問權限。

a。使apache用戶john(僅適用於DEV站點或者如果您知道您在做什麼)

sudo vi /etc/apache2/envars 
# replace 
export APACHE_RUN_USER=www-data 
export APACHE_RUN_GROUP=www-data 
# with 
export APACHE_RUN_USER=john 
export APACHE_RUN_GROUP=john 

b。將該文件夾移出家中...無論如何,它在那裏做什麼?

sudo mv /home/john/app2 /var/www/ 

請記住要更改站點以匹配此目錄並重新啓動Apache服務器。

這裏有一些參考文獻:

https://wiki.apache.org/httpd/13PermissionDenied

http://wiki.apache.org/httpd/FileSystemPermissions