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

Max*_*Max 14 php apache permissions file

我正在尝试用PHP读取文件,虽然每个人都有对该文件的读取权限,但我收到了一个权限被拒绝的错误.

PHP代码:

$config=file_get_contents('/opt/jenkins/home/config.xml');
Run Code Online (Sandbox Code Playgroud)

错误:

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

文件系统权限:

有一个符号链接指向/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
Run Code Online (Sandbox Code Playgroud)

Apache配置

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

<Directory /opt/jenkins/home/>
        Options All
        AllowOverride All
        Order Allow,Deny
        Allow from All
</Directory>
Run Code Online (Sandbox Code Playgroud)

附加信息

无论我使用通过符号链接("/opt/jenkins/home/config.xml")或真实路径("/var/lib/jenkins/config.xml")的路径,我都有同样的问题.

apache2 version=2.2.14-5ubuntu8.4
php version=5.3.2-1ubuntu4.9
Run Code Online (Sandbox Code Playgroud)

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

net*_*der 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
Run Code Online (Sandbox Code Playgroud)

每个例子:

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
Run Code Online (Sandbox Code Playgroud)

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

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


Mat*_*Mat 7

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

chmod o+x /var/lib/jenkins
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.

(注意:ls -lhd /var/lib/jenkins有点好ls -lh ...|grep jenkins)


jps*_*der 5

许多现代机器(数字海洋、机架空间等)都带有用于 RedHat 兼容操作系统(如 CentOS)的 SELinux(安全增强型 Linux)。这将另一个扳手投入到您需要牢记的工作中。您可以完美设置您的权限,但它仍然会说权限被拒绝。你需要为 SELinux 定义一个可写的上下文:

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