php获取文件的权限信息(获取权限信息、返回字符串涵义、二进制的转换方式、权限修改)

news2024/12/28 20:03:52

php获取文件的权限信息

  • 说明
  • 1.获取文件的权限信息
  • 2.返回文件权限字符的解读
  • 3.转为二进制权限
  • 4.修改权限

说明

在这里插入图片描述
(图片来源于网络)

文件权限是指文件或目录对用户和其他进程的访问许可。在 Unix 和 Linux 系统中,文件和目录都有三个权限:读、写和执行。这三个权限分别用数字 1、2 和 4 表示。
例如,文件 file.txt 可能有以下权限:

-rwxr-xr-x 1 user group other

其中,rwx 表示用户可以读、写和执行文件;r-x 表示用户可以读和执行文件;r-- 表示用户只能读取文件;-x 表示用户不能执行文件。
文件权限通常用八进制数表示,例如 644,表示文件对用户和其他进程具有读、写和执行权限。在 Windows 系统中,文件权限通常用十六进制数表示,例如 0644。
在权限设置中,通常需要考虑以下几个方面:
用户:谁可以访问文件或目录?
组:哪些用户组可以访问文件或目录?
其他:如何控制其他进程对文件或目录的访问?
通过设置文件权限,可以保护文件和目录的安全性,同时也可以控制文件的使用方式。

1.获取文件的权限信息

PHP 中可以使用 fileperms() 函数来获取文件的权限信息。该函数可以接收一个文件名或者文件句柄作为参数,并返回一个表示当前文件权限的八进制数值。你可以利用八进制数对比对应的权限标记,来判断文件的读写权限。这是一段示例代码:

function getFilePermission($filename) {
    clearstatcache(true, $filename);
    $perms = fileperms($filename);
    if (($perms & 0xC000) === 0xC000) {
        $info = 's';
    } elseif (($perms & 0xA000) === 0xA000) {
        $info = 'l';
    } elseif (($perms & 0x8000) === 0x8000) {
        $info = '-';
    } elseif (($perms & 0x6000) === 0x6000) {
        $info = 'b';
    } elseif (($perms & 0x4000) === 0x4000) {
        $info = 'd';
    } elseif (($perms & 0x2000) === 0x2000) {
        $info = 'c';
    } elseif (($perms & 0x1000) === 0x1000) {
        $info = 'p';
    } else {
        $info = 'u';
    }

    $info .= (($perms & 0x0100) ? 'r' : '-');
    $info .= (($perms & 0x0080) ? 'w' : '-');
    $info .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-'));
    $info .= (($perms & 0x0020) ? 'r' : '-');
    $info .= (($perms & 0x0010) ? 'w' : '-');
    $info .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-'));
    $info .= (($perms & 0x0004) ? 'r' : '-');
    $info .= (($perms & 0x0002) ? 'w' : '-');
    $info .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-'));

    return $info;
}

// 使用示例
echo getFilePermission('example.txt'); // 返回 "-rw-rw-r--"

该函数将根据文件权限设置返回一个字符串表示文件权限。其中,第一个字符代表文件类型,后面九个字符分别代表文件拥有者、群组及其他人的读写权限,‘r’ 表示只读权限,‘w’ 表示可写权限,‘x’ 表示可执行权限, ‘-’ 表示无某种权限,通过这些字符的组合可以用来表示文件的全部权限信息。

2.返回文件权限字符的解读

返回结果:-rwxr-xr-x

-rwxr-xr-x,在Linux 系统中权限是区分用户的,即用户、组用户、其他用户,第一位表示文件的类型,-代表文件,d代表目录,其他每个用户占三个字符,这里-rwxr-xr-x对应如下关系

第一位用户组用户其他用户
-rwxr-xr-x

这是一个文件或目录的权限表示,一共由10个字符组成,从左到右依次表示:

  • 第一个字符表示文件类型(-表示普通文件,d表示目录,l表示符号链接文件等);
  • 接下来的三个字符表示文件所有者的权限,r表示读权限,w表示写权限,x表示可执行权限;如果没有权限,用-表示;
  • 接下来的三个字符表示文件所有者所在组的权限,格式与前面一致;
  • 最后三个字符表示其他用户的权限(即不是文件所有者也不是所在组的用户),格式与前面一致。

