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

news2024/11/25 14:52:50

​​​​​​​在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.coloradmin.cn/o/2234276.html

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

相关文章

java、excel表格合并、指定单元格查找、合并文件夹

#创作灵感# 公司需求 记录工作内容 后端&#xff1a;JAVA、Solon、easyExcel、FastJson2 前端&#xff1a;vue2.js、js、HTML 模式1&#xff1a;合并文件夹 * 现有很多文件夹 想合并全部全部的文件夹的文件到一个文件夹内 * 每个部门发布的表格 合并全部的表格为方便操作 模…

koa项目实战 == 实现注册登录鉴权

一. 项目的初始化 1 npm 初始化 npm init -y生成package.json文件: 记录项目的依赖 2 git 初始化 git init生成’.git’隐藏文件夹, git 的本地仓库 3 创建 ReadMe 文件 二. 搭建项目 1 安装 Koa 框架 npm install koa2 编写最基本的 app 创建src/main.js const Koa…

JAVA基础:单元测试;注解;枚举;网络编程 (学习笔记)

单元测试 操作步骤&#xff1a; a.导包import org.junit; b.三个注解 Test Before After c.点击Test 运行就可以了 用在不需要控制台输入的情境下&#xff1a;javaweb&#xff0c;框架项目&#xff0c;微服务项目 供开发人员自己做测试。 package com.page…

四个TikTok万能爆单选品法,第1个超过75%卖家会用!

做TK想爆单至关键的一步就是选品&#xff01;7分靠选品、3分靠运营&#xff0c;一开始你要把品选错了&#xff0c;再怎么运营都是在浪费时间。接下来分享一些万能选品思路&#xff0c;不管做什么类目的商家都可以参考&#xff01; 一、热卖品榜单选品 这是一种很常见&#xf…

Linux开发工具——make/Makefile

目录 一、什么是makefile&#xff1f; 二、为什么要有makefile&#xff1f; 三、makefile的使用 1.依赖关系与依赖方法 2.伪目标 3.定义变量 4.特殊符号 四、makefile的执行逻辑 一、什么是makefile&#xff1f; Makefile是一种自动化构建工具&#xff0c;make是一条指…

开发中使用UML的流程_01概述

目录 CIM-1:定义业务流程 CIM-2:分析业务流程 ​CIM-3:定义系统范围 ​PIM-1:分析系统流程 PIM-2:分析业务规则 PIM-3:定义静态结构 PIM-4:定义操作和方法 开发中使用UML的流程,主要分为7部分,具体如下: CIM-1:定义业务流程 定义及分析业务流程是为了尽快理…

前端开发模板Pear Admin Layui

目录 基本资料学习笔记04-Pear-Admin-Layui模板运行05-Pear-Admin-Layui-GIT方式代...06-Pear-Admin与Vue对比 & 07-Pear-Admin与Vue对比补充09-Pear-Admin-CRUD练习-数据库表创建12-Pear-Admin-CRUD练习-引入其它依赖 & 13-Pear-Admin-CRUD练习-三层架构以及常见配置 …

