Linux权限解析:用户、组和权限的协同

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/4441.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Centos Linux 7 搭建邮件服务器(postfix + dovecot)

准备工作 1. 一台公网服务器&#xff08;需要不被服务商限制发件收件的&#xff0c;也就是端口25、110、143、465、587、993、995不被限制&#xff09;&#xff0c;如有防火墙或安全组需要把这些端口开放 2. 一个域名&#xff0c;最好是com cn org的一级域名 3. 域名备案&am…

Python绘制完整正弦余弦函数曲线

1&#xff0c;将正弦函数&#xff0c;余弦函数及坐标轴绘制在同一个界面方便对比观察&#xff0c;不同函数的曲线变化 import turtle # 导入turtle图形库&#xff0c;用于绘图 import math # 导入math库&#xff0c;用于数学计算&#xff0c;如三角函数# 设置绘图窗口 scre…

TON链上的代币开发与小程序开发:模式与要求

TON&#xff08;The Open Network&#xff09;链是由Telegram团队开发的区块链网络&#xff0c;旨在提供更快、更高效、更去中心化的基础设施&#xff0c;支持智能合约、去中心化应用&#xff08;DApp&#xff09;以及多种数字资产和代币的创建。随着TON链生态的不断成熟&#…

CTF中的phar反序列化 [SWPU 2018]SimplePHP

以[SWPU 2018]SimplePHP 这道题为例 页面可以查看文件和上传文件 点击查看文件,发现url变成/file.php?file 猜测可能存在文件包含,可以读取文件 尝试读取index.php文件 回显了源码 再读取base.php 只看最后有信息的代码: <!--flag is in f1ag.php--> 提示flag在f1…

图文并茂java源码解析-HashMap

文章目录 HashMap结构HashMap的Entry了解的哈希冲突解决方法有哪些?HashMap是线程安全的吗?hashmap的put过程介绍一下jdk8的获取hash的方法jdk8的获取索引的方法 hashmap的put过程介绍一下hashmap 调用get方法一定安全吗?HashMap一般用什么做Key?为啥String适合做Key呢?为…

【JavaEE】认识进程

一、操作系统&#xff08;operating system&#xff09; 操作系统是一组做计算机资源管理的软件的统称&#xff0c;它能够把一个计算机上的所有硬件资源和软件资源都管理好&#xff1a;能够管理好各种硬件资源&#xff0c;让他们很好的相互配合&#xff0c;能够管理好各种软件…

Android——横屏竖屏

系统配置变更的处理机制 为了避免横竖屏切换时重新加载界面的情况&#xff0c;Android设计了一中配置变更机制&#xff0c;在指定的环境配置发生变更之时&#xff0c;无需重启活动页面&#xff0c;只需执行特定的变更行为。该机制的视线过程分为两步&#xff1a; 修改 Androi…

基于卷积神经网络(CNN)的时间序列预测,15个输入1个输出,可以更改数据集,MATLAB代码

1. 数据收集与预处理 数据清洗&#xff1a;处理缺失值、异常值等。特征工程&#xff1a;提取有助于预测的特征。数据标准化&#xff1a;将时间序列数据标准化&#xff0c;使其具有零均值和单位方差&#xff0c;有助于模型训练。滑动窗口划分&#xff1a;将时间序列数据划分为多…

css 文字一行没有放满不进行换行

在开发过程中&#xff0c;经常会出现一行的文字没有放满 就出现了换行的情况 word-break: break-all;

社区团购 2.0 版本发展与创新模式研究:融合新元素的机遇与挑战

摘要&#xff1a;本文深入探讨了社区团购 2.0 版本的发展模式&#xff0c;以便利连锁店为核心的新形态对传统社区团购的冲击和革新。同时&#xff0c;分析了山东小爱联盟推动的爱客优选模式特点&#xff0c;包括佣金体系、运营模式等。在此基础上&#xff0c;研究如何将开源 AI…

isaac sim 14 物理学习(车辆动力学)

文章内容均来自博客文章、官方文档手册等 参考内容 Nvidia Isaac Sim代码编程 入门教程 2024&#xff08;7&#xff09;_isaac sim franka-CSDN博客 Python Bindings API — omni_physics 106.1 documentation Physics — Omniverse IsaacSim latest documentation Vehicle…

理解Laravel中的pipeline

pipeline在laravel的启动过程中出现次数很多&#xff0c;要了解laravel的启动过程和生命周期&#xff0c;理解pipeline就是其中的一个关键点。网上对pipeline的讲解很少&#xff0c;所以我自己写一写吧。 首先还是来看看调用栈&#xff0c;也就是从一个请求开始到返回响应&…

基于uniapp和java的电动车智能充电系统软件平台的设计

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 对电动车智能充电系统进行设计和开发。通过使用本系统可有效地减少运营成本&#xff0c;提高管理效率。 根据近年来社会…

使用css和html制作导航栏

代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}#m{background-color: antiquewhite;width: 100%;height: 50px;}#i{float: left;width: 100px;height: 50px;li…

怎样使用pycharm的服务?

‌在PyCharm中使用服务器的步骤如下‌&#xff1a; ‌打开PyCharm&#xff0c;选择“File”->“Settings”‌。‌选择左侧工具栏中的“Project:…”‌&#xff0c;然后选择“Python Interpreter”。‌点击右上角的“Add Interpreter”‌&#xff0c;选择“On SSH”。‌如果…

CI_CD

什么是CI/CD 在前端开发中&#xff0c;CI/CD 是 Continuous Integration&#xff08;持续集成&#xff09;和 Continuous Deployment/Continuous Delivery&#xff08;持续部署/持续交付&#xff09;的简称。它是一种软件开发实践&#xff0c;自动化了应用的构建、测试和发布过…

设置JAVA以适配华为2288HV2服务器的KVM控制台

华为2288HV2服务器比较老旧了&#xff0c;其管理控制台登录java配置比较麻烦&#xff0c;华为的ibmc_kvm_client_windows客户端测试了几个版本&#xff0c;连接控制台也有问题&#xff0c;最终安装JDK解决。 一、测试环境 主机为WindowsServer2012R2,64位系统 二、Java软件包…

机器学习—构建一个神经网络

如何在Tensorflow中构建神经网络&#xff1f; 回到之前的例子&#xff0c;如果你想做钱进支柱&#xff0c;初始化数据x创建第一层&#xff0c;如下图所示计算一个1&#xff0c;然后创建第二层并计算一个2&#xff0c;所以这是一种明确的向前推进的方式。 事实证明&#xff0c;…

基于51单片机的步进电机定时控制proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1_F5bfyS_e_eKSblnja7RqA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

【云原生开发】如何通过client-go来操作K8S集群

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…