在Linux系统中,权限决定了谁能做什么。本文将指导你如何掌握这些权限,以确保你的系统既安全又高效!

目录

1.shell命令及其运行原理

2.Linu权限的概念

(1) 用户

(2) 切换用户命令su

(3) 指令提权命令sudo 

(4) 什么是权限?

(5) 为什么要有权限? 

3.Linux权限管理

(1) 文件访问者的分类(人)

(2) 文件类型和访问权限(实物属性)

① 基本权限

② 文件的类型与权限图示: 

③ 文件类型

(3) 文件权限值的表示方法

① 字符表示方式

② 八进制表示方式

(4) 文件访问权限的相关设置方法

① chmod命令

<1> 符号类型修改文件权限 

<2> 数字类型修改文件权限

<3>重点部分★

② chown命令

③ chgrp命令

④ umask命令

(5) 问题一:目录的权限

(6) 问题2:缺省权限

① 为什么默认权限是现在这样?

② 设置umask的目的是什么?

③ 为什么要有umask?

④ 修改umask

(7) 问题3:粘滞位

① 非文件拥有者却能删除文件?

② 粘滞位 +t(权限标志位)

4.总结


1.shell命令及其运行原理

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户,不能直接使用kernel。而是通过kernel的外壳程序,也就是所谓的Shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?

操作系统其实是一组软件,由于这些软件在控制整个硬件与管理系统的活动检测,如果这组软件能被用户随意操作,若用户应用不当,将会使得整个系统崩溃,但我们还是需要用户去使用操作系统,所以就有了在操作系统上面发展的应用程序,也就是外壳程序。外壳程序的功能只是提供用户操作系统的一个界面,因此需要通过调用其他能够操作应用程序的软件,也就是前面学过的命令。

也就是说,只要能够操作应用程序的软件都能构成为Shell。狭义的Shell是指命令行方面的软件,广义的Shell则包括用户图形化界面模式的软件等。

综上,从技术角度,Shell的最简单定义:命令行解释器(command interpret)主要包含:

1、将使用者的命令翻译给核心(kernel)处理。

2、同时,将核心的处理结果翻译给使用者。

对比Windows GUI,我们操作Windows不是直接操作Windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符,或者运行起来一个应用程序)。

shell对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。

shell VS bash, shell是所有外壳程序的统称,具体Linux下的外壳程序是bash !还有其他的操作系统的外壳程序是sh、xsh ...。

2.Linu权限的概念

(1) 用户

Windows下有管理员(admin)和普通用户,Linux下有两种用户:超级用户(root)、普通用户。

超级用户(root):在Linux下做任何事,不受限制

普通用户:在Linux下做有限的工作

超级用户的命令提示符是#,普通用户的命令提示符是$

(2) 切换用户命令su

命令 su [ 用户名 ]
功能 :切换用户。
例如,要从 root 用户切换到普通用户名 user ,则使用 su user 。不用输密码。
要从普通用户 user 切换到 root 用户则使用 su root( root 可以省略)/ su - ,此时系统会提示输入 root 用户的密码。
->可以让用户进行身份变化,提高权限。

(3) 指令提权命令sudo 

sudo:进行指令的短暂提权,比如安装软件时,普通用户没有操作/usr/bin/目录的权限,就需要root权限。--- Linux上的指令其实只安装了一份,允许同时使用,只是权限不同。

那有了sudo命令,岂不是root用户形同虚设??

 那让我们在普通用户下执行一下sudo ls 指令,却发现无法执行!它说普通用户zyt不在sudoers文件里。sudoers文件是控制sudo命令提权的。意味着zyt用户没有权限执行需要提升权限的命令

(4) 什么是权限?

权限的本质是:能或者不能做什么事。

(5) 为什么要有权限? 

1、控制用户的行为,防止错误的发生。

2、理解:权限首先限制的是角色(人),其次权限要求目标必须具备对应的属性。

=> 权限 == 角色 + 目标权限属性

