Linux 文件权限

文件模式位

文件权限是通过文件模式位( file mode bits )表达的,它有两部分组成

  1. 文件权限位( file permission bits),它由读,写,执行权限组成。
  2. 特殊模式位( special mode bits ),它由设置用户ID,设置组ID,粘着位(也叫做限制删除位)组成。

chmod 命令的描述是 change file mode bits。

文件权限位

对于普通文件来说,读、写、执行权限很好理解。读权限意味着可以读取文件的内容;写权限意味着可以向文件写内容;执行权限意味着文件可以被执行,例如用户对 shell 脚本拥有执行权限就可以执行这个脚本。

目录的文件权限位

但是对于一个目录来说,读、写、执行权限意味着什么呢?很多文档只是做了一个概要的总结,这里通过一个例子来测试,看看实际效果。

目录的读权限

首先来测试目录的读权限

$ ls permission_test_dir/
dir1  file1
$
$ chmod u-r permission_test_dir/
$
$ ls -ld permission_test_dir/
d-wxrwxr-x 3 david david 4096 1月   2 14:41 permission_test_dir/
$
$ ls permission_test_dir/
ls: cannot open directory 'permission_test_dir/': Permission denied

在去掉目录的读权限之前,可以通过 ls 命令读取目录项( 子文件和子目录 )的名字。一旦去掉目录的读权限后,就无法获取目录项的名字,提示无法打开目录( 这和 ls 命令的实现有关 )。

虽然当前用户对目录没有了读权限,但是还是可以通过 ls -ld 命令查看目录的信息,这是因为当前用户对这个目录的父目录,有读、执行/搜索权限。

那么,目录的读权限其实就是指打开目录的权限,只有打开了目录才能读取目录项的名字,但是不包括目录项的信息(例如大小,权限等信息),目录项的信息的读取是由父目录的读权限和执行权限控制的。

目录的写权限

接下来测试目录的写权限

$ chmod u+r-w permission_test_dir/
$ ls -ld permission_test_dir/
dr-xrwxr-x 3 david david 4096 1月   2 14:41 permission_test_dir/
$
$ ls -l permission_test_dir/
total 4
drwxrwxr-x 2 david david 4096 1月   2 14:41 dir1
-rw-rw-r-- 1 david david    0 1月   2 14:41 file1
$
$ touch permission_test_dir/file2
touch: cannot touch 'permission_test_dir/file2': Permission denied
$
$ mkdir permission_test_dir/dir2
mkdir: cannot create directory ‘permission_test_dir/dir2’: Permission denied
$
$ mv permission_test_dir/file1 permission_test_dir/renamed_file1
mv: cannot move 'permission_test_dir/file1' to 'permission_test_dir/renamed_file1': Permission denied

去掉了目录的写权限后,ls -l 可以成功获取目录项的名字和信息,而 touch 命令无法在目录下创建文件,mkdir 命令无法在目录下创建目录,mv 命令无法重命名目录下的文件。

目录的写权限,指的是在目录下创建和删除文件的权限。重命名功能是由创建和删除功能实现的,因此如果用户对一个目录没有写权限,也就无法重命名目录下的目录项的名字。

目录的执行权限

最后来测试目录的执行权限。

$ ls -l permission_test_dir/
total 4
drwxrwxr-x 2 david david 4096 1月   2 14:41 dir1
-rw-rw-r-- 1 david david    0 1月   2 14:41 file1
$
$ chmod u+w-x permission_test_dir/
$ ls -ld permission_test_dir/
drw-rwxr-x 3 david david 4096 1月   2 14:41 permission_test_dir/
$
$ ls -l permission_test_dir/
ls: cannot access 'permission_test_dir/file1': Permission denied
ls: cannot access 'permission_test_dir/dir1': Permission denied
total 0
d????????? ? ? ? ?             ? dir1
-????????? ? ? ? ?             ? file1
dir1  file1
$
$ cd permission_test_dir/
bash: cd: permission_test_dir/: Permission denied

没有去掉目录的执行权限前,可以通过 ls -l 命令读取到目录项的名字和信息。然而在去掉目录的执行权限后,只能通过 ls -l 命令读取到目录项的名字,而不能读取到目录项的信息(权限,文件大小等信息)。

最后,还测试了一个 cd 命令,可以发现,没有执行权限的目录,是无法通过 cd 命令进入了,这就从侧面证明了为何目录的执行权限叫搜索权限。

目录的执行权限/搜索权限,指的就是对目录项的访问权限(获取文件信息)。

特殊模式位

现在来看下特殊模式位,由设置用户ID位( set-user-ID bit )、设置组ID位( set-group-ID bit )位、粘着位( sticky bit )/限制删除位( restricted deletion flag )组成。在 Linux 系统中,这些位只影响可执行文件和目录。

如果一个程序(一个可执行文件)设置了 设置用户ID位,那么运行此程序时,进程的有效用户ID为文件属主的用户ID,而不是当前用户ID。那么这样有什么好处呢?例如,对于超级用户拥有的程序,并且设置了 设置用户ID位,当其他用户运行此程序(拥有执行权限),这个程序进程的有效用户ID为超级用户ID,而不是当前用户的ID,因此这个进程拥有了超级用户权限,而不仅仅是当前用户的权限。

如果一个程序(一个可执行文件)设置了 设置组ID位,那么运行此程序时,进程的有效组ID为文件属组的组ID,而不是当前用户的组ID。

在 Linux 中,如果一个目录设置了 设置组ID位,那么目录下创建的目录项的属组与目录的属组一样,并且子目录的设置组ID位也会被设置。这个特性往往被用在共享目录上,如果一个共享目录被一个用户组所拥有,并且设置了 设置组ID位,那么在这个目录下创建的所有目录项都被这个用户组所拥有,从而就实现了目录共享。

粘着位其实 Unix 文化中的一个概念,在现代的 Linux 系统中,它只影响目录。如果对目录设置了粘着位,并且用户想要删除该目录下的子文件或子目录,需要满足如下其中一个条件

  1. 用户拥有目录项。
  2. 用户拥有这个设置了粘着位的目录。
  3. 用户为超级用户。

其实前两个条件还包含满足一个隐藏条件,那就是用户对设置了粘着位的目录有写权限。

因此,粘着位也被称为限制删除位。例如,被 root 用户拥有的 /tmp 目录就设置了粘着位,并且对其他用户开放了写权限,因此其他用户可以在这个目录下创建目录项,但是只能删除自己创建的目录项。当然,root 用户可以删除这个目录下的任意目录项,因为它拥有这个目录,并且具有写权限,还有最根本的一个原因,它是超级用户。

设置特殊模式位

特殊模式位的设置与文件权限位的设置方式是一致的,也分为字符模式和数字模式,这里只演示字符模式。

设置用户ID位,设置组ID位,粘着位分别在文件属主的执行权限位,文件属组的执行权限位,文件的其他用户执行权限位显示,显示的字母为大写或者小写的字母s( 设置用户ID位和设置组ID位 )和字母t( 粘着位 )。

显示的字母是大写还是小写,取决于该位置是否设置了执行权限。如果该位置设置了执行权限,那么显示小写字母,否则为大写字母。

根据显示的位置,我们可以猜测设置的方式, u+s, g+s, o+t( 字母o可以省略 )分为对应设置用户ID,设置组ID,粘着位的设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值