尽管使用PHP有适当的权限,但权限被拒绝

时间:2011-08-04 12:19:11

标签: php apache file permissions

我正在尝试用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配置

配置为删除符号链接(Options All)。为Directory添加/var/lib/jenkins/指令没有任何区别。

<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

我知道为什么会收到错误吗?

4 个答案:

答案 0 :(得分:12)

您的目录需要execute权限才能生效。它似乎没有世界执行,并且因为jenkins可能不是apache用户,并且apache用户不在adm组中,所以它不起作用:

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

每个例子:

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

即使foo/bar具有0777权限,如果目录没有执行权限,也会拒绝读取其内容。

您需要为目标目录和符号链接设置权限。

答案 1 :(得分:7)

您需要在层次结构中的所有目录上设置执行位,直到该文件。

chmod o+x /var/lib/jenkins

应该这样做。

(注意:ls -lhd /var/lib/jenkins略好于ls -lh ...|grep jenkins

答案 2 :(得分:3)

许多用于RedHat兼容OS(​​例如CentOS)的SELinux(安全增强型Linux)附带了许多现代包装箱(数字海洋,机架空间等)。这为您需要牢记的工作又添了麻烦。您可以完全设置权限,但仍会显示拒绝权限。您需要为SELinux定义可写上下文:

sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite -R

答案 3 :(得分: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. 检查网络文件的路径所有权:

    $ 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. 相应地调整权限:

  4. 在这一步中我会留给你,你可以(a) make apache用户&#39; john&#39;在这个例子中。或者您可以(b) 将网络文件夹移至主页以外的位置。在不破坏安全性良好做法的情况下,可以向组或甚至其他人提供执行访问权限。

    一个。使apache用户john(仅适用于DEV SITES或者如果你知道你在做什么)

    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
    

    湾将该文件夹移出家乡......无论如何它在那里做什么?

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

    请记住更改站点以匹配此目录并重新启动Apache服务器。

    以下是一些参考资料:

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

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