0714-Linux基础(7)

221 阅读6分钟

文件权限

Linux 上一切皆文件,只是为了便于区分,我们会对应的把具有不同特性的文件,叫不同的名字,所以呢,其实目录也是一种文件

文件权限具有三个类别:用户权限,用户组权限,其他权限。越具体的权限,就越具有优先权。

每个类别又分别具有三个更细分的权限。

权限对文件的影响对目录的影响
r(读取)可以读取文件内容可以列出目录的内容 (该目录下的文件名)
w(写入)可以更改文件内容可以创建或删除目录中的任一文件
x(执行)可以作为命令执行文件目录可作为当前工作目录(可以 cd 进此目录,但还需要 r 权限才能列出里面的文件)

Linux 默认情况下,如果修改文件夹的权限,其子文件(或文件夹)不会去继承响应权限,这点和 Windows 不同,这样做的目的在于,防止给子文件中潜在的病毒文件,赋予运行权限

使用 ls -l 命令可以查看当前目录下的文件相关权限信息,如果 ls -ld 的话,则会显示目录本身(而非其内容)的相关信息。

1.png

长列表中,第一个字符表示文件的类型: -(常规文件)、d(目录)、l是软链接、ps 等其他设备。

长列表中,剩下的九个字符,每三个一组,代表着用户权限、用户组权限、其他权限。

管理文件的权限

可以使用 chmod (即 change mode 的缩写) 来更改文件的相关权限,当然前提是当前登录用户是否具有调用 chmod 命令的权限, 之后不再赘述

chmod WhoWhatWhich file|directory

  • Who: ugoa (用户、组、其他、全部)
  • What: +-= (添加、删除、精确设置)
  • Which: rwx (读取、写入、执行)

另外,chmod 命令支持 -R 参数,递归设置整个目录的文件权限,不过要记住, 如果对目录使用了这个参数,最后在给目录设置 执行权限时,使用 X(表示执行权限不会被递归继承,原因上面有说),而不是 x

rwx 如果用数字指代则分别是 421, 然后按照之前的每三个一组,进行相加,就是数字的表示方式,比如 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 的问题,当然之后他也给我进行了解释

问题: 提前设置 umask0231 ,随后创建一个文件 1.txt, 如果按照之前说的,就应该 0666 - 0231 = 0435 (即 r--r--r-x) ,但实际上是 r--r--rw-

解答: 因为创建文件默认是不会具有执行权限的。

反思: 所以其实不是 0666 - 0231, 而应该是 0777 - 0231 = 0546(即 r-xr--rw-),然后去除所有组的 x 权限

注意

一定要记住, root 用户可以操作系统上的任意文件,哪怕这个文件,归其他用户所有。

0.png