文件权限
Linux 上一切皆文件,只是为了便于区分,我们会对应的把具有不同特性的文件,叫不同的名字,所以呢,其实目录也是一种文件。
文件权限具有三个类别:用户权限,用户组权限,其他权限。越具体的权限,就越具有优先权。
每个类别又分别具有三个更细分的权限。
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
r(读取) | 可以读取文件内容 | 可以列出目录的内容 (该目录下的文件名) |
w(写入) | 可以更改文件内容 | 可以创建或删除目录中的任一文件 |
x(执行) | 可以作为命令执行文件 | 目录可作为当前工作目录(可以 cd 进此目录,但还需要 r 权限才能列出里面的文件) |
Linux 默认情况下,如果修改文件夹的权限,其子文件(或文件夹)不会去继承响应权限,这点和 Windows 不同,这样做的目的在于,防止给子文件中潜在的病毒文件,赋予运行权限
使用 ls -l
命令可以查看当前目录下的文件相关权限信息,如果 ls -ld
的话,则会显示目录本身(而非其内容)的相关信息。
长列表中,第一个字符表示文件的类型: -
(常规文件)、d
(目录)、l
是软链接、p
、s
等其他设备。
长列表中,剩下的九个字符,每三个一组,代表着用户权限、用户组权限、其他权限。
管理文件的权限
可以使用 chmod
(即 change mode 的缩写) 来更改文件的相关权限,当然前提是当前登录用户是否具有调用 chmod
命令的权限, 之后不再赘述。
chmod WhoWhatWhich file|directory
- Who:
u
、g
、o
、a
(用户、组、其他、全部) - What:
+
、-
、=
(添加、删除、精确设置) - Which:
r
、w
、x
(读取、写入、执行)
另外,chmod
命令支持 -R
参数,递归设置整个目录的文件权限,不过要记住, 如果对目录使用了这个参数,最后在给目录设置 执行权限时,使用 X
(表示执行权限不会被递归继承,原因上面有说),而不是 x
。
r
、w
、x
如果用数字指代则分别是 4
、2
、1
, 然后按照之前的每三个一组,进行相加,就是数字的表示方式,比如 777
, 就表示 rwxrwxrwx
。
# 设置 用户组 的 可读可写权限
chmod g=rw file0
# 去除 用户组 和 其他用户 的 可读可写 的权限
chmod go-rw file1
# 追加 用户 用户组 其他用户的权限 为 可执行
chmod a+x file2
# 递归追加 test1 目录 及其子文件的权限 为 可读可写可执行
chmod -R g+rwx test1
# 追加 test2 目录的 可读可写可执行权限, 递归追加 test2 目录下所有文件的 可读可写, 不追加可执行权限 (若是其子文件之前有可执行权限,则依然具有可执行权限)
chmod -R g+rwx test2
# 数值法修改
# 设置 用户的 可读可写 权限, 设置 用户组 的可读可执行权限, 设置 其他用户的 可读权限。
chmod 654 file3
更改文件或目录的用户或用户组
如果想要更改文件或目录的用户或用户组, 可以使用 chown
命令,前提是已经具有 某用户 或 某用户组,当然,还需要当前用户具有执行此命令的权限, 好吧,我又重复了一遍。
# 修改 file0 的所属用户为 student
chown student file0
# 修改 file1 文件的 所属用户组为 admins
chown :admins file0
# 修改 file3 的所属用户 和 所属组
chown student file3
管理默认权限和文件访问
特殊权限
除了之前的 读、写、执行权限,还有存在第四种权限,即 **特殊权限。
特殊权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
u(针对用户) + s(suid) | 以拥有文件的用户身份执行(而不是当前用户) | 无影响 |
g(针对用户组) + s(sgid) | 以拥有文件组身份执行(而不是当前用户) | 在目录中创建新文件时,会将文件的用户组设置成与目录相匹配的用户组(而不是当前用户的用户组) |
o(针对其他用户) + t(sticky) | 无影响 | 对目录具有写入权限的用户仅可以删除当前用户所拥有的权限,而无法删除或强制保存其他用户所拥有的文件 |
由于多出了第四种权限,但用于表示权限的位置只有 9 个(三组),那么用字符表示时,会将每一组的第三个字符进行改变。 如果需要用数字表示的话,则在最前面加一位八进制数,值为三个特殊权限的数值和 (4, 2, 1)
# 都没有特殊权限
# 0777
rwxrwxrwx
# 有特殊权限
# s s t 表示 用户(用户组、其他用户) 有 特殊权限 和 可执行权限
# 7777
rwsrwsrwt
# 有特殊权限,但没有 执行权限
# S S T 表示 用户 (用户组、其他用户) 有特殊权限 但没有可执行权限
# 7666
rwSrwSrwT
# 当然 S S T 没有任何联系,比如这样
# rwSrw-rwt 5767 S 表示用户有特殊权限(但没有可执行权限),- 表示用户组 没有特殊权限 没有可执行权限 t 表示 其他用户有特殊权限,有执行权限
# 6767
rwsrwSrwx
特殊权限的设置的方式与普通权限其实是一样一样的
chmod g+s test1
chmod u-s test2
# 7654 可以这样换算
# 7 S S T # (S + x) = s # (T + x) = t
# 654 rw-r-xr--
# 最后 rwSrxsr-T
chmod 7654 file1
默认文件权限
当用户创建新文件或新目录时,会为其分配其默认的初始权限,其中有两个因素会影响到这些初始权限,第一个是创建的类型(文件还是目录),其次是(当前 shell 所设定)的 umask
值。
如果新建目录,系统会初始分配 0777
权限给目录,如果新建文件,系统则初始分配 0666
权限给文件。然后减去 umask
值,得出最后的权限(最权限为 0000
)。
Bash shell 默认的 umask
值在 /etc/profile
和 /etc/bashrc
文件中定义,另外也可以在 /etc/profile.d
目录下,自己去创建脚本。(因为 /etc/profile
文件会去执行 /etc/profile.d
目录下的所有可执行脚本)。
用户可以在自己的主目录下的 .bash_profile
和 .bashrc
文件中覆盖系统默认值。 当然也可以使用 umask
这个命令(没错,是这个指令)去设置 umask
值。
补充: 有同事跟我说关于 umask 的问题,当然之后他也给我进行了解释
问题: 提前设置 umask
为 0231
,随后创建一个文件 1.txt
, 如果按照之前说的,就应该 0666 - 0231 = 0435
(即 r--r--r-x
) ,但实际上是 r--r--rw-
。
解答: 因为创建文件默认是不会具有执行权限的。
反思: 所以其实不是 0666 - 0231
, 而应该是 0777 - 0231 = 0546
(即 r-xr--rw-
),然后去除所有组的 x
权限
注意
一定要记住, root 用户可以操作系统上的任意文件,哪怕这个文件,归其他用户所有。