理清PHP在Linxu下执行时的文件权限方法


Posted in PHP onJune 07, 2017

一、文件权限及所属

1、文件有三种类型的权限,为了方便期间,可以用数字来代替,这样可以通过数字的加减,用一个数字就能标识这个文件的权限了,例如7=4+2+1,表示读写执行3个权限都有,6=4+2,表示有读写权限没有执行权限等等

理清PHP在Linxu下执行时的文件权限方法

2、联想web应用的rbac权限管理等,linux下同样有用户权限的管理,用户有用户名和用户组,一般创建用户时同时会创建同名的用户所属组。

先root账号登录随便新建一个目录和一个文件

#新建目录
mkdir abc
#新建文件
touch abc.txt
#查看
ls -all

查看时会发现:

#d开头的为目录,-开头为文件,还有l开头的为连接等
drwxr-xr-x  2 root root 4096 Jun 6 10:23 abc
-rw-r--r--  1 root root  0 Jun 6 10:23 abc.txt

先看上方蓝色的部分,第一位为标识符,去掉第一位,后面每三位分隔,以abc文件夹为例:d | rws | r-x | r-x

理清PHP在Linxu下执行时的文件权限方法

所以abc文件夹中表示owner拥有rwx(7),group拥有rx(5),other拥有rx(5)。

同样上方文件中红色的部分,依次为所有者的名称和所属组的名称,也就是abc文件夹的所有者为root,所属组为root。此时:

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

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

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

二、文件各权限的作用

本来还想边测试边说,但是太麻烦了,直接说结果吧。可以自己新建一个用户,然后修改权限来自己测试下。

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(或者shell等)无论是命令行执行还是web端执行,名为执行,实际上是读取文件到php内核中取解析,所以只要有读取权限(r)就可以。

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

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

三、php执行时的权限

我们自己在ssh连接linux操作时必须要有个用户名才能登录操作,同样php要想处理php相关的文件,也是在某个用户下操作的,而用户是在哪里创建或定义的呢,一般会是在安装php环境时创建的,例如apache,nginx等环境都会默认创建用户和用户组,而php的读取时就用此用户来读取,可以通过查看配置文件来确认:

#apache在配置文件httpd.conf
User www
Group www
#nginx在配置文件nginx.conf
user www www;

或者是通过命名查看进程:

#查看apache进程
ps -ef|grep httpd
#查看nginx进程
ps -ef|grep nginx
#查看php-pfm进行
ps -ef|grep php-pfm

以apache为例会显示:

root   1663   1 0 09:14 ?    00:00:00 /www/wdlinux/apache/bin/httpd//主进程
www    1697 1663 0 09:14 ?    00:00:05 /www/wdlinux/apache/bin/httpd//子进程
www    1698 1663 0 09:14 ?    00:00:05 /www/wdlinux/apache/bin/httpd

第一行就是显示的哪个用户在执行它,主要看非root下的。上方说明是www用户在运行apache进程来处理php文件。

这里需要注意的是,如果有安装php-pfm,则应该还需要查看php-pfm执行时的用户名及用户组。(没有安装,所以没实践过)

默认的可能是nobody或者apache等其它的用户及用户组,上方是已修改过的。此时应该在网站目录中用ls-all来确认下网站文件是属于哪个用户,分几种情况说明下吧:

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什么的,还需要确认程序的执行者和网站的所有者才能确定权限。

目前好多集成环境为了省事(嗯,lanmpv3等),将php的执行权限和网站所在目录都设置为www,此时一般创建完目录后为755,创建文件后为644,当php执行时,起作用的目录权限为7(所有目录拥有创建删除权限)和文件权限6(所有文件具有写权限),这种是不是挺不安全的?正常应该是目录为5,文件为4,当有特殊需求时才将权限设为7。如果出现上方说的这种情况,修改的方法一是修改apache/nginx的用户和用户组,二是修改网站文件的所有者和所有组这两个方向来修改,以确保网站的安全。

以上,只是基础的权限说明。

以上这篇理清PHP在Linxu下执行时的文件权限方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP伪静态写法附代码
Jun 20 PHP
phpinfo 系统查看参数函数代码
Jun 05 PHP
php 中英文语言转换类
Sep 07 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
Nov 12 PHP
php数组中包含中文的排序方法
Jun 03 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
php图片处理函数获取类型及扩展名实例
Nov 19 PHP
php查看当前Session的ID实例
Mar 16 PHP
Centos6.5和Centos7 php环境搭建方法
May 27 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
May 09 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 #PHP
PHP面向对象之事务脚本模式(详解)
Jun 07 #PHP
PHP框架自动加载类文件原理详解
Jun 06 #PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 #PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 #PHP
解决php-fpm.service not found问题的办法
Jun 06 #PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 #PHP
You might like
PHP安全配置
2006/10/09 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python中stdout输出不缓存的设置方法
2014/05/29 Python
python人民币小写转大写辅助工具
2018/06/20 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
医学生个人求职信范文
2013/09/24 职场文书
2014年度思想工作总结
2014/11/27 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python
DIY胆机必读:各国电子管评价
2022/04/06 无线电
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL
Ruby处理CSV数据方法详解
2022/04/18 Ruby
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers