繁体   English   中英

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

[英]Permission denied despite appropriate permissions using 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

阿帕奇配置

配置为遵循符号链接( 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

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

您的目录需要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/bar0777权限,如果目录没有执行权限,则拒绝读取其内容。

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

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

chmod o+x /var/lib/jenkins

应该做的伎俩。

(注意: ls -lhd /var/lib/jenkinsls -lh ...|grep jenkins

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

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

很可能您的 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. 相应地调整权限:

好吧,在这一步中,我将把它留给您,您可以(a)在此示例中使用 make apache 用户“john” 或者您可以(b)将 Web 文件夹移动到家外的地方 可以在不破坏安全良好实践的情况下将执行访问权限授予组甚至其他人。

一种。 使 apache 用户成为 john(仅适用于开发站点或如果您知道自己在做什么)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM