2011-08-04 63 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