您现在的位置是:首页 >其他 >php获取文件的权限信息(获取权限信息、返回字符串涵义、二进制的转换方式、权限修改)网站首页其他

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

漏刻有时 2024-08-14 00:01:02
简介php获取文件的权限信息(获取权限信息、返回字符串涵义、二进制的转换方式、权限修改)

说明

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

文件权限是指文件或目录对用户和其他进程的访问许可。在 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() 函数修改其权限


@漏刻有时

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。