php文件权限问题

以下整理来自PHP在Linxu下执行时的文件权限,结合自身的理解和疑惑

一、基本知识

文件有三种类型的权限,例如7=4+2+1,表示读写执行3个权限都有

用ll命令查看abc文件夹:


d开头的为目录,-开头为文件,还有l开头的为软链接等。第一位为标识符,去掉第一位,后面每三位分隔,则:d | rwx | r-x | r-x

上面abc文件夹表示owner拥有rwx(7),group拥有rx(5),other拥有rx(5

此时:

    a、如果是root用户来访问这个abc文件夹,相当与owner,拥有7的权限

    b、如果一个新的用户名test用户组为root来访问abc文件夹,则相当于group,拥有5的权限

    c、如果一个新的用户名test用户组为test的来访问abc文件夹,则相当与other,拥有5的权限

绿色文件: 可执行文件,可执行的程序 
红色文件:压缩文件或者包文件
蓝色文件:目录
白色文件:一般性文件,如文本文件,配置文件,源码文件等
浅蓝色文件:链接文件,主要是使用ln命令建立的文件(软链接,类似windows快捷方式)

绿色背景:共享的意思,最高权限

所以,决定权限:
1、哪个用户访问,是在以下哪个区间:owner、group、other
2、再看权限具体情况

二、文件权限的作用

这里分目录权限和文件权限

1、目录

  a、进入目录,即cd命令,所需要的权限为执行权限(x)

  b、查看目录内的文件,即ls命令,需要的权限为读取权限(r)

  c、创建删除目录内的文件夹/文件,即mkdir/touch命名,需要的权限为写如权限(w)

顺便说下目录只影响下一级的,隔代不影响(这点很重要),好比一个目录abc/sub/,如果abc没有w权限,但sub有w权限,则可以在sub中创建文件,当然abc也需要有x权限,否则都进不去更不用说创建了,但只要能进去(可以通过切换root管理员的方法),就不会再受abc的影响,只会受sub的影响。

一般我们目录会给5(rx)的权限,也就是读取和执行权限,只有图片上传或缓存等目录需要创建的才会给7(rwx)的权限

2、文件

  a、文件打开,可以用cat/vim命令打开,所需权限为读取权限(r)

  b、文件修改,可以用cat/vim命令打开并保存,所需权限为写入权限(w)

  c、文件执行,可以直接./abc.out等执行,所需要权限为执行权限(x)

这里需要说明的的是php无论是命令行执行(类似运行 php abc.php)还是web端执行,名为执行,实际上是读取文件到php内核中取解析,所以只要有读取权限(r)就可以,同样例如abc.sh,如果直接运行./abc.sh需要的是执行权限(x),但是运行 sh abc.sh 命令需要的是读取权限(r)。

一般我们文件会给4(r)权限,也就是读取权限,只有日志、缓存等需要向文件中写入内容的才会给6(rx)权限

之所以上方没有说755,777、644权限,而仅仅是是说单个的权限,是因为你的网站目录所属的权限不能确保与执行时所用的用户什么关系,也就是说执行时的用户可能是owner、可能是group也可能是other

三、php执行时的权限

一般情况下nginx、php-fpm所属都是 www:www(nginx配置文件、php-fpm配置文件里有配置user参数),用以下命令可以查看。属于同一个用户,一般应该属于同一个组~

ps aux | grep nginx

ps aux | grep php-fpm

groups www          //查看www用户属于哪个组

说明是www组的www用户再处理php文件。执行时所用的用户搞清楚了。

网站目录所属的权限去服务器查看即可。

分几种情况说明下:

a、例如网站所有者是这样:

drwxr-xr-x   2 www www 4096 Jun  6 10:23 system
drwxr-xr-x   2 www www 4096 Jun  6 10:23 tmp
-rw-r--r--   1 www www    0 Jun  6 10:23 index.php
...

网站所有者为www,而php执行者也为www,那说明是具有owner权限,上方system文件夹中755中的55根本不起作用,只要是7xx就会以 7(rwx)的权限来执行。

b、如果网站所有者是这样:

drwxr-xr-x   2 test www 4096 Jun  6 10:23 system
drwxr-xr-x   2 test www 4096 Jun  6 10:23 tmp
-rw-r--r--   1 test www    0 Jun  6 10:23 index.php
...

网站所有者为test,所属组为www,而php执行者为www,执行组为www,那说明是说在同一组中,具有group权限,上方system文件夹中755中的7和5不起作用,只要是x5x就会以5(rx)的权限来执行。

c、如果网站所有者是这样:

drwxr-xr-x   2 test test 4096 Jun  6 10:23 system
drwxr-xr-x   2 test test 4096 Jun  6 10:23 tmp
-rw-r--r--   1 test test    0 Jun  6 10:23 index.php
...

网站所有者为test,所属组为test,而php执行者为www,执行组为www,那说明是说根本没什么关系,具有other权限,上方system文件夹中755中的75不起作用,只要是xx5就会以5(rx)的权限来执行。

所以不能简单的说修改权限为755,644什么的,还需要确认程序的执行者和网站的所有者才能确定权限。

目前好多集成环境为了省事(嗯,lanmp、lnmp等),将php的执行权限和网站所在目录都设置为www,此时一般创建完目录后为755,创建文件后为644,当php执行时,起作用的目录权限为7(所有目录拥有创建删除权限)和文件权限6(所有文件具有写权限)

 

另外:

php在cli模式下的运行,一开始以为命令行`php xxx.php`这种命名是以PHP用户来运行,但实际上不是的,而是以当前用户来执行,类似在xxx.php文件中通过mkdir创建一个文件夹,生成的文件夹所属用户和组并不是php的www用户,而是当前身份的root用户。所以当涉及到通过cli命令来创建文件等时,需要修改到php的用户来执行,类似 `sudo -u www php xxx.php`,同样如果用到计划任务,在crontab中,也需要指定php的www用户来执行,否则就会创建出所属root用户的文件,然后如果普通的web操作还修改此文件,很容易会出现权限不足的情况

 

综上,php文件权限问题搞清楚几点:

1、nginx、php-fpm属于哪个组哪个用户(一般情况下是一致的,即 www :www)

2、是cli模式还是普通的web操作(不影响默认权限,但是影响文件或文件夹的所属。一般cli创建的所属 root : root)

3、需要操作的文件夹或者文件所属组以及所属用户

4、php代码创建文件或文件夹的权限(特别是层级创建的时候搞清除 、以及 搞清楚umask),一般创建完目录后为755,创建文件后为644

 

另外的疑问:具体谷歌百度搜索“有效用户”、“实际用户”、“setuid函数”等关键字

你可能感兴趣的:(php基础)