Linux的权限系统既简单又复杂,简单在于只有读写执行三种权限,只有拥有者、组用户和其他用户三种身份。复杂则在于实际使用的时候又不会了,与自己理解的不一样了。
权限可以用rwx表示也可以用数字表示,r=4,w=2,x=1。所以rwx=7,rw-=6,r-x=5,r--=4,-wx=3,-w-=2,--x=1,---=0。
权限对于目录和普通文件的作用有所不同。我们创建这样一个目录结构来探究权限的作用。
1、目录权限
目录的读权限表示用户是否可以查看该目录下的内容,没有读权限像ls这种命令就没权执行。
目录的写权限表示用户是否可以修改该目录下的内容,没有写权限像mkdir这种命令就没权执行。
目录的执行权限表示用户是否可以在该目录下执行命令,没有执行权限像cd这种命令就没权执行。
由于大部分操作都是通过命令,没有执行权限,对该目录内几乎就无法进行任何操作了。由于读和写都依赖命令,所以没有执行权限会影响到对目录读和写的权限。(这里不知道有没有例外,欢迎大家补充指正)
父目录不可读不影响子目录和文件的读权限。
父目录不可写不影响其子目录和文件的写权限。
2、文件权限
文件的读权限表示是否可以查看文件的内容。
文件的写权限表示是否可以修改文件的内容。
文件的执行权限表示该文件是否可以作为可执行程序执行。
其实目录也可以看作是特殊的文件,目录的内容就是目录和文件的索引。
理解了以上内容,对于不同用户的权限也就好理解了,这里pi是主用户,grp是同组成员,other是其他成员。
当前test对于组成员有读和执行权限,所以grp用户可以进入和查看test,但是无法创建文件夹。
test对于其他成员只有执行权限,所以可以进入目录,但是无法查看内容,不能创建文件。
对于想要保护目录下所有文件内容的情况,设置目录的读写权限是没用的,必须将执行权限去掉才安全。最妥当的方式是直接设置想要保护的文件的权限,从根源上保护文件。
除了基本的权限,Linux还提供了三种其他特殊的权限,下面随权限的命令一并简要介绍。
3、改变权限的命令
chmod:这是核心命令,可以修改所有文件的所有权限,执行需要管理员权限。
setuid:设置命令的owner权限的执行位为s,表示有执行权限的其他用户以该命令owner的权限执行命令。比如passwd命令。
小写s和大写S的区别是前者文件的owner有执行权限,后者表示文件的拥有者没有执行权限。
setgid:设置命令的组权限的执行位为s,表示有执行权限的其他用户以该命令所在组的权限执行命令。比如crontab命令。
这里大S小s的含义跟user一样,小写s表示组用户有执行权限,大写S表示组用户没有执行权限。
所以,这两个权限位使用有一定的危险性,尤其用户或组是root,会让其他有执行权限的用户拥有root权限,so设置时要格外小心。
还有一种叫限制删除标志或粘性位,设置其他用户的执行位为t,表示目录内的文件只有其所有者或root可以删除移动,多用于共享目录。比如/tmp目录。
以下是man手册给出的解释:
受限删除标志或粘性位是单个位,其解释取决于文件类型。对于目录,除非用户拥有文件或目录,否则它可以防止非特权用户删除或重命名目录中的文件, 这称为目录的受限删除标志,通常在全局可写目录(例如/ tmp)中找到。对于某些较旧系统上的常规文件,该位将程序的文本图像保存在交换设备上,因此在运行时将更快地加载, 这就是所谓的粘性位。
umask权限掩码
创建目录的默认权限是777和umask异或的结果;
创建文件的默认权限是777与umask异或的结果再去掉所有的执行权限。
以上就是目前我所了解的Linux权限,限于个人水平,肯定有错误和遗漏,欢迎大家指正补充。