本篇讲述linux系统的文件权限。

1. liunx中权限的分类

linux系统中,对权限的管理的逻辑是:

  • 只有三种权限:R(读)、W(写)、X(执行)
  • 只有三种角色:所属用户、所属组、其他

使用ls -l 命令即可查看某个文件或文件夹的权限:

java linux 文件权限不够 linux 文件权限 s_用户权限

上图中的:-rw-r–r–,即是权限的详细内容,一共10位,分别表示:

文件类型

所属用户权限

所属组权限

其他用户权限

备注

-

r w -

r - -

r - -

- 表示没有权限

 

 

 

所以上图表示:/tmp/123这个文件,root用户有读写权限、root组内的用户有读权限,其他用户有读权限

2. 三种特殊权限SUID、SGID、Sticky

大部分情况下,上述的权限分类就够了,但是某些情况下,就必须要使用到特殊权限。
特殊权限有三种:

  • suid:拥有这个权限的文件(一般指可执行的二进制文件),运行的时候,它的所属用户不变,如/usr/bin/passwd,它不管是哪个用户来运行,运行起来的所属用户都是root。

java linux 文件权限不够 linux 文件权限 s_用户权限_02

所属用户权限有个s,说明有suid权限,一般这类权限不设置,除非是特定情况。
赋权限: # chmod u+s
取消权限: # chmod u-s

  • sgid:这个权限一般赋给文件夹,拥有这个权限的文件夹,在此文件夹内部创建的文件,所创建的文件所属组都是这个文件夹的所属组,一般常用于文件夹共享的场景

所属组权限有个s,说明sgid权限
赋权限: # chmod g+s
取消权限: # chmod g-s

  • sticky:这个权限也多赋给文件夹(一般这个文件夹的权限比较大,比如777),在有这个权限的文件夹下创建文件,所创建的文件其他人无法删除。比如系统自带的/tmp文件夹

java linux 文件权限不够 linux 文件权限 s_java linux 文件权限不够_03

所属其他权限有个t,说明有sticky权限
赋权限: # chmod o+t
取消权限: # chmod o-t

3. UMASK的作用

当我们创建一个文件或者文件夹的时候,默认的会有相应的权限,比如:

java linux 文件权限不够 linux 文件权限 s_用户权限_04

默认文件权限:600,默认文件夹权限:755,这个默认值是在哪里指定的呢?答案就是umask

java linux 文件权限不够 linux 文件权限 s_文件系统_05

修改umask的命令:umask 044

4. 文件系统的ACL

至此,linux的权限已经可以满足绝大部分的需求了,但是还是有一些特殊的要求,比如一个文件,它的所属主和所属组是X,但是却希望A用户可以RW,B用户只可以R,甚至还有其他的条件限制,那么上述的几种权限控制可能就不能满足了,那怎么办呢?答案就是文件系统的ACL。
为什么说是文件系统的ACL?因为这是特定的文件系统所拥有的功能,可幸的事,现在linux大部分的文件系统都支持ACL了。

  • 查看linux分区文件系统可以使用命令:df -T
  • 查看文件的acl信息: getfacl
  • 设置文件的acl信息: setfacl

具体用法的详细信息可以man查看。

5. 文件系统的锁

还有一个命令:chattr,可以修改文件的属性。(如访问时间,不允许追加等等),这个命令只有管理员才可以执行。

  • 文件加锁:chattr +i filename
  • 文件去锁:chattr -i filename
  • 查看文件是否有锁:lsattr filename

比如,我在工作经常遇到的服务器/etc/resolv.conf文件经常被修改掉(受NetworkManager影响的吧),而我并不希望它被修改,则可以: chattr +i /etc/resolv.conf

java linux 文件权限不够 linux 文件权限 s_java linux 文件权限不够_06

用lsattr查看文件的属性,有个i,表示文件已经被锁定,不允许任何用户(包括管理员用户)去修改了,如果想修改,需要先去锁了。