理清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中的加密功能
Oct 09 PHP
PHP个人网站架设连环讲(三)
Oct 09 PHP
php函数与传递参数实例分析
Nov 15 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
Jul 28 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
Composer设置忽略版本匹配的方法
Apr 27 PHP
php将文件夹打包成zip文件的简单实现方法
Oct 04 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
安装docker和docker-compose实例详解
Jul 30 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
Jan 22 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 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
一个简易需要注册的留言版程序
2006/10/09 PHP
php 定义404页面的实现代码
2012/11/19 PHP
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
Python实现字典依据value排序
2016/02/24 Python
python:socket传输大文件示例
2017/01/18 Python
Python生成器以及应用实例解析
2018/02/08 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
django Admin文档生成器使用详解
2019/07/22 Python
python支持多继承吗
2020/06/19 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
合伙协议书
2014/04/23 职场文书
小学德育工作总结2015
2015/05/12 职场文书
《开国大典》教学反思
2016/02/16 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python