所以,-rwxr-xr-x 就表示这个文件的所有者有读、写、执行权限,所在组和其他用户有读、执行权限。这是一个非常常见的权限设置,表示这个文件所有者对它有完全控制权,而其他用户只能读和执行它。

3.转为二进制权限

在Linux系统中,文件权限用三个八进制数字来表示,分别对应文件所有者权限、所在组权限、其他用户权限。每个八进制数字由三个比特位构成,一共有八个比特位,每个比特位可以是0或1,表示各自的权限情况。

其中,r表示读权限,w表示写权限,x表示执行权限,对应的二进制数分别为:r=100, w=010, x=001。

因此,-rwxr-xr-x对应的三个八进制数字分别为: 755,对应每个比特位的权限如下:

文件所有者 : 7 (二进制 111)

  • rwx (即 4+2+1 = 7)

所在组: 5 (二进制 101)

  • r-x (即 4+0+1 = 5)

其他用户: 5 (二进制 101)

  • r-x (即 4+0+1 = 5)

其中,数字7表示所有权限都开启,即rwx;数字5表示读和执行权限开启,但是写权限关闭,即r-x。

4.修改权限

function chmod($file, $permissions) {
    if (file_exists($file)) {
        $permissions = octdec($permissions);
        chmod($file, $permissions);
        return true;
    } else {
        return false;
    }
}

这个函数接受两个参数:文件名和要修改的权限。首先,它会检查文件是否存在,如果存在,则使用 octdec() 函数将权限转换为十进制数,然后使用 chmod() 函数修改权限。如果文件不存在,则返回 false。

$file = '/path/to/file.txt';
$permissions = 0644; // 将权限设置为 640
if (chmod($file, $permissions)) {
    echo '文件权限已修改。';
} else {
    echo '文件权限修改失败。';
}

注:如果文件不存在,则无法使用 chmod() 函数修改其权限


@漏刻有时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高通 Camera HAL3:CamX、Chi-CDK 详解

网上关于高通CameraHAL3的介绍文档不多,之前做高通CameraHAL3的一些收集、总结,杂乱了一点,将就着看吧。 一.初步认知 高通CameraHAL3的架构很庞大,代码量也很巨大。 先对CamX、Chi-CDK的关键术语、目录等有个初步认知 1.1 术…

Servlet与Mybatis-2

过滤器 过滤器是一种代码重用的技术,它可以改变 HTTP 请求的内容,响应,及 header 信息。过滤器通常不产生响应或像 servlet 那样对请求作出响应,而是修改或调整到资源的请求,修改或调整来自资源的响应。 作用&#x…

Linux基础篇 使用SSH远程Ubuntu-03

目录 1.安装ssh服务器 2.启用SSH服务器 3.查看SSH服务运行状态 4.在Windows的CMD下进行验证 在默认情况下,外部设备是无法通过SSH远程Ubuntu的,因为Ubuntu没有启用ssh服务。 说明:当前Ubuntu系统为20.04 1.安装ssh服务器 sudo apt-get …

chatgpt赋能python:Python在一组数据中抽取数的方法

Python在一组数据中抽取数的方法 Python是一种非常流行的编程语言,因为它简单易学,可读性高,功能强大,适用于各种不同的应用场景。在数据科学领域,Python也非常受欢迎,因为它拥有广泛的数据处理和分析库。…

【Go LeetDay】总目录(1~88)

Leetcode Golang Day1~10 Golang每日一练(leetDay0001) 1. 两数之和 Two Sum 2. 两数相加 Add Two Numbers 3. 无重复字符的最长子串 Longest-substring-without-repeating-characters Golang每日一练(leetDay0002) 4. 寻找两个正序数组的中位数 Median of two sorted arra…

使用RP2040自制的树莓派pico—— [1/100] 烧录micropython固件

目录 开发环境烧录模式简介固件下载固件烧录验证阶段micropython初步了解 开发环境 软件:Thonny 烧录固件:micropython 烧录模式简介 正常插上电就启动,这是树莓派pico开发板的正常启动模式。 如果按住 bootset 按键再插上数据线&#xf…

Vue 设计模式

一、什么是设计模式? 设计模式是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。它是为了可重用代码,让代码更容易的被他人理解并保证代码的可靠性。 设计模式实际上是“拿来主义”在软件领域的贯彻实践,它是一套现成的工…

Linux下配置Qt6安装开发环境