Linux下一切皆文件,所以对应的权限就是读(r)、写(w)、执行(x)!

3.Linux权限管理

(1) 文件访问者的分类(人)

• 文件和文件目录的所有者(拥有者):u---User
• 文件和文件目录的所有者所在的组的用户(所属组):g---Group
其它用户:o---Others (other不需要记录)

(2) 文件类型和访问权限(实物属性)

① 基本权限

● 读 (r): 对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限

● 写(w): 对文件而言,具有修改文件内容的权限;对目录来说,具有删除移动目录内文件的权限

● 执行(x): 对文件而言,具有执行文件内容的权限;对目录来说,具有进入该目录的权限

● “-”:表示不具有该项权限 

表述时,要加上前提角色。

② 文件的类型与权限图示: 

● 第一个字符表示这个文件是目录、文件或链接文件等。[d]开头是目录,[-]开头是文件,[l]则是链接文件,[b]表示为设备文件里的可供存储的周边设备,[c]表示设备文件里的串行端口设备。

● 接下来绿色部分以三个为一组,且均为 [rwx] 三个参数的组合。要注意这三个权限的位置不会改变,如果没有权限就会出现 [-] 而已。第一组为文件拥有者可具备的权限,第二组为所属组可具备的权限,第三组为其他用户可具备的权限。

● 第三栏表示有多少文件名链接到此节点。每个文件都会将他的权限与属性记录到文件系统的节点里,不过我们使用的目录树却是用文件名来记录,因此每一个文件名就会链接到一个节点,这个属性记录的就是有多少文件连接到这个节点号码。

③ 文件类型

是用文件属性的第一个字符作区分:

d:文件夹

-:普通文件(常用)

l:软连接(类似Windows的快捷方式)

b:块设备文件(例如硬盘,光驱等)

p:管道文件

c:字符设备文件(例如屏幕等串口设备)

s:套接口文件

注意:在Linux下,系统不关心文件后缀(文本,可执行,库,图片...),但不代表禁止使用后缀。也不代表工具(gcc,g++)不关心后缀,比如 .txt 的文件就无法通过编译。

(3) 文件权限值的表示方法

① 字符表示方式

② 八进制表示方式

(4) 文件访问权限的相关设置方法

① chmod命令

功能: 设置文件的访问权限
格式: chmod [ 参数 ] 权限 文件名
常用选项:
        R -> 递归修改目录文件的权限
        说明:只有文件的拥有者和root才可以改变文件的权限
<1> 符号类型修改文件权限 

Linux基本的九个权限分别是(1) user (2) group (3) others 三种身份,那么我们可以借由u,g,o来表示三种身份的权限。此外a表示all即全部身份。

实践:设置一个文件权限为【-rwxr-xr-x】:

# go->g/o
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# chmod u=rwx,go=rx a.c
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# ll
total 0
-rwxr-xr-x 1 root root 0 Nov  4 08:02 a.c
-r--r--r-- 1 root root 0 Nov  4 08:02 b.c

假如不知道先前文件的属性,但想增加 b.c 这个文件每个人都能写入的权限:

