文件和目录的基本和扩展权限

Last Updated: 2023-07-02 14:11:12 Sunday

-- TOC --

inode中包含了i_mode,这里面存放的是文件和目录的基本权限信息。而acl字段,对应的是扩展权限。Linux下有一组命令,用来操作这些权限。当然,我们首先要理解这些权限的含义。

基本权限

Linux系统的基本权限控制分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

file_mode

扩展权限ACL

umask命令

umask命令能够显示和设置用户创建文件和目录时,要去掉的权限!8进制显示。一般情况掩码(mask)用来执行与and操作,umask是反掩码,先取反再执行and操作。

$ umask
0002
$ touch f1
$ mkdir f2
$ ll
-rw-rw-r--  1 xinlin xinlin        0 1月  29 11:12 f1
drwxrwxr-x  2 xinlin xinlin     4096 1月  29 11:12 f2/
$ stat f1 | grep 'Access: ('
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  xinlin)   Gid: ( 1000/  xinlin)
$ stat f2 | grep 'Access: ('
Access: (0775/drwxrwxr-x)  Uid: ( 1000/  xinlin)   Gid: ( 1000/  xinlin)

当umask显示出0002这个值的时候,创建文件和目录的默认权限分别为664和775。默认新文件都没有可执行权限,umask值去掉的,是other的w权限。文件夹的可执行权限,就是可以进入文件夹,默认是有的,去掉的,也是other的w权限。

最前面那个0所在的位置,表示特殊权限,可以取值0-7,默认不写时就是0,表示没有任何特殊权限。

取反(~)后与(and):

>>> oct(0o777 & ~0o002)  # folder
'0o775'
>>> oct(0o666 & ~0o002)  # file
'0o664'

目录天生就比文件多x权限,否则目录就进不去了。

$ umask -S
u=rwx,g=rwx,o=rx

-S参数,看到的是保留的权限,而文件一开始就没有x权限,没法保留本就没有的东西。

在Windows系统中,新建的文件和目录时,通过继承上级目录的权限获得的初始权限,而Linux不同,它是通过使用 umask 设置默认不给权限,来给所有新建的文件和目录赋予初始权限。

** 设置或修改umask值 **

$ umask 022
$ umask
0022
$ umask u=rwx,g=rx,o=rx
$ umask -S
u=rwx,g=rx,o=rx
$ umask
0022

设置为0022是很常见的操作,可适当提高一点安全性,这也是fedora系统的默认值。

chmod命令

chmod命令用来修改Linux下文件和目录的基本访问权限。

chmod一般使用如下:

$ chmod [0]755 <filename>

给文件增加或减少可执行权限:

$ chmod +x <filename>
$ chmod a+x <filename>
$ chmod -x <filename>
$ chmod a-x <filename>
$ chmod ugo+x <filename>
$ chmod ugo-x <filename>

a+x表示对所有人(all)加上或减少x权限,a可以省略不写。

如果只是对部分用户调整某个权限位,通过ugo来实现,比如只对other用户减少w权限:

$ chmod o-w <filename>

另一种表达方式是用=号:

$ chmod go=rw <filename>
$ chmod u=rw,go= <filename>

go=表示没有任何权限,即清空所有权限。

chmod命令的-R,可以实现对某个目录下所有文件递归修改权限。

特殊权限

setuid权限

suid权限显示在owner的w位上,用s表示,可执行文件可能有此权限。

$ ll /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 7月  15  2021 /usr/bin/passwd*

可执行文件passwd命令在owner权限的x位置,设置成了s,这就是setuid权限(或称suid权限)。

setuid权限的含义是:当程序启动时,不是用启动它的用户的权限执行,而是以该文件的owner的权限执行。启动它的用户当然需要有对应的x权限。

SUID特殊权限具有如下特点:

设置SetUID:

$ chmod u+s <filename>
$ chmod 4755 <filename>

取消SetUID:

$ chmod u-s <filename>
$ chmod 755 <filename>

SetUID权限存在安全隐患,不要随便给程序增加这个权限。

当看到大写S时,表示有setuid权限,但是没有x权限,这是一个错误,用大写提示!

setgid权限

setgid权限与setuid有类似之处:当程序启动时,以该文件的group的权限执行。

setgid可以用于目录,这是它与setuid权限的不同之处。当用户在具有setgid权限的目录内创建文件时,新文件的group不属于用户所在的组,而是属于父目录所在的组。共享目录有时会使用这个权限。

设置setgid权限:

$ chmod g+s <dirname>
$ chmod 2755 <dirname>

取消setgid权限:

$ chmod g-s <dirname>

当看到大写S时,表示有setgid权限,但是没有x权限,用大写提示!

sticky权限

这是对目录使用的一个特殊权限,它表示在此目录中,某用户不能删除其它用户创建的文件,典型如/tmp目录

$ ls -ld /tmp
drwxrwxrwt. 20 root root 480 Jun 30 14:18 /tmp

other的w位,被替换成了t,这就是sticky bit。

设置sticky权限:

$ chmod o+t <dirname>

取消sticky权限:

$ chmod o-t <dirname>

当看到大写T时,表示有sticky权限,但是没有x权限,用大写提示!

本文链接:https://cs.pynote.net/hd/hdisk/202306301/

-- EOF --

-- MORE --