文件权限介绍

文件的权限标志分为三种:

  1. r 表示对象是可读的
  2. w 表示对象是可写的
  3. x 表示对象是可执行的
  4. 若没有某种权限,则会在该权限位置出现单破折号。

它们分别对应八进制的数字:

  1. --- 000 0
  2. --x 001 1
  3. -w- 010 2
  4. -wx 011 3
  5. r-- 100 4
  6. r-x 101 5
  7. rw- 110 6
  8. rwx 111 7

每个文件对应三种级别的访问权限:

  1. 对象的属主
  2. 对象的属组
  3. 系统其他用户

三组级别的权限以及开头的文件类型,共10个字母,共同构成了文件类型和权限符号。
image.png

chmod

我们可以使用chmod 为某个文件或文件夹设置文件的权限。
有两种修改的方式,一种是直接通过八进制数字修改,如将文件a 修改为777,全部级别可读、可写、可执行:

  1. $ ls -lh a | cut -f1 -d' '
  2. -rw-rw----
  3. # 修改一下
  4. $ chmod 777 a
  5. root 14:27:16 ~
  6. $ ls -lh a | cut -f1 -d' '
  7. -rwxrwxrwx

我们还可以通过-R 参数对所有该文件夹内的所有文件及子文件夹中的文件修改权限,我们可以试着用root 用户对根目录修改,即修改所有文件的默认创建权限,不要重复我现在的操作

  1. chmod -R 770 /
  2. chmod: changing permissions of ‘/proc/26108/timers’: Operation not permitted
  3. chmod: changing permissions of ‘/proc/26108/patch_state’: Operation not permitted
  4. ssh root@81.70.83.106
  5. ssh_exchange_identification: read: Connection reset by peer

好家伙,直接并行把服务器跑崩了。

还是简单的在用户的home 目录设置:

  1. $ ls -lh | cut -f1 -d' '
  2. total
  3. -rw-r--r--
  4. -rw-rw----
  5. $ chmod -R 770 /home
  6. $ ls -lh | cut -f1 -d' '
  7. total
  8. -rwxrwx---
  9. -rwxrwx---

所有文件都被修改了。

另外,还可以使用符号模式下的安全设置,形如:
chmod [ugoa] [+-=] [rwxXstugo]

其中包括:

  1. u 表示用户
  2. g 表示组
  3. o 代表其他
  4. a 代表ugo 全部
  5. + 表示增加权限
  6. - 表示移除权限
  7. = 表示将现有权限修改为后面新值
  8. X 表示若对象是目录或已有执行权限,则赋予执行权限
  9. s 表示运行时重新设置UID GID
  10. t 表示保留文件或目录

比如:

-rwxrw----  1 mugpeng  wheel   0 Jun  9 11:41 test3
$ chmod o+r test3
-rwxrw-r--  1 mugpeng  wheel   0 Jun  9 11:41 test3

umask

我们可以通过umask 从用户的全权限中减去对应的数字(创建掩码),来控制不想授予权限的文件。
比如开始的文件权限本来为666,在umask 为022下,需要进行减法,因此它的实际权限为644。

可以直接查看当前umask:

$ umask
0002

设置umask 后,后面所有创建的文件就将自动变为设置后的结果。

创建用户组

有的时候,我们可能希望某些文件只有部分用户可以访问,就可以借助用户组来创建了。

一般来说,每个用户创建的时候都默认会有属组,这个组就是自己:

$ id
uid=1003(guest) gid=1003(guest) groups=1003(guest)

先创建两个用户:

$ ls -lh
total 8.0K
drwxrwx--- 2 lilei  lilei  4.0K Jan 26 15:50 lilei
drwxrwx--- 2 sxiang sxiang 4.0K Jan 26 15:46 sxiang

查看用户权限:

$ ls -lh /home
total 12K
drwxrwx--- 2 lilei    lilei    4.0K Jan 26 15:54 lilei
drwxrwx--- 2 sxiang   sxiang   4.0K Jan 26 15:46 sxiang
drwxrwx--- 2 xiaoming xiaoming 4.0K Jan 26 15:55 xiaoming

切换xiaoming 用户尝试进入lilei 家目录:

xiaoming 16:00:29 /home
$ cd lilei
bash: cd: lilei: Permission denied

果然不行。

首先创建一个用户组:

# 创建用户组
root 16:09:08 /home
$ groupadd  team

# 查看
$ cat /etc/group | grep team
team:x:1004:

接着添加:

$ usermod -G team xiaoming
root 16:10:49 /home
$ usermod -G team guest
root 16:10:59 /home
$ cat /etc/group | grep team
team:x:1004:xiaoming,guest

看看xiaoming 能否访问同一组的guest:

$ ls -lh
total 16K
drwxrwx--- 2 guest    guest    4.0K Jan 26 16:09 guest
drwxrwx--- 2 lilei    lilei    4.0K Jan 26 15:54 lilei
drwxrwx--- 2 sxiang   sxiang   4.0K Jan 26 15:46 sxiang
drwxrwx--- 2 xiaoming xiaoming 4.0K Jan 26 15:55 xiaoming

按理来说同一属组的权限已经全部打开:

$ id
uid=1003(guest) gid=1003(guest) groups=1003(guest),1004(team)
guest 16:12:06 /home
$ cd xiaoming/
bash: cd: xiaoming/: Permission denied

惊了!竟然还是不行。

再复习一下权限的编码:
image.png

看看home 下的属组:

$ ls -lh
total 16K
drwxrwx--- 2 guest    guest    4.0K Jan 26 16:09 guest
drwxrwx--- 2 lilei    lilei    4.0K Jan 26 15:54 lilei
drwxrwx--- 2 sxiang   sxiang   4.0K Jan 26 15:46 sxiang
drwxrwx--- 2 xiaoming xiaoming 4.0K Jan 26 15:55 xiaoming

原来属组没有改啊:

chown :team xiaoming
chown :team guest

$ ls -lh
total 16K
drwxrwx--- 2 guest    team   4.0K Jan 26 16:09 guest
drwxrwx--- 2 lilei    lilei  4.0K Jan 26 15:54 lilei
drwxrwx--- 2 sxiang   sxiang 4.0K Jan 26 15:46 sxiang
drwxrwx--- 2 xiaoming team   4.0K Jan 26 15:55 xiaoming

修改完毕后再试试:

$ su xiaoming
xiaoming 16:20:19 /home
$ cd lilei/
bash: cd: lilei/: Permission denied
xiaoming 16:20:22 /home
$ cd guest/
xiaoming 16:20:26 /home/guest

就可以进入同一属组的目录了。

因此在设置用户组时一定要注意修改文件的所属用户组。虽然用户可以加入多个用户组,可是文件只能属于一个用户和一个用户组。