[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# chmod a+w b.c
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# ll
total 0
-rwxr-xr-x 1 root root 0 Nov  4 08:02 a.c
-rw-rw-rw- 1 root root 0 Nov  4 08:02 b.c

要拿掉所有人的可执行权限:

[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# chmod a-x a.c
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# ll
total 0
-rw-r--r-- 1 root root 0 Nov  4 08:02 a.c

+、-、= 的不同点:+ 与 - 的状态下,只要是没有指定到的项目,该权限就不会被变动,例如上面的例子,由于仅以-拿掉x则其他两个保持当时的值不变。

<2> 数字类型修改文件权限

八进制数字代替各个权限:r:4,w:2,x:1,每种身份各自的权限是需要累加的。 

[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ chmod 770 test.c
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 40
-r--rw-rw- 1 root root    13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root     0 Nov  4 08:02 b.c
-rwxrw-rw- 1 zyt  zyt     48 Nov  5 10:52 file.txt
-rwxrwxr-x 1 zyt  zyt  25184 Nov  5 11:09 mytest
-rwxrwx--- 1 zyt  zyt     81 Nov  5 11:09 test.c
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ chmod 666 test.c
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 40
-r--rw-rw- 1 root root    13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root     0 Nov  4 08:02 b.c
-rwxrw-rw- 1 zyt  zyt     48 Nov  5 10:52 file.txt
-rwxrwxr-x 1 zyt  zyt  25184 Nov  5 11:09 mytest
-rw-rw-rw- 1 zyt  zyt     81 Nov  5 11:09 test.c

       在实际的系统运行中最常发生的一个问题就是,尝尝我们用vim编译一个shell的脚本文件后,他的权限通常是【-rw-rw-r--】,也就是664,如果,要将该文件变成可执行文件,并且步要让其他人修改此文件的话,就需要【-rwxr-xr-x】这一权限,此时,执行【chmod 755 test.sh】命令。

        另外,如果有些文件你不希望被其他人看到,那么将文件权限设置为:【-rwx------】,那就执行【chmod 740 filename】.

<3>重点部分

A、 能修改任何人文件权限吗?

-> 用户只能修改自己的文件权限,除非指令提权成root

B、没有权限怎么办?

-> 系统会拒绝让我们访问

# 创建普通用户的文件,拥有者/所属组都是zyt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ touch file.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 4
-r--rw-rw- 1 root root 13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root  0 Nov  4 08:02 b.c
-rw-rw-r-- 1 zyt  zyt   0 Nov  5 09:59 file.txt

# 将“”内容重定向到file.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ echo "hello Linux!" > file.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ cat file.txt
hello Linux!

# 去掉文件所有身份的写(w)权限
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ chmod u-w file.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 8
-r--rw-rw- 1 root root 13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root  0 Nov  4 08:02 b.c
-r--rw-r-- 1 zyt  zyt  13 Nov  5 10:00 file.txt

# 追加重定向时,无法写入
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ echo "hello" >> file.txt 
bash: file.txt: Permission denied

# 去掉文件拥有者的读(r)权限,也就没法打印了
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ chmod u-r file.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ cat file.txt
cat: file.txt: Permission denied

C、 在确定权限信息的时候,系统会先确定用户是谁?拥有者/所属组、/others?

-> 在Centos下,如果用户角色确定,只匹配一次,顺序是:拥有者/所属组/others(三个角色与当前用户相匹配)成功后就只看匹配成功的角色的权限。

● 当前用户与拥有者·匹配

# 这里在root用户权限下将file.txt的拥有者改为root(稍后会细讲,现在认识就行)
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# chown root file.txt
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# ll
total 8
-r--rw-rw- 1 root root 13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root  0 Nov  4 08:02 b.c
----rw-rw- 1 root zyt  13 Nov  5 10:00 file.txt

# 将用户切换回zyt普通用户
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# su zyt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ whoami
zyt

# 我们发现此时文件file.txt依旧能读能写,因为系统按顺序进行角色确定时
# 当前用户zyt和文件的拥有者root不匹配,会继续向后匹配,拥有者的权限就跳过不看了
# 这里文件所属组zyt与当前用户相匹配,所以是所属组位置的权限决定整个文件的权限
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ echo "hello world!" >> file.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ cat file.txt
hello Linux!
hello world!

● 当前用户与所属组匹配 

# 再次在root权限下,将所属组权限的读写去掉
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# chmod g-rw file.txt
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# ll
total 8
-r--rw-rw- 1 root root 13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root  0 Nov  4 08:02 b.c
-------rw- 1 root zyt  26 Nov  5 10:22 file.txt

# 退回普通用户zyt后,文件就无法读和写了
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# su zyt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ cat file.txt
cat: file.txt: Permission denied
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ echo "hello zyt!" >> file.txt
bash: file.txt: Permission denied

● 当前用户与others匹配 

# 在root权限下,将file.txt文件的所属组也改成root
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# chgrp root file.txt
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# su zyt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 8
-r--rw-rw- 1 root root 13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root  0 Nov  4 08:02 b.c
-------rw- 1 root root 26 Nov  5 10:22 file.txt

# 此时我们当前用户仍然是zyt,系统匹配时会匹配到others
# 所以当前用户对文件的权限是others位置对应的权限,可读可写
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ echo "hello zyt!" >> file.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ cat file.txt
hello Linux!
hello world!
hello zyt!

<4> root用户的权限?

-> 不受权限约束!!

# 先把拥有者所属组都改成zyt(后面会细讲的)
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# chown zyt:zyt file.txt

# 将当前用户切换成另一个普通用户dbg
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# ls /home
admin  dbg  zyt
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# su dbg
[dbg@iZ2vcf9wvlgcetfeub9f11Z mydir]$ whoami
dbg

# 此时匹配的角色是others,file.txtx文件的others角色没有任何权限
[dbg@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 8
-r--rw-rw- 1 root root 13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root  0 Nov  4 08:02 b.c
-rw-rw---- 1 zyt  zyt  37 Nov  5 10:38 file.txt

# 不能读不能写
[dbg@iZ2vcf9wvlgcetfeub9f11Z mydir]$ cat file.txt
cat: file.txt: Permission denied
[dbg@iZ2vcf9wvlgcetfeub9f11Z mydir]$ echo "dbg" >> file.txt
bash: file.txt: Permission denied

# 当前用户身份切换到root -> Ctrl+d
[dbg@iZ2vcf9wvlgcetfeub9f11Z mydir]$ exit 
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# whoami
root

# 仍然可以读
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# cat file.txt
hello Linux!
hello world!
hello zyt!

# 甚至去掉所有角色的权限后照样能读能写
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# chmod a-rwx file.txt
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# ll
total 8
-r--rw-rw- 1 root root 13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root  0 Nov  4 08:02 b.c
---------- 1 zyt  zyt  37 Nov  5 10:38 file.txt
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# echo "hello dbg!" >> file.txt
[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# cat file.txt
hello Linux!
hello world!
hello zyt!
hello dbg!

<5> 如何理解可执行?

可执行权限 != 文件可执行(具体能不能执行还要看文件是不是二进制的可执行文件)

# 此时的file.txt就是个空文件,就算有执行的权限也无法执行
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ chmod u+x file.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 8
-r--rw-rw- 1 root root 13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root  0 Nov  4 08:02 b.c
-rwxrw-rw- 1 zyt  zyt  48 Nov  5 10:52 file.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ./file.txt
./file.txt: line 1: hello: command not found
./file.txt: line 2: hello: command not found
./file.txt: line 3: hello: command not found
./file.txt: line 4: hello: command not found
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ touch test.c
# 此时test.c是我们写的C语言程序,文件有x权限,gcc编译后就可执行
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ nano test.c
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ gcc test.c -o mytest
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 40
-r--rw-rw- 1 root root    13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root     0 Nov  4 08:02 b.c
-rwxrw-rw- 1 zyt  zyt     48 Nov  5 10:52 file.txt
-rwxrwxr-x 1 zyt  zyt  25184 Nov  5 11:09 mytest
-rw-rw-r-- 1 zyt  zyt     81 Nov  5 11:09 test.c
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ./mytest
hello test!
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ chmod u-x mytest
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 40
-r--rw-rw- 1 root root    13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root     0 Nov  4 08:02 b.c
-rwxrw-rw- 1 zyt  zyt     48 Nov  5 10:52 file.txt
-rw-rwxr-x 1 zyt  zyt  25184 Nov  5 11:09 mytest
-rw-rw-r-- 1 zyt  zyt     81 Nov  5 11:09 test.c
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ./mytest
bash: ./mytest: Permission denied

② chown命令

功能 :修改文件的拥有者
格式 chown [ 参数 ] 用户名 文件名

系统默认普通用户不能把文件给别人,除非指令提权到 root。

[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ chown root test.c
chown: changing ownership of 'test.c': Operation not permitted
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ chown dbg test.c
chown: changing ownership of 'test.c': Operation not permitted

[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ sudo chown root test.c
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 40
-r--rw-rw- 1 root root    13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root     0 Nov  4 08:02 b.c
-rwxrw-rw- 1 zyt  zyt     48 Nov  5 10:52 file.txt
-rwxrwxr-x 1 zyt  zyt  25184 Nov  5 11:09 mytest
-rw-rw-r-- 1 root zyt     81 Nov  5 11:09 test.c
# 拥有者所属组一块修改了
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ sudo chown zyt:zyt test.c
[sudo] password for zyt: 
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 40
-r--rw-rw- 1 root root    13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root     0 Nov  4 08:02 b.c
-rwxrw-rw- 1 zyt  zyt     48 Nov  5 10:52 file.txt
-rwxrwxr-x 1 zyt  zyt  25184 Nov  5 11:09 mytest
-rw-rw-r-- 1 zyt  zyt     81 Nov  5 11:09 test.c

③ chgrp命令

功能 :修改文件或目录的所属组
格式 chgrp [ 参数 ] 用户组名 文件名
常用选项 -R 递归修改文件或目录的所属组
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ sudo chgrp root test.c
[zyt@iZ2vcf9wvlgcetfeub9f11Z mydir]$ ll
total 40
-r--rw-rw- 1 root root    13 Nov  5 09:50 a.c
-rw-rw-rw- 1 root root     0 Nov  4 08:02 b.c
-rwxrw-rw- 1 zyt  zyt     48 Nov  5 10:52 file.txt
-rwxrwxr-x 1 zyt  zyt  25184 Nov  5 11:09 mytest
-rw-rw-r-- 1 zyt  root    81 Nov  5 11:09 test.c

④ umask命令

稍后会细讲,到时返回来看!

功能
查看或修改文件掩码
新建文件夹默认权限=0666
新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到
umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用
户默认为0002。
示例:
# umask 755
# umask // 查看
# umask 044// 设置

(5) 问题一:目录的权限

可执行权限:如果目录没有可执行权限,则无法cd到目录中

可读权限:如果目录没有可读权限,则无法用ls等命令查看目录中的文件内容

可写权限:如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件

默认情况下,新建一个目录,rwx权限都要有!

-》理解Linux下用户之间相互“隔离”?

-》在Linux系统当中,每建立一个新用户,系统都会在 /home目录下创建一个以特定用户名命名的文件夹,之后我们再登录该用户时,所有的操作都是在/home/username目录下实现的,该文件夹的拥有者、所属组都是自己,所以该文件夹的权限只对自己开放,其他用户(非root账号),无法进入该用户的家目录。

[root@iZ2vcf9wvlgcetfeub9f11Z mydir]# ll /home
total 12
drwx------ 3 admin admin 4096 Sep  1 19:29 admin
drwx------ 2 dbg   dbg   4096 Nov  5 10:50 dbg
drwx------ 2 zyt   zyt   4096 Nov  4 16:08 zyt

(6) 问题2:缺省权限

① 为什么默认权限是现在这样?

对于普通文件来讲:起始权限是 666,默认不带可执行(x)。

对于目录文件来讲:起始权限是 777,默认携带可执行(x)。

[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ mkdir dir
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ touch zyt.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ ll
total 4
drwxrwxr-x 2 zyt zyt 4096 Nov  5 18:57 dir
-rw-rw-r-- 1 zyt zyt    0 Nov  5 18:57 zyt.txt

但我们下面演示看到的结果并不像上面所说的一样。其实是因为权限掩码!我们来查看一下当前系统的掩码:第一个0不考虑,也就是说我们得到的系统权限掩码是002。

[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ umask
0002

最终权限 = 起始权限 & (-umask) !!!

eg:777(起始权限) —> 111 111 111 (777的二进制) 

002 (umask) —> 000 000 010 (002二级制) —> 111 111 101 (按位取反) 

(111 111 111) & (111 111 101) —> 111 111 101 —> 775 (八进制)

② 设置umask的目的是什么?

希望凡是在umask中出现的权限,都不应该在最终权限中出现。未来如果不想让建立的默认文件的具有某种权限,可以直接在umask中添加。也就是用umask控制缺省权限!

③ 为什么要有umask?

a、默认权限,由OS自主决定,无法在创建前修改—系统可配置,可以灵活满足需要

b、特殊情况下,配置umask,可以控制文件的默认权限,让我们的代码都是可控的。

④ 修改umask

系统规定的umask (比如刚刚查到的是0002) 是内存级的,重登录之后会变回默认的umask。 

[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ umask 0777
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ umask
0777
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ mkdir newdir
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ touch 1.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ ll
total 8
---------- 1 zyt zyt    0 Nov  5 19:32 1.txt
drwxrwxr-x 2 zyt zyt 4096 Nov  5 18:57 dir
d--------- 2 zyt zyt 4096 Nov  5 19:32 newdir
-rw-rw-r-- 1 zyt zyt    0 Nov  5 18:57 zyt.txt

(7) 问题3:粘滞位

① 非文件拥有者却能删除文件?

 一个文件是否被删除,与文件本身无关!与文件所处目录是否具有w权限有关!也就是说,只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限。

[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ touch 1.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ sudo touch 2.txt
[sudo] password for zyt: 
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ ll
total 0
-rw-rw-r-- 1 zyt  zyt  0 Nov  5 19:49 1.txt
-rw-r--r-- 1 root root 0 Nov  5 19:49 2.txt

# 当前用户在2.txt文件的匹配角色是others,没有写权限的
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ echo "hello" > 2.txt
bash: 2.txt: Permission denied

# 但是能够删除!!
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ rm 2.txt
rm: remove write-protected regular empty file '2.txt'? y
[zyt@iZ2vcf9wvlgcetfeub9f11Z default_pri]$ ll
total 0
-rw-rw-r-- 1 zyt zyt 0 Nov  5 19:49 1.txt

情况1:我张三创建的一个文件, 凭什么被你李四可以删掉?这个问题出现不多,因为用户目录之间对others角色的权限一般是---,但也就是说李四在张三的专属文件夹里创建了李四的文件,张三是有权利对李四文件删除的啊!所以这种情况其实是科学的。

情况2:但如果两个用户要进行文件级别的协作呢?那么这个文件就不能放在任何一个私人账号里了!一般新建的共享文件会放在 /根目录下,或者用系统的 /tmp目录(/tmp目录一般是存放临时文件,临时数据的)。这个新建共享文件在 /home/username 之上,所以多个用户都可以在该共享文件里进行操作。但带来的问题也是任何用户都能删除该文件夹里的文件!这就不科学了!

# 用root权限在/目录创建一个共享文件temp-backup
[zyt@iZ2vcf9wvlgcetfeub9f11Z /]$ sudo mkdir temp-backup
[sudo] password for zyt: 
[zyt@iZ2vcf9wvlgcetfeub9f11Z /]$ ll
total 80
lrwxrwxrwx    1 root root     7 Feb  9  2022 bin -> usr/bin
dr-xr-xr-x.   5 root root  4096 Apr 13  2022 boot
drwxr-xr-x    5 root root  4096 May 29  2022 data
drwxr-xr-x   17 root root  2980 Sep  1 19:42 dev
drwxr-xr-x.  91 root root 12288 Nov  5 15:01 etc
drwxr-xr-x.   5 root root  4096 Nov  5 10:48 home
drwxr-xr-x    3 root root  4096 Nov  4 08:11 lesson
lrwxrwxrwx    1 root root     7 Feb  9  2022 lib -> usr/lib
lrwxrwxrwx    1 root root     9 Feb  9  2022 lib64 -> usr/lib64
drwx------.   2 root root 16384 Apr 13  2022 lost+found
drwxr-xr-x.   2 root root  4096 Feb  9  2022 media
drwxr-xr-x.   2 root root  4096 Feb  9  2022 mnt
drwxr-xr-x.   2 root root  4096 Feb  9  2022 opt
dr-xr-xr-x  209 root root     0 Sep  1 19:39 proc
dr-xr-x---.   9 root root  4096 Nov  3 09:50 root
drwxr-xr-x   29 root root   880 Sep  1 19:40 run
lrwxrwxrwx    1 root root     8 Feb  9  2022 sbin -> usr/sbin
drwxr-xr-x.   2 root root  4096 Feb  9  2022 srv
dr-xr-xr-x   13 root root     0 Sep  1 19:39 sys
drwxr-xr-x    2 root root  4096 Nov  6 09:17 temp-backup
drwxrwxrwt.   4 root root  4096 Nov  6 07:39 tmp
drwxr-xr-x.  12 root root  4096 Apr 13  2022 usr
drwxr-xr-x.  21 root root  4096 Apr 13  2022 var

# 将共享文件所以权限改成可读可写可执行
[zyt@iZ2vcf9wvlgcetfeub9f11Z /]$ sudo chmod a+rwx temp-backup
[zyt@iZ2vcf9wvlgcetfeub9f11Z /]$ cd temp-backup

# 用zyt用户创建一个普通文件
[zyt@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ touch zyt.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ ll
total 0
-rw-rw-r-- 1 zyt zyt 0 Nov  6 09:18 zyt.txt

# 对others角色加上可写权限,这样其他用户也能对该文件写入
[dbg@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ exit
[zyt@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ chmod o+w zyt.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ ll
total 4
-rw-rw-rw- 1 zyt zyt 10 Nov  6 09:19 zyt.txt

# 用户切换成dbg,对zyt.txt也能可读可写
[zyt@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ su dbg
Password: 
[dbg@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ echo "hello dbg" >> zyt.txt
[dbg@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ cat zyt.txt
hello zyt
hello dbg

# 但也能对文件删除,甚至没有提示语句,有一定风险!
[dbg@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ rm zyt.txt
[dbg@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ ll
total 0

-》为了解决这个不科学的问题, 解决需求:我们不想让非文件拥有者删除共享类文件内的对应文件,但还想让任何用户都可以新建、读取和写入文件,也就是共享。可是删除和写入操作对应的是同一个权限w,所以Linux引入了粘滞位的概念。

② 粘滞位 +t(权限标志位)

[root@iZ2vcf9wvlgcetfeub9f11Z /]# chmod +t temp-backup/

1、介绍:直接写 +t(一般会加给others),也就是权限位约束。others角色(非文件拥有者)不能删除该文件了,即使上级的共享文件夹有w权限!但root用户不会被限制的。

2、粘滞位特征: 只能给需要共享的目录添加粘滞位。

那么当一个目录被设置为“粘滞位”(用chmod +t),则该目下的文件只能由:

 超级管理员删除、该目录的所有者删除、该文件的所有者删除。

3、示例: 

# 在共享文件夹里用dbg用户创建一个普通文件,并对其others角色添加权限
[dbg@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ touch dbg.txt
[dbg@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ chmod o+w dbg.txt
[dbg@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ ll
total 0
-rw-rw-rw- 1 dbg dbg 0 Nov  6 09:45 dbg.txt

# zyt用户对dbg.txt文件能读能写但无法删除了
[dbg@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ su zyt
Password: 
[zyt@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ echo "hello zyt" > dbg.txt
[zyt@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ cat dbg.txt
hello zyt
[zyt@iZ2vcf9wvlgcetfeub9f11Z temp-backup]$ rm dbg.txt
rm: cannot remove 'dbg.txt': Operation not permitted

4.总结

● 目录的可执行权限是表示你可否在目录下执行文件

● 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入;即使目录有-r权限(这里很容易错误认为:有读权限就可以进入目录读取目录下的文件)

● 而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,cd进入目录。但是由于没有读权限,所以在目录下,即使可以执行ls命令,但扔饭没哟权限读文档。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