二、读取、写入和执行
对文件和目录的访问权限是按照 读访问、写访问以及执行访问 来定义的。
1.文件属性的分类
(1)是什么?
当我们查看 ls 命令输出结果可以看到它的文件属性,如下:
> foo.txt
# **仅仅使用重定向符,并在它之前不加任何命令,就可以删除一个已存在的文件内容**,
或者创建一个新的空文件。
ls -l foo.txt
# 以 长列表形式 查看foo.txt文件信息
文件属性分类.png
输出结果前 10 个字符表示的是文件属性。
文件类型 | 所有者权限 | 组权限 | 其它用户权限 |
---|---|---|---|
- | rw- | r-- | r-- |
(2)文件类型
文件属性(前10个字符)中,第 1 个字符表示文件类型。
属性 | 文件类型 |
---|---|
- | 普通文件。 |
d | 目录文件。 |
l | 符号链接。(注意: 对于符号链接文件,剩下的文件属性始终是 rwxrwxrwx,它是个伪属性值。符号链接所指向的文件的属性才是真正的文件属性。) |
c | 字符设备文件。该文件类型表示以字节流形式处理数据的设备,如终端或调制解调器。 |
b | 块设备文件。该文件类型表示以数据块形式处理数据的设备,如硬盘驱动或光盘驱动。 |
(3)文件模式
文件属性(前10个字符)中,剩下的 9 个字符称为文件模式,分别表示文件所有者、文件所属群组以及其它所有用户对该文件的读取、写入、执行操作。
分别设置 r、w、x 的模式属性将会对文件和目录带来不同的影响。
① 权限属性
属性 | 文件 | 目录 |
---|---|---|
r | 允许打开和读取文件。 | 如果设置了执行权限,那么允许列出目录下的内容。 |
w | 允许写入或截短文件。如果也设置了执行权限,那么目录中的文件允许被创建、被删除、被重命名。 | 但是该权限不允许重命名或删除文件由目录权限决定。 |
x | 允许把文件当作程序一样来执行。用脚本语言写的程序文件必须被设置为可读,以便能被执行。 | 允许可以进入目录中,例如:cd directory |
权限属性示例
文件属性 | 含义 |
---|---|
- rwx --- --- | 普通文件。文件所有者:具有读取、写入、执行权限。组成员和其它所有用户都没有任何访问权限。 |
- rw- --- --- | 普通文件。文件所有者:具有读取、写入权限。组成员、其它所有用户都没有任何访问权限。 |
- rw- r-- r-- | 普通文件。文件所有者:具有读取、写入权限。组成员、其它所有用户具有 可读权限。 |
- rwx r-x r-x | 普通文件。文件所有者:具有读取、写入、执行权限。组成员和其它所有用户具有 可读和执行 权限。 |
- rw- rw- --- | 普通文件。文件所有者:具有读取、写入权限。组成员:具有读取、写入权限。其它所有用户:没有任何访问权限。 |
L rwx rwx rwx | 符号链接。所有的符号链接文件显示的都是伪权限属性。真正的权限属性由符号链接所指向的实际文件决定。 |
d rwx rwx --- | 目录文件。文件所有者、组成员:可以进入该目录,而且可以创建、重命名、删除该目录下的文件。 |
d rwx r-x --- | 目录文件。文件所有者:可以进入该目录,而且可以创建、重命名、删除该目录下的文件。组成员:可以进入该目录,但是不能创建、重命名、删除该目录下的文件。 |
2.chmod-更改文件模式
使用 chmod 命令更改文件或目录的权限(文件模式,文件模式就是权限)。
chmod 命令支持两种不同的改变文件模式(权限)的方式:八进制数字表示法、符号表示法。
注意
只有文件所有者、超级用户才可以更改文件或目录的权限(文件模式)。
(1)语法格式
chmod [options] mode file...
功能: 更改文件或目录的权限(注意:只有文件所有者、超级用户才可以更改)
参数:
① options: 选项,可选参数。
② mode : 权限(即想修改成的目标权限)。
③ file : 文件名。
选项:
以下是chmod使用的一些常用选项:
① -f, --silent, --quiet:若该文件权限无法被更改也不要显示错误信息(--silent,--quiet,当chmod不能改变文件模式 时,不通知文件的用户)。
② -v, --verbose:无论是否修改成功,为每个处理的文件输出诊断信息。
③ -c, --changes: 若该文件权限确实已经更改,才显示更改动作(只输出被改变文件的信息)。
④ -R, --recursive:对当前目录下的所有文件与子目录进行**相同**的权限变更(即以递归的方式逐个变更)。
⑤ --help:显示帮助和退出。
⑥ --version:输出版本信息和退出。
返回值:
'''
(2)八进制数字表示法
① 是什么/为什么?
八进制数字表示法:指的是使用八进制数字来设置所期望的权限。
因为每个八进制数字对应着 3 个二进制数字,所以这种对应关系正好可以和用来存储文件模式的结构方式一一映射。
② 二进制和八进制方式表示文件模式(权限)
八进制 | 二进制 | 文件模式 |
---|---|---|
0 | 000 | --- |
1 | 001 | --x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r-- |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
③ 使用
通过使用 3 位八进制数字,可以分别设置文件所有者、组成员、其它所有用户的文件模式。
示例
> foo.txt
ls -l foo.txt
chmod 600 foo.txt
ls -l foo.txt
通过传递参数600,可以设置文件所有者具有读写权限,而组成员、其它所有用户则被取消任何权限。
虽然看起来,要记住八进制和二进制之间的映射关系好像不是那么简单,但是实际上,常用的只有这几个而已:
7(rwx)、6(rw-)、5(r-x)、4(r--)、0(---)。
(3)符号表示法
chmod 命令也支持一种符号表示法来指定文件模式。
① 三部分
符号表示法分为 3 部分:更改会影响谁、要执行哪个操作、要设置哪种权限。
Ⅰ.更改会影响谁
可以通过字符 u、g、o、a 的组合来指定要影响的对象。
字符 | 含义 |
---|---|
u | user 的简写,表示文件或目录的所有者。 |
g | 文件所属群组。 |
o | others 的简写,表示其它所有用户。 |
a | all 的简写,是 u 、g、o 三者的组合。 |
如果没有指定字符,则假定使用 all 。
Ⅱ.要执行哪个操作
操作符“ + ”:表示添加一种权限。
操作符“ - ”:表示删除一种权限。
操作符“ = ”:表示只有指定的权限可用,其它所有权限都被删除。
Ⅲ.要设置哪种权限
权限由字符 r、w、x 来指定。
② 示例
符号 | 含义 |
---|---|
u+x | 为文件所有者添加可执行权限。 |
u-x | 删除文件所有者可执行权限。 |
+x | 为文件所有者、群组、其它所有用户添加可执行权限。(等价于a+x) |
o-rw | 删除其它所有用户的读写权限。 |
go=rw | 为群组、其它所有用户指定读写权限(若群组、其它所有用户之前已经具有可执行权限,那么删除它们的可执行权限)。 |
u+x, go=rx | 为文件所有者添加可执行权限。同时设置群组、其它所有用户指定读写权限。(注意:指定多种权限时,需用逗号分隔) |
(4)总结
有的人喜欢使用八进制表示法,有的人喜欢符号表示法。
符号表示法的优点在于允许设置单个属性,而不影响其它的任何属性。
其次,可以查看 chmod 命令的帮助页面,以获取更多的细节内容和选项信息。
关于 -- recursive 选项,需要注意的是,它对文件和目录都起作用,所以该选项并不如想象中的那么有用,因为用户很少会给文件和目录设置相同的权限。
4.umask-设置默认权限
umask 命令控制着创建文件时指定给文件的默认权限。
它使用八进制表示法来表示从文件模式属性中删除一个位掩码。
(1)语法格式
umask [权限掩码]
'''
功能: 创建文件时指定给文件的默认权限
参数:
① 权限掩码: 以八进制表示。
(注意: 当不指定模式时,是查看默认的umask。当指定模式时,系统就会采用指定的模式,
但是,指定的是临时生效的,也就是在当前 shell下,如果想全局永久生效,
那么就需要修改配置文件/etc/bashrc)
选项:
返回值:
'''
示例
Ⅰ.不带任何参数的 umask 命令
umask
运行不带任何参数的 umask 命令,就会查看当前掩码,得到的值是通常是 0002(0022是另一个常用默认值),它是掩码的八进制表示形式。
Ⅱ.
rm -f foo.txt
# 删除 foo.txt 文件存在的所有副本,以保证一切都是重新开始。
umask
# 查看当前掩码
> foo.txt
# 创建 foo.txt 文件。
ls -l foo.txt
# 查看 foo.txt 文件的相关信息。
umask命令示例默认掩码值.png
会发现,文件所有者、群组获得了读写权限;而其它所有用户则只获得了读权限。
其它所有用户没有写权限的原因在于掩码值。
Ⅲ.自己设置掩码值0000
rm -f foo.txt
# 删除 foo.txt 文件存在的所有副本,以保证一切都是重新开始。
umask 0000
# 设置掩码为 0000 (实际上是关闭该功能)
> foo.txt
# 创建 foo.txt 文件。
ls -l foo.txt
# 查看 foo.txt 文件的相关信息。
umask命令示例设置掩码值0000.png
在设置掩码为 0000 (实际上是关闭该功能)后,可看到其它所有用户也拥有写权限了。
为了理解它是如何实现的,先来看看八进制数,若把该掩码展开成二进制形式,然后再与属性进行对比,就会明白:
原始文件模式 | --- | rw- | rw- | rw- |
---|---|---|---|---|
掩码 | 000 | 000 | 000 | 010 |
结果 | --- | rw- | rw- | r-- |
如上表格,先忽略掉掩码中最前面的 0 (第1列),观察掩码中出现 1 的地方,会发现 1 所对应的属性被删除,在此例中对应的是其它所有用户的写权限,这就是掩码的操作方式。
掩码的二进制数值中每个出现 1 的位置,其对应的属性都被取消。
Ⅳ.设置掩码值为0022
若设置掩码值为0022,具体操作如下:
原始文件模式 | --- | rw- | rw- | rw- |
---|---|---|---|---|
掩码 | 000 | 000 | 000 | 010 |
结果 | --- | rw- | rw- | r-- |
同样,二进制数值中每个出现 1 的位置,其对应的属性都被取消。
你也可以再试一下其它的掩码值(可以尝试一些带数字 7 的),以此熟悉掩码的操作方式。
切记
记得每次操作完之后清理文件,并把掩码值还原到默认值。
rm foo.txt; umask 0002 #用冒号分隔多条命令
应用
大多数情况下,我们并不需要修改掩码值,系统提供的默认掩码值就很好了。
然而,在一些高安全级别的环境下,则需要控制掩码值。
网友评论