Linux:文件和目录权限

查看权限

《Linux:基础文件操作命令》 里说过 ls 命令用于列出目录下的文件和文件夹。

ls -lh /etc/apt

返回:

total 28K
drwxr-xr-x 2 root root 4.0K Aug 23 08:45 apt.conf.d
...

以第一行「drwxr-xr-x 2 root root 4.0K Aug 23 08:45 apt.conf.d」为例:

  • 「drwxr-xr-x」表示文件类型和权限,以「-」开头表示文件、以「d」开头的表示文件夹,剩下 9 个字符表示权限。
  • 两个「root」分别表示所属用户和用户组

文件类型

第一个字符除了代表普通文件的「-」和代表目录的「d」外还有一些文件类型:

  1. - 普通文件
  2. d 目录文件
  3. b 块特殊文件(如移动硬盘)
  4. c 字符特殊文件(如终端)
  5. l 符号链接(类似快捷方式)
  6. f 命名管道
  7. s 套接字文件

权限

其中关于文件权限的字段主要为「drwxr-xr-x」,这 9 个字符还有进一步的意思:

  1. 前三个字符代表所属用户对该文件的权限
  2. 中间三个字符代表所属用户组对该文件的权限
  3. 后三个字符代表其他用户对于该文件的权限。

而对于权限有两种表示方法,字符和数字。

文件权限

  • r 表示读取,数字以 4 表示。
  • w 表示写入,数字以 2 表示。
  • x 表示执行,数字以 1 表示。

目录权限

  • x 进入目录
  • rx 显示目录内的文件
  • wx 修改目录内的文件

以「drwxr-xr-x 2 root root 4.0K Aug 23 08:45 apt.conf.d」为例:

  1. 属主用户 root 有权限进行读取(r)、写入(w)、执行(x)
  2. 属组 root(用户组里的用户)有权限进入(x)和显示目录内文件(r)
  3. 其他用户和数组权限一样没有修改删除的权限。

另外,root 用户的权限是最高的不受此限制。

修改权限

chmod

chmod 命令用于修改文件、目录的权限

对于属主、属组和其他用户分表用 ugo 表示(也就是 User、Group、Other),而对于三者全都修改可以使用 a(也就是 All)

增加权限使用加号;减少权限使用减号;设置权限使用等号。

# 对于名为 README 文件的属主增加写入权限
sudo chmod u+x README
# 对于名为 README 文件的属主删除写入权限
sudo chmod u-x README
# 对于名为 README 文件的属主设置读取、写入、执行权限
sudo chmod u=rwx README
# 对于名为 README 文件的其他用户设置只有写的权限
sudo chmod o=w README
# 对于名为 README 文件的属主、属组和其他用户都增加读取权限
sudo chmod a+r README

如果是以数字表示的权限设置呢?

前面说了 r = 4; w = 2; x = 1。

# 假设要对 install.sh 的权限修改为只允许读取
# chmod a-wx install.sh
# 那么用数字方式表示
sudo chmod 444 install.sh

# 假设属主可以读写,其他只能读呢?将数字相加即可,读取 4 加上写入 2 等于 6
sudo chmod 644 install.sh

chown

chown 命令用于修改属主和属组

# 修改 wwwroot 目录的属主为 deckard
sudo chown deckard wwwroot
# 修改 wwwroot 目录的属组为 group1
# 在用户组前加上冒号
sudo chown :group1 wwwroot

# 将以上结合
sudo chown deckard:group1 wwwroot

chgrp

chgrp 命令用于修改属组

# 将 wwwroot 目录的属组修改为 group1
sudo chgrp group1 wwwroot

💡思考

当一个文件的属主没有写入权限而属组有写入权限时,类似
-----w---- 2 user1 group1 4.0K Aug 23 08:45 README
注意 user1 用户属于 group1 用户组,这时可以写入吗?

这是一个权限冲突的问题,属主权限是 ---,属组权限属 -w-,当遇到这样的情况时以属主权限为准,即便该用户是有写入权限的用户组时。

特殊权限

SUID

suid(Set User ID)命令用于二进制可执行文件,执行命令时获得文件属主权限。

比如 passwd

ls -lh /usr/bin/passwd

返回:

-rwsr-xr-x 1 root root 59K Mar 22 19:05 /usr/bin/passwd

可以看到这里属主的权限中的运行权限不是 x 而是 s,意思是不管使用 root 用户还是普通用户运行时都会以该文件的属主(此处就是 root)来运行,这样让本来没有相应权限的用户运行程序时,可以访问没有权限访问的资源。

# 和之前一样,使用 u+ 配合 s 对某个文件设置 SUID
chmod u+s README

# 如果使用数字表示则在最开头加上 4 (如本来权限为 755)
chmod 4755 README

# 若要取消则把 4 设置成 0
chmod 0755 README

SGID

sgid(Set Group ID)命令用于目录,在该目录下创建新的文件或文件夹时获得创建用户属组的权限,一般用于如文件共享。

# 和 suid 类似,设置成 2
chmod 2755 share

# 取消也一样,设置成 0 
chmod 0755 share

SBIT

sbit(Sticky BIT)命令用于目录,在该目录下新建的文件或文件夹,只有 root 和属主可以进行删除。如 /tep 临时目录。

ls -lhd /tmp/

返回:

drwxrwxrwt 10 root root 4096 Aug 29 14:26 /tmp/

可以看到其他用户的 xt

# 使用 1777 对某个目录进行操作
chmod 1777 tmp123

# 取消也一样,设置成 0
chmod 0777 tmp123

Conners Hua

这个家伙很懒,什么都没有留下。

您可能还喜欢...

1 条回应

  1. WithdewHua说道:

    chmod 那以数字表示权限设置的示例漏了 chmod 命令

发表评论

电子邮件地址不会被公开。 必填项已用*标注