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 系统上的所有对象都有一组权限。 定期检查和维护它们非常重要,以防止不必要的访问。
1 条评论