说明
(图片来源于网络)
文件权限是指文件或目录对用户和其他进程的访问许可。在 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对应如下关系
第一位 | 用户 | 组用户 | 其他用户 |
- | rwx | r-x | r-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() 函数修改其权限
。
@漏刻有时