[MySQL#10] 索引底层(1) | Page | 页目录

目录 1. 初识索引 2. 认识磁盘 3. MySQL与磁盘交互基本单位 4. 索引的理解 1. 重谈Page 2. 为什么IO交互要用Page 3. 有主键的表插入数据时的排序 4. 单个Page与多个Page 4.1 单个Page 4.2 多个Page 目录 单Page目录 多Page目录 在看本文之前&#xff0c;可以回顾…

.net c# 使用 MailKit库接收139邮箱邮件

开发工具 vs2022&#xff0c;新建-控制台应用。项目完整代码下载&#xff1a; 要安装MailKit库 using MailKit; using MailKit.Net.Imap; using MimeKit; using System.Text; namespace MailKit_mail {internal class Program{static void Main(string[] args){//需要使用 Ma…

Centos开机自启动脚本示例

本文建议创建一个sh文件管理自启动的各项内容&#xff0c;再将sh文件设置开机启动 在/root/autoshell下创建一个autostart.sh&#xff0c;内容如下 #!/bin/bash # description:开机自启脚本# 启动mongodb sh /root/software/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod --c…

虚拟现实和增强现实技术,如何打造沉浸式体验?

内容概要 在这个科技飞速发展的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;与增强现实&#xff08;AR&#xff09;技术的结合就像调皮的小精灵&#xff0c;一下子把我们的生活变得神奇又有趣。想象一下&#xff0c;你正在游戏中与精灵搏斗&#xff0c;突然间身边的客…

计算机网络 TCP/IP体系 数据链路层

一. 数据链路层的基本概念 数据链路层主要负责节点之间的通信&#xff0c;确保从物理层接收到的数据能够准确无误地传输到网络层。 数据链路层使用的信道主要有以下两种类型: 点对点信道: 这种信道使用一对一的点对点通信方式。广播信道: 这种信道使用一对多的广播通信方式,…

数据结构————链表

一、引言 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长&#xff0c;势必会有一定的空间浪费。例如当前容量为100&#xff0c;满了以后增容到200&#x…

【网络原理】深入理解关于HTTP协议和报文的格式以及重要的属性

前言 &#x1f31f;&#x1f31f;本期讲解关于HTTP协议的重要的机制~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

【MyBatis源码】CacheKey缓存键的原理分析

文章目录 Mybatis缓存设计缓存KEY的设计CacheKey类主体CacheKey组成CacheKey如何保证缓存key的唯一性 Mybatis缓存设计 MyBatis 每秒过滤众多数据库查询操作&#xff0c;这对 MyBatis 缓存键的设计提出了很高的要求。MyBatis缓存键要满足以下几点。 无碰撞&#xff1a;必须保证…

面试题:JVM(二)

1. 面试题 简述 Java 类加载机制?&#xff08;百度&#xff09; JVM类加载机制 &#xff08;滴滴&#xff09; JVM中类加载机制&#xff0c;类加载过程&#xff0c;什么是双亲委派模型&#xff1f; &#xff08;腾讯&#xff09; JVM的类加载机制是什么&#xff1f; &#x…

数据库的使用02:SQLServer的连接字符串、备份、还原、SQL监视相关设置

目录 一、连接字符串 【本地连接字符串】 【远程连接字符串】 二、备份 三、还原 &#xff08;1&#xff09;还原数据库-bak、btn文件 &#xff08;2&#xff09;附加数据库mdf文件 四、SQL监视器的使用 一、连接字符串 【本地连接字符串】 server DESKTOP-FTH2P3S; Da…

【2024工业图像异常检测文献】UCAD: 使用对比学习提示的无监督连续异常检测方法

Unsupervised Continual Anomaly Detection with Contrastively-learned Prompt 1、Background 无监督异常检测&#xff08;UAD&#xff09;专注于在没有先验知识或标记实例的情况下识别数据中的不寻常模式或异常值&#xff0c;仅依赖于“正常”数据的内在分布&#xff08;Cha…

【算法】Floyd多源最短路径算法

目录 一、概念 二、思路 三、代码 一、概念 在前面的学习中&#xff0c;我们已经接触了Dijkstra、Bellman-Ford等单源最短路径算法。但首先我们要知道何为单源最短路径&#xff0c;何为多源最短路径 单源最短路径&#xff1a;从图中选取一点&#xff0c;求这个点到图中其他…

[C++]——哈希(附源码)

目录 ​编辑 ​编辑 一、前言 二、正文 2.1 unorder系列关联式容器 2.1.1 unordered_map 2.1.1.1 unorderer_map的介绍 ①unordered_map的构造 ②unordered_map的容量 ③unordered_map的迭代器 ④unordered_map的元素访问 ⑤unordered_map的查询 ⑥unordered_map的修改操…