9.4 Linux权限如何设定(权限位)
- Linux 系统,最常见的文件权限有 3 种,即对文件的读(用 r 表示)、写(用 w 表示)和执行(用 x 表示,针对可执行文件或目录)权限。在 Linux 系统中,每个文件都明确规定了不同身份用户的访问权限,通过 ls 命令即可看到。
在Linux中我们可以使用ll -l或者lls-l命令来显示一个文件的属性以及文件所属的用户和组
除此之外,”d”在Linux中代表该文件是一个目录文件,我们有时会看到 s(针对可执行文件或目录,使文件在执行阶段,临时拥有文件所有者的权限)和 t(针对目录,任何用户都可以在此目录中创建文件,但只能删除自己的文件),文件设置 s 和 t 权限,会占用 x 权限的位置。
-
在Liux中第一个字符代表这个文件是目录、文件或链接文件等等:
- 当为[d]则是目录
- 当为[-]则是文件;
- 若是[I]侧表示为链接文档(link file);
- 若是[b]则表示为装置文件里面的可供储存的接口设备(可随机存取装置)
- 若是[c]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
- 接下来的字符中,以三个为一组,且均为
rwx
的三个参数的组合。 - 其中,[r]代表可读(read)、[w]代表可写(write)、[x]代表可执行(execute)。
- 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[-]而已。
-
以 root 的身份登陆 Linux,并执行如下指令:
[root@CncLucZK test]# ll -l
total 5280
-rw-r--r-- 1 root root 38 Oct 12 23:10 add.sh #root用户都没有执行权限x,其他用户也没有
-rw-r--r-- 1 root root 41 Oct 12 23:10 awk.sh
-rw-r--r-- 1 root root 5324748 Oct 12 23:10 blog.docx
drwxr-xr-x 3 root root 4096 Oct 9 21:11 config
-rwxr-xr-x 1 zk zk 90 Oct 13 18:56 demo2.txt
-rw-r--r-- 1 root root 90 Oct 13 20:06 demonew.txt
-rw-r--r-- 1 root root 90 Oct 14 00:53 demoold.txt
-rw-r--r-- 1 root root 2612 Oct 12 23:10 demotmo.txt
-rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
-rw-r--r-- 1 root root 79 Oct 12 23:10 demo.txt.bz2
-rw-r--r-- 1 root root 312 Oct 13 20:07 differ.patch
-rw-r--r-- 1 root root 0 Oct 13 19:03 differ.txt
-rw-r--r-- 3 root root 95 Oct 12 23:10 hardlink.txt
-rw-r--r-- 3 root root 95 Oct 12 23:10 index.html
-rw-r--r-- 1 root root 37 Oct 12 23:10 replace.txt
-rw-r--r-- 1 root root 9 Oct 12 23:10 softlink
-rw-r--r-- 1 root root 381 Oct 12 23:10 test1.sh
-rwxr-xr-x 1 root root 117 Oct 12 23:10 test.sh
lrwxrwxrwx 1 root root 7 Oct 12 23:10 tmp_s.txt -> tmp.txt #tmp_s.txt快捷方式指向tmp.txt具体文件或目录
-rw-r--r-- 1 root root 6 Oct 12 23:10 tmp.txt
drwx--x--x 4 root root 4096 Oct 12 23:10 user
drwx--x--x 6 root root 4096 Oct 12 23:10 users
-rw-r--r-- 1 root root 382 Oct 13 18:33 users.tar.gz
- 在以上实例中,user 文件是一个目录文件,属主和属组都为 root,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。
- 可以看到,每行的第一列表示的就是各文件针对不同用户设定的权限,一共 10 位,但第 1 位用于表示文件的具体类型
从左至右用 0-9 这些数字来表示。
第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。
第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
其中,第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 – 字符表示,则没有读权限;
第 2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 – 字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 – 字符表示,则没有执行权限。
可能其他版本或早些版本还有一位,最后一位此文件受 SELinux 的安全规则管理
- 因此,为文件设定不同用户的读、写和执行权限,仅涉及到 9 位字符,以 ls 命令输出信息中的 demo.txt文件为例,设定不同用户的访问权限是 rw-r–r–,各权限位的含义如下图所示。
在这里插入图片描述
- 从图中可以看到,Linux 文件的基本权限就有九个,Linux 将访问文件的用户分为 3 类,分别是文件的所有者,所属组(也就是文件所属的群组)以及其他人,三种身份各有自己的 read/write/execute 权限。。 有关群组的概念,我们已在用户和用户组一章中做了说明。除了所有者,以及所属群组中的用户可以访问文件外,其他用户(其他群组中的用户)也可以访问文件,这部分用户都归为其他人范畴。
- 很显然,Linux 系统为 3 种不同的用户身份,分别规定了是否对文件有读、写和执行权限。拿上图来说,文件所有者拥有对文件的读和写权限,但是没有执行权限;所属群组中的用户只拥有读权限,也就是说,这部分用户只能读取文件内容,无法修改文件;其他人也是只能读取文件。
- Linux 系统中,多数文件的文件所有者和所属群组都是 root(都是 root 账户创建的),这也就是为什么,root 用户是超级管理员,权限足够大的原因。
9.5 chmod命令:修改文件或目录的权限
- chmod 命令:可以手动修改文件的访问权限。chmod 命令设定文件权限的方式有 2 种,分别可以使用数字或者符号来进行权限的变更。
9.5.1 chmod命令使用数字修改文件权限
- Linux 系统中,文件的基本权限由 9 个字符组成,以 rwxrw-r-x 为例,这九个权限是三个三个一组的,我们可以使用数字来代表各个权限,各个权限与数字的对应关系如下:
r --> 4
w --> 2
x --> 1
- 由于这 9 个字符分属 3 类用户,因此每种用户身份包含 3 个权限(r、w、x),通过将 3 个权限对应的数字累加,最终得到的值即可作为每种用户所具有的权限。拿 rwxrw-r-x 来说,所有者、所属组和其他人分别对应的权限值为:此权限对应的权限值就是 765。
所有者 = rwx = 4+2+1 = 7
所属组 = rw- = 4+2 = 6
其他人 = r-x = 4+1 = 5
- 使用数字修改文件权限的 chmod 命令基本格式为:-R(注意是大写)选项表示连同子目录中的所有文件,也都修改设定的权限。
[root@CncLucZK ~]# chmod [-R] 权限值 文件名 #权限值就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
- 如使用如下命令,即可完成对 demo2.txt 目录文件的权限修改:
[root@CncLucZK test]# ll -l demo.txt
-rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
[root@CncLucZK test]# chmod 776 demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rwxrwxrw- 1 zk root 2612 Oct 15 23:01 demo.txt
通常我们以 Vim 编辑 Shell 文件批处理文件后,文件权限通常是 rw-rw-r–(644),那么,如果要将该文件变成可执行文件,并且不让其他人修改此文件,则只需将此文件的权限该为 rwxr-xr-x(755)即可。
9.5.2 chmod命令使用字母修改文件权限(常用)
-
既然文件的基本权限就是 3 种用户身份(所有者user、所属组group和其他人others)搭配 3 种权限(rwx),chmod 命令中用 u、g、o 分别代表 3 种身份,还用 a 表示全部的身份(all 的缩写)。另外,chmod 命令仍使用 r、w、x 分别表示读、写、执行权限。
-
使用字母修改文件权限的 chmod 命令,其基本格式如下图所示。
-
如果我们要设定 demo.txt 文件的权限为 rwxr-xr-x,则可执行如下命令:
[root@CncLucZK test]# chmod 644 demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
[root@CncLucZK test]# chmod u=rwx,go=rx demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rwxr-xr-x 1 zk root 2612 Oct 15 23:01 demo.txt
- 如果想要增加demo.txt 文件的每种用户都可做写操作的权限,可以使用如下命令:
[root@CncLucZK test]# chmod 644 demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
[root@CncLucZK test]# chmod a+w demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rw-rw-rw- 1 zk root 2612 Oct 15 23:01 demo.txt
- 而如果是要将权限去掉而不改变其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:
[root@CncLucZK ~]# chmod u+x,g+x,o+x demo.txt
[root@CncLucZK ~]# ll -d demo.txt
-rwxr-xr-x 1 root root 59 Oct 10 23:09 demo.txt
[root@CncLucZK ~]# chmod a-x demo.txt
[root@CncLucZK ~]# ll -d demo.txt
-rw-r--r-- 1 root root 59 Oct 10 23:09 demo.txt
9.6 umask命令:令新建文件和目录拥有默认权限
-
Linux 是注重安全性的操作系统,而安全的基础在于对权限的设定,不仅所有已存在的文件和目录要设定必要的访问权限,创建新的文件和目录时,也要设定必要的初始权限。Windows 系统中,新建的文件和目录时通过继承上级目录的权限获得的初始权限,而 Linux 不同,它是通过使用 umask 默认权限来给所有新建的文件和目录赋予初始权限的。
-
如何得知 umask 默认权限的值呢?直接通过 umask 命令即可:
[root@CncLucZK ~]# umask
0022
#root用户默认是0022,普通用户默认是 0002
umask 默认权限由 4 个八进制数组成,但第 1 个数代表的是文件所具有的特殊权限(SetUID、SetGID、Sticky BIT),后 3 位数字 “022” 才是本节真正要用到的 umask 权限值,将其转变为字母形式为 —-w–w-。
注意,虽然 umask 默认权限是用来设定文件或目录的初始权限,但并不是直接将 umask 默认权限作为文件或目录的初始权限,还要对其进行 “再加工”。
- 文件和目录的真正初始权限,可通过以下的计算得到:官方的标准算法,需要将 umask 默认权限使用二进制并经过逻辑与和逻辑非运算后,才能得到最终文件或目录的初始权限
文件(或目录)的初始权限 = 文件(或目录)的最大默认权限 - umask权限
-
显然,如果想最终得到文件或目录的初始权限值,我们还需要了解文件和目录的最大默认权限值。在 Linux 系统中,文件和目录的最大默认权限是不一样的:
- 对文件来讲,其可拥有的最大默认权限是 666,即 rw-rw-rw-。也就是说,使用文件的任何用户都没有执行(x)权限。原因很简单,执行权限是文件的最高权限,赋予时绝对要慎重,因此绝不能在新建文件的时候就默认赋予,只能通过用户手工赋予。
- 对目录来讲,其可拥有的最大默认权限是 777,即 rwxrwxrwx。
-
接下来,我们利用字母权限的方式计算文件或目录的初始权限。以 umask 值为 022 为例,分别计算新建文件和目录的初始权限:
- 文件的最大默认权限是 666,换算成字母就是 “-rw-rw-rw-”,umask 的值是 022,换算成字母为 “—–w–w-”。把两个字母权限相减,得到 (-rw-rw-rw-) – (—–w–w-) = (-rw-r–r–),这就是新建文件的初始权限。
[root@CncLucZK test]# ll demotmo.txt
-rw-r--r-- 1 root root 2612 Oct 12 23:10 demotmo.txt
-
- 目录的默认权限最大可以是 777,换算成字母就是 “drwxrwxrwx”,umask 的值是 022,也就是 “—–w–w-”。把两个字母权限相减,得到的就是新建目录的默认权限,即 (drwxrwxrwx) – (—–w–w-) = (drwxr-xr-x)
[root@CncLucZK test]# ll -d users
drwx--x--x 6 root root 4096 Oct 12 23:10 users
注意,在计算文件或目录的初始权限时,不能直接使用最大默认权限和 umask 权限的数字形式做减法,这是不对的。例如,若 umask 默认权限的值为 033,按照数字形式计算文件的初始权限,666-033=633,但我们按照字母的形式计算会得到 (rw-rw-rw-) – (—-wx-wx) = (rw-r–r–),换算成数字形式是 644。
这里的减法,其实是“遮盖”的意思,也就是说,最大默认权限中和 umask 权限公共的部分,通过减法运算会被遮盖掉,最终剩下的“最大默认权限”,才是最终赋予文件或目录的初始权限。
- umask默认权限的修改方法:umask 权限值可以通过如下命令直接修改:
[root@CncLucZK test]# umask
0022
[root@CncLucZK test]# su - zk
Last login: Sat Oct 15 23:12:21 CST 2022 on pts/0
[zk@CncLucZK ~]$ umask
0002
[zk@CncLucZK ~]$ umask 0003
[zk@CncLucZK ~]$ umask
0003
不过,这种方式修改的 umask 只是临时有效,一旦重启或重新登陆系统,就会失效。如果想让修改永久生效,则需要修改对应的环境变量配置文件 /etc/profile。例如:
[root@CncLucZK test]# vi /etc/profile
...
if [ $UID -gt 199]&&[ "'id -gn'" = "'id -un'" ]; then
umask 002
#如果UID大于199(普通用户),则使用此umask值
else
umask 022
#如果UID小于199(超级用户),则使用此umask值
fi
…
- 这是一段 Shell 脚本程序,规定了普通用户的 umask 由 if 语句的第一段定义,而超级用户 root 的 umask 值由 else 语句定义即可。 修改此文件,则 umask 值就会永久生效。
参考文献:
Linux 文件基本属性
Linux权限位(超详细)
下一篇:Linux学习-32-ACL访问控制权限
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123760.html