安装JDK 选择自己定义JDK安装路径 点击如下图按钮 安装SDK 提示TLS初始化失败 由于HTTPS问题造成无法下载,暂用Android Studio来安装Android SDK 成功安装SDK 安装NDK与命令行工具 正在下载NDK及命令行工具 NDK与工具下载完成 配置QT的Android SDK路径 配置NDK路径 选择ND…

卡尔曼滤波与组合导航原理笔记(一)卡尔曼滤波方程的推导 第一部分

文章目录 一、滤波的基本概念1、传统数字滤波器2、现代控制中的状态观测器3、最优估计的含义4、温度估计的例子1.问题描述2.分析 二、递推最小二乘 课程链接:https://www.bilibili.com/video/BV11K411J7gp/?p1 参考书目:《捷联惯导算法与组合导航原理》…

日志框架 --- Log4j

文章目录 1. 什么是log4j2. log4j的日志级别3. 日志层级4. log4j使用实例4.1 添加log4j依赖4.2 添加配置文件4.3 编写代码4.4 测试代码4.5 运行结果 5. 配置文件5.1 Logger 日志记录器5.2 Appender 附加器5.3 Layout 日志格式化器 6. 整体演示6.1 配置文件6.2 运行结果 1. 什么…

Linux学习(四)Docker构建Python_Web环境

目录 Docker 安装Docker 使用Docker 启停Docker 换源Docker 镜像Docker 容器Docker 创建内部网段Docker Python 镜像创建Docker MySQL 镜像创建Docker 补充 Docker 是一个开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器…

vulnhub靶场渗透之DC-4渗透教程(超级详细)

vulnhub靶场渗透之DC-4渗透教程目录 0x01靶机概述 0x02靶场环境搭建 0x03靶机信息发现 0x04靶机渗透过程 0x05靶机提权 0x06渗透实验总结 0x01靶机概述 靶机基本信息: 靶机下载链接https://download.vulnhub.com/dc/DC-4.zip作者DCAU发布日期2019年4月…

DINO代码学习笔记(二)

在DINO代码学习笔记(一)中已经将输入transformer之前的参数处理给捋了一遍,接下就是将这些参数传给transformer。 DINO的transformer使用了Deformable-DETR中的可变性transformer(他们之前的工作也有用到) 这里还是使用…

chatgpt赋能python:Python回滚-避免代码灾难的有效措施

Python回滚-避免代码灾难的有效措施 什么是Python回滚 Python回滚是一种避免代码灾难的有效措施,它可以让你在代码出现问题之后及时回退到之前的版本,保证系统不会受到影响。 回滚是一项非常重要的工作,越是复杂的项目越需要进行回滚。Pyt…

​【指针与数组的恩怨情仇】

指针和数组的关系 指针指的是指针变量,不是数组,指针变量的大小是4/8个字节,是专门来存放地址的。数组也不是指针,数组是一块连续的空间,存放一组相同类型的数据的。 没有关系,但是它们之间有比较相似的地方…

java String类型对象转换为自定义类型对象

问题 java String类型对象转换为自定义类型对象 详细问题 对于java自定义类型对象提供了toString()方法,实现自定义类型对象转换为String类型对象,如何将String类型对象转换为自定义类型对象,譬如对于如下代码所定义的Class类 package co…

Android:Selector + Layer-lists 实现 AppCompatCheckBox

最近做项目涉及到一些UI相关的东东,虽然比较简单,但是也很有趣,写两篇简短的博客记录一下。 一."Selector 两张图片"实现 AppCompatCheckBox AppCompatCheckBox 是 androidx的一个widget:androidx.appcompat.widget.…

chatgpt赋能python:Python图中打字的SEO文章:让你的图片说出更多的话

Python图中打字的SEO文章:让你的图片说出更多的话 图片是传达信息的有力工具。不过,当你在网站上发布图片的时候,这张图片就很可能会被浏览器、机器学习算法、甚至是一些视觉障碍用户忽略。为了弥补这个缺陷,我们可以使用Python来…

chatgpt赋能python:Python回退快捷键:让你的编程更迅速高效

Python回退快捷键:让你的编程更迅速高效 作为一名有10年Python编程经验的工程师,我深知Python回退快捷键对于编程的重要性。当你在编写代码时,可能会出现需要回退或者修改之前的代码的情况,在这种情况下,如果你没有使…

用代码认识整型提升与unsigned signed

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C语言》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,希望可以…