在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命令,但扔饭没哟权限读文档。