Linux chmod 命令简介

Chmod 用于设置读、写和执行权限,是 Linux 中最重要的安全命令之一。
167 位读者喜欢这篇文章。
How to upgrade your Fedora Linux system with DNF

Opensource.com

Linux 系统上的每个对象都有一个权限模式,用于描述用户可以对其执行哪些操作。 权限有三种类型:读取 (r)、写入 (w) 和执行 (x)。

读取文件是指查看其内容。 例如,文本文件必须具有读取权限才能让人阅读其中的文本。 如果用户想要向该文件添加句子,则需要写入权限。 执行权限允许某人运行文件,例如 shell 脚本或二进制程序文件。

基本权限

ls -l 命令显示分配给文件的权限。 例如:

ls -l
-rw-rw-r-- 1 bruce bruce    0 Jul 30 16:25 schedule1.txt

某些权限 (rw) 会出现多次,因为它们指的是不同的实体:用户其他用户与所有者同义,是指用户的首要组,两者都是 bruce其他是指所有其他用户。

第一个位置表示对象的类型:- 表示文件,d 表示目录,l 表示符号链接。 接下来的九个位置分为三组,用于描述权限模式。 位置顺序为 r,w,x,组顺序为 用户其他

--- --- --- rwx rwx rwx
uuu ggg ooo u=用户, g=组, o=其他

文件

为一个文件设置所有实体的读取、写入和执行位,它将显示为:

rwxrwxrwx 

当然,在现实世界中,我们通常不会如此宽松地配置文件;这只是一个关于每个位置如何使用的说明。

在以下示例中,文件配置为允许其所有者 (pablo) 具有读取和写入权限,允许组成员仅具有读取权限,并允许所有其他人没有权限。

-rw-r----- 1 pablo pablo    0 Jul 30 16:25 textfile

chmod 命令修改系统中对象的权限模式。 它是 Linux 安全命令集中最常用和最重要的命令之一。

加号 (+) 符号添加权限,减号 (-) 符号删除权限。 您可以将 chmod u+r 理解为“用户加读取”,因为它授予用户读取权限。 命令 chmod u-r 表示“用户减读取”,因为它从用户那里删除读取权限。

目录

这三个相同的权限也适用于目录。 目录必须具有读取权限才能让用户查看其内容。 用户需要写入权限才能添加到目录(例如,创建新文件)。 用户要更改到目录 (cd),则必须具有执行权限。

drw-rw-r-- 2 pablo pablo 4096 Jul 30 15:56 JBOSS

Pablo 可能是 JBOSS 目录的所有者,但由于他没有执行权限,因此他无法 cd 进入该目录。 他可以使用命令 chmod u+x 添加权限,然后他就可以 cd 进入该目录。

$ cd JBOSS
bash: cd: JBOSS: Permission denied
$ chmod u+x JBOSS
$ ls -l
drwxrw-r-- 2 pablo pablo 4096 Jul 30 15:56 JBOSS
$ cd JBOSS
$ pwd
/opt/JBOSS

组合参数

您可以使用逗号组合参数。 在此示例中,您只需要一个命令来设置权限,以便组无法写入文件,并且世界的其他人也无法读取它。

$ chmod o-r,g-w readme.txt
$ ls -l
-rw-r----- 1 pablo share 0 Jul 31 13:34 readme.txt

您可以将其理解为“其他人减读取和组减写入”。

假设 Denise 编写了一个名为 home_backup.sh 的 Bash 脚本,并希望授予它执行权限。 她还想阻止其他人读取、写入或执行它。 一种方法是使用加号和减号符号:

$ chmod go-rw,u+x home_backup.sh

另一种方法是使用等号 (=) 符号。 这将绝对设置权限,而不考虑先前的设置。 请注意,第二个等号后有一个空格;这表示值为

$ chmod u=rwx,go= home_backup.sh

您可以将其理解为“用户的权限等于读取、写入和执行,而组和其他人的权限等于无”。

数字模式

Chmod 还支持数字模式,该模式使用分配给每个位置的值:

所有者 其他
r - 4 w - 2 x - 1 r - 4 w - 2 x - 1 r - 4 w - 2 x - 1
400 200 100 40 20 10 4 2 1

可以计算一组权限的总值,并将其作为单个参数传递给 chmod 命令。 以 Denise 及其备份脚本为例。 如果她使用数字模式来设置脚本的权限,她必须首先计算总值:

-rwx------ 1 denise denise 0 Jul 31 13:53 home_backup.sh

Denise 添加与她要应用的每个权限相对应的数字:

400 + 200 + 100 = 700

她的命令将是 chmod 700 home_backup.sh。 假设 Denise 想要重置文件上的原始权限:

-rw-rw-r-- 1 denise denise 0 Jul 31 13:53 home_backup.sh

这些权限的值计算为 664:

400 + 200 + 40 + 20 + 4 = 664

Denise 可以使用命令 chmod 664 home_backup.sh 恢复原始权限。

特殊模式

可以在对象上设置三种其他模式:

名称 符号 数字
SetUID s - 4000 4000
SetGID s - 4000 2000
sticky t - 1000 1000

SetUID 位强制执行可执行文件上的用户所有权。 设置后,该文件将以文件所有者的用户 ID 执行,而不是运行它的人。

$ chmod u+s

SetGID 位强制执行文件和目录上的组所有权。 设置后,在目录中创建的任何文件或目录都将获得该目录的组所有权,而不是用户的。 如果在文件上设置了该位,则该文件将始终以其所属组的身份执行,而不是以用户的身份执行。

