Linux下的文件权限

文件权限查看

在Linux中,文件的详细信息可以使用命令ls -l [filename]...查看,如:

最左侧第1个字符代表文件类型,文件类型有以下几种:

(1)- 表示是普通文件

(2)d 表示是目录

(3)l 表示是软链接文件

(4)b 表示是块设备文件,例如硬盘的存储设备等

(5)c 表示是字符设备文件,如键盘等

(6)s 表示是套接字文件,此主要跟网络程序有关

(7)p 表示是管道文件

第2~10这九个字符每3个一组,依次表示所有者(Owner)、用户组(Group)、其他(Others)三种身份的用户对该文件的权限。

文件权限有三种:r(Read,读取)、w(Write,写入)、x(eXecute,执行)。

r w x
文件 可以读取文件内容 可以编辑文件内容(增、改) 可以执行
目录 可以读取目录结构(ls、find) 可以更改目录结构(新建、删除、移动、重命名该目录下的文件或文件夹) 可以进入该目录

PS:

  1. 对目录下文件(文件夹)的任何操作,均需进入目录(不一定是用户从终端中切换到目录),因此,若无x权限,即使拥有w权限也无法对目录中文件做增删改查以及执行操作。

数字类型权限

数字类型权限和符号类型权限的对应关系:

符号 换算(二进制) 数字(八进制)
000 0
r– 100 4
-w- 010 2
–x 001 1
rw- 110 6
r-x 101 5
-wx 011 3
rwx 111 7

文件权限以三位二进制来表示,用1和0分别代表有无读、写、执行权限,转为八进制后即为以数字表示的权限等级。不难发现,权限等级是可以累加计算的,如:

rwx : 7=4+2+1 若要再去掉x权限,则7-1=6 (rwx 减 –x 为 rw-)

r-x : 5=4+0+1 若要再加上w权限,则 5+2=7 (r-x 加 -w- 为 rwx)

PS:数字表示的权限是八进制的,一个文件的权限等级从000到777 。但考虑到每一位表示一种身份的权限,因此,弱化进位的概念有利于我们更好地理解。

文件的默认权限和权限掩码

文件和目录在创建 时,会有一个默认的权限。默认权限是通过文件权限掩码(umask)配合预设权限计算出来的。在linux中,文件的预设权限都是一样的:

  • 文件预设权限为 rw-rw-rw- ,即666
  • 目录预设权限为 rwxrwxrwx , 即777。

权限掩码可以通过命令umask来查看:

权限掩码有两种形态:数字形式和字符形式(umask 加参数 -S 查看)。

数字形态的掩码

umask的数字形式为4位数字,其中第一个数字0表示该值是个八进制数。有些资料中说这四个数分别对应 suid/sgid/stickbit、user、group、other,其实是不对的。当我们使用umask命令设置掩码值时,若使用了4位数字,那么第一位必须是0。umask命令接受的数字参数默认是八进制的,因而在使用时可以使用3位数字的参数。如下例:

若在终端输入umask 1022时,提示八进制数越界,是因为1022被解析成了10、2、2。

数字形态的掩码表示要从预设权限里去掉的权限。比如上面的022表示要从文件预设权限中拿掉group和others的w权限(w权限的数字表示是2):

预设权限 权限掩码 默认权限
文件(数字) 666 022 644
文件(符号) rw-rw-rw- —-w–w- rw-r–r–
目录(符号) rwxrwxrwx —-w–w- rwxr-xr-x
目录(数字) 777 022 755

符号类型表示的权限可以采用类似二进制运算的方式理解:

 (rw-rw-rw) – (—-w–w-) = (110110110) – (000010010) = 110100100 = rw-r–r–

字符形态的掩码

字符形态的掩码的意义是预设权限应该保留的权限。比如字符掩码中owner(user)的权限是u=rwx,这代表默认权限中的user如果有r权限,则保留;如果没有则不保留。文件的user的默认权限为  rw-,那么根据掩码,保留rw,由于没有x权限,则不保留。那么user对文件的最终默认权限为rw- 。

若以二进制的与运算来看这个换算关系,则更加直观:

文件:rw-rw-rw)  & (rwxr-x-r-x) = 110110110 & 111101101= 110100100 = rw-r–r–

权限掩码的设置

在umask命令后加上需要设定的值即可设置umask值了,这个值可以是数字形态的,也可以是字符形态的:

这样设定的umask值是属于临时性的,相应的改变直到退出该shell或使用另外的umask命令之前一直有效。若要永久性的设置umask值,则需要修改系统中的配置文件。

一般来说,umask值是在/etc /profile文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的umask,可以在该文件中加入相应的条目。如果只是针对性的设置某用户的umask值,那么就在该用户主目录$HOME下的.profile或.bash_profile文件中进行设置。