$ chmod g+s

sticky 位,也称为“受限删除标志”,可以在目录上设置,以防止除目录所有者之外的任何人删除该目录中的文件。

$ chmod o+t

可以通过将其值添加到其他权限的值中来在数字模式下设置粘滞位。 如果您有一个值为 755 的对象,并且想要设置粘滞位,请添加 1000:

1000 + 400 + 200 + 100 + 40 + 10 + 4 + 1 = 1755

该命令将是 chmod 1755。 几种符号方法是等效的;一个例子是 chmod u=rwx,go=rx,o+t

附加

字母 a 是为所有用户分配权限的快捷方式。 命令 chmod a+rwx 等效于 chmod ugo+rwx

递归

与许多其他 Linux 命令一样,chmod 具有递归参数 -R,该参数允许您递归地对目录及其内容进行操作。 通过递归,意味着该命令将尝试对指定目录下的所有对象进行操作,而不仅仅是目录本身。 此示例从一个空目录开始,并添加 -v(详细)参数,因此 chmod 将报告它正在执行的操作:

$ ls -l . conf
.:
drwxrwxr-x 2 alan alan 4096 Aug  5 15:33 conf

conf:
-rw-rw-r-- 1 alan alan 0 Aug  5 15:33 conf.xml
$ chmod -vR 700 conf
mode of 'conf' changed from 0775 (rwxrwxr-x) to 0700 (rwx------)
mode of 'conf/conf.xml' changed from 0664 (rw-rw-r--) to 0700 (rwx------)

参考

引用文件命令 (--reference=RFILE) 可用于复制另一个文件 (RFILE) 的模式,称为引用文件。 当您更改文件的模式以匹配特定配置时,或者当您不知道确切的模式,或者不想花时间计算它时,这非常方便。

$ ls -l
-rw-r--r-x 1 alan alan 0 Aug  5 17:10 notes.txt
-rw-rw-r-- 1 alan alan 0 Aug  5 17:10 readme.txt
$ chmod --reference=readme.txt notes.txt
$ ls -l
-rw-rw-r-- 1 alan alan 0 Aug  5 17:10 notes.txt
-rw-rw-r-- 1 alan alan 0 Aug  5 17:10 readme.txt

报告更改

chmod 命令还有一个 -c (--changes) 参数,该参数告诉 chmod 仅在进行更改时才报告(相对于 -v-verbose,后者告诉 chmod 报告其所有输出)。 Chmod 仍然会报告其他内容,例如操作是否被允许。

参数 -f (--silent, --quiet) 抑制大多数错误消息。 将此参数与 -c 一起使用将仅显示实际更改。

保留根目录

Linux 文件系统的根目录 (/) 应受到高度重视。 如果有人在此级别犯了命令错误,后果可能不堪设想,并导致系统完全无法使用,尤其是在运行递归命令时,该命令将进行任何类型的更改,或者更糟糕的是:删除。 幸运的是,chmod 命令的 --preserve-root 参数将保护和保留根目录。 如果该参数与根目录上的递归 chmod 命令一起使用,则什么也不会发生,您将看到此消息:

[alan@localhost ~]# chmod -cfR --preserve-root a+w /
chmod: it is dangerous to operate recursively on '/'
chmod: use --no-preserve-root to override this failsafe

当该选项不与递归一起使用时,该选项无效。 但是,如果 root 用户运行该命令,则 / 的权限将更改,但其他文件或目录的权限不会更改。

[alan@localhost ~]$ chmod -c --preserve-root a+w /
chmod: changing permissions of '/': Operation not permitted
[root@localhost /]# chmod -c --preserve-root a+w /
mode of '/' changed from 0555 (r-xr-xr-x) to 0777 (rwxrwxrwx)

令人惊讶的是,这不是默认参数; --no-preserve-root 是。 如果您在没有“保留”选项的情况下运行命令,则它将默认为“不保留”模式,并可能更改不应更改的文件的权限。

[alan@localhost ~]$ chmod -cfR a+x /
mode of '/proc/1525/task/1525/comm' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
mode of '/proc/1541/task/1541/comm' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
mode of '/proc/1541/task/1580/comm' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
mode of '/proc/1541/task/1592/comm' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
mode of '/proc/1557/task/1557/comm' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
mode of '/proc/1558/task/1558/comm' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
mode of '/proc/1561/task/1561/comm' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)

结论

Linux 系统上的所有对象都有一组权限。 定期检查和维护它们非常重要,以防止不必要的访问。

下一步阅读
标签
Alan Formy-Duval Opensource.com Correspondent
Alan 拥有 20 年的 IT 经验,主要在政府和金融领域。 他从增值经销商开始,然后转入系统工程。 Alan 的背景是高可用性集群应用程序。 他在 Oracle Press/McGraw Hill 的《Oracle Solaris 11 系统管理》一书中撰写了“用户和组”以及“Apache 和 Web 堆栈”章节。

1 条评论

粘滞位用于目录,在这种目录下,你需要允许其他人创建和删除他们自己的文件,但不能删除其他人的文件。 这通常用于共享系统,在这种系统中,需要一个公共数据文件夹。 最好的例子是查看 /tmp 目录,该目录归 root 所有并设置了粘滞位,因此任何系统用户都可以创建和删除他们自己的文件,但不能创建和删除其他系统用户的文件。

Creative Commons 许可协议本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.