特殊权限

其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是 1,表示有相应的权限: 

11 10 9 8 7 6 5 4 3 2 1 0
权限 S G T r w x r w x r w x

第11位为SUID位,第10位为SGID位,第9位为SBIT,第8-0位对应于上面的三组rwx位。 

通常,我们看到的文件权限都是3位一组共3组来表示的,而上述的11到9这三种权限属于特殊权限,有着特定的方法表示。

将上述11至9三位上的二进制数转为八进制即可得到这三种特殊权限的数字表示:

SUID是4,SGID是2,SBIT是1。

SUID

SUID是Set User ID的简称。SUID仅对二进制程序(binary program)文件有效,其功能是让程序的执行者在运行该程序期间拥有该程序所有者(owner)的权限,因此,只有用户对程序有x权限时,SUID权限才会生效。

注意:

SUID权限仅仅可以用在二进制程序上,不能够用在shell script上面。因为shell script只是对一系列二进制程序文件的调用而已,所以SUID的权限部分,还要看shell script调用进来的程序的设置,而不是shell script本身。另外,SUID权限对目录也是无效的,因为目录并不能被“执行”。

SGID

SGID即Set Group ID的缩写。SGID权限即可用于二进制程序文件,又可用于目录。

对于二进制程序文件,类似SUID,SGID会使用户在执行程序的过程中临时获得该程序用户组的权限(相当于临时加入了程序的用户组)。

对于目录,SGID权限可以使进入该目录的用户临时加入该目录所属的用户组。例如,用户进入具有SGID权限的目录后,创建的文件的用户组会是该目录的用户组,当然,能进入目录并创建文件,用户必须现有该栏目的rwx权限。

SBIT

SBIT是Sticky Bit的简写,即粘滞位。SBIT只对目录有效,当目录设置了SBIT权限后,用户在该目录创建的文件或目录,只有自己与root才可以删除。所以,即便用户对目录有写入权限,也不能删除该目录中其他用户的文件。

由上述可知,SUID、SGID和SBIT三种特殊权限是分别以所有者、所属组、其他用户三种身份对应的x权限为前提的。因此,使用ls命令查看到的文件的特殊权限表现为:

  • SUID会在所属用户权限本应是x的地方显示s
  • SGID会在所属用户组权限本应是x的地方显示s
  • SBIT在其它用户权限本应是x的地方显示t

当user/group/others部分没有x权限而设置了上述三种特殊权限时,那么对应位置上的s或t就会显示为大写形式S或T,表示该权限是无效的。

例:

上例显示出来linux系统中几个典型的拥有特殊权限的文件和文件夹。

权限设置

chmod 命令,意为 Change Mode,用于改变文件或目录的访问权限。

chmod有两种用法。一种是包含字母和操作符表达式的符号设定法;另一种是包含数字的数字设定法。

命令格式:chmod [options] mode files

options:

–help 输出帮助信息

-c –changes 只输出被改变文件的信息

-f –silent或–quiet 不显示错误信息

-R –recursive 递归遍历子目录,把修改应到目录下所有文件和子目录

–reference=filename 参照filename的权限来设置权限

-v –verbose 无论修改是否成功,输出每个文件的信息

–version 输出版本信息

两种不同的权限设定法区别在于mode参数的形式。

符号设定法

mode格式:who optioncode permission

who optioncode permission
[ugoa] [+-=] [rwxst]

who表示要修改哪些用户的特权:

u User,即文件或目录的拥有者

g Group,即文件或目录的所属群组

o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围

a All,即全部的用户,包含拥有者,所属群组以及其他用户

optioncode表示执行什么操作:

- 删除当前的权限

= 替换当前的权限

+ 增加当前的权限

permission表示要修改什么权限:

- 空

r read,读访问
w write,写访问
x execute,执行访问
s SUID或是SGID
t Sticky Bit粘附位

当mode有多个时,可以用,隔开。

例:

注意,某些权限只能运用于特定的对象,如t只能作用于目录且只能加给others这个身份。因此像以下命令是无效的:

数字设定法

mode为4位八进制数字,分别代表特殊权限、所有者、所属组、其他用户的数字形式的权限值。

Octal Number Permission
4000 Set user ID on exec (SUID)
2000 Set group ID on exec (SGID)
1000 Turn on sticky bit
0400 Read by owner
0200 Write by owner
0100 Execute by owner
0040 Read by group
0020 Write by group
0010 Execute by group
0004 Read by other
0002 Write by other
0001 Execute by other

任何一种权限组合对于的八进制值只需将上述基本权限的八进制权限相加即可。

需要注意的是如果mode给的数字不足4位,那么前面自动添0,如:

发表评论

电子邮件地址不会被公开。