👻内容专栏: Linux操作系统基础
🐨本文概括: 用户之间的切换、sudo提权、Linux权限管理、文件访问权限的相关方法、目录权限、粘滞位等
🐼本文作者: 阿四啊
🐸发布时间:2023.9.11
Linux权限
概念
Linux权限是一种关键的安全概念,用于控制用户对文件和目录的访问和操作。理解和管理权限对于确保系统的安全性和数据的保护至关重要。
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以再linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
用户切换命令
普通用户切换到root用户
su root
:切换到root用户,但不改变环境。
使用 su root
命令,将切换到root用户的身份,但不会改变当前环境设置。这意味着将继续使用原始用户的环境变量、路径设置等。
例如,如果使用 su root
切换到root用户,将继续使用原始用户的工作目录和shell配置。
[Asi@localhost ~]$ su root
Password:
[root@localhost Asi]# exit
[Asi@localhost ~]$
su - root
:切换到root用户,同时改变环境。
使用 su - root
命令,将切换到root用户的身份,并且会改变当前环境设置,包括工作目录、环境变量和shell配置。这样子会话更像是以root用户的身份登录系统一样。
例如,如果使用 su - root
切换到root用户,将获得root用户的工作目录和与root用户相关的环境设置。
[Asi@localhost ~]$ su - root
Password:
Last login: Sun Sep 10 19:00:11 CST 2023 on pts/0
[root@localhost ~]# logout
[Asi@localhost ~]$
说明:普通账号更为root账号,
su
:单纯的账号切换。su -
:让root账号重新登录。- 需要输入root用户的密码。
普通用户之间的切换
su
和su -
命令切换到普通用户和root是一样的,所以你需要切换到另一个用户,前提还是需要知道Ta的密码啦~
[Asi@localhost ~]$ whoami
Asi
[Asi@localhost ~]$ su cyn
Password:
[Asi@localhost ~]$ su - cyn
Password:
[Asi@localhost ~]$
sudo提权
普通用户可以使用 sudo
执行需要root用户权限的命令,例如安装软件、修改系统配置文件或执行系统维护任务。
[Asi@localhost ~]$ sudo ls
[sudo] password for Asi:
Asi is not in the sudoers file. This incident will be reported.
若显示"xx is not in the sudoers file. This incident will be reported."
说明该普通用户没有sudo
权限,因为新建的普通用户默认不支持sudo
权限。
需要编辑"sudoers"文件。步骤如下:
- 首先切换到root用户,输入以下命令(或使用 vim /etc/sudoers)
[root@localhost ~]# sudo visudo
- 在文件中查找下面的行(可以在底行模式输入
/Allow
搜索即可)
## Allow root to run ang commands anywhere
- 在上述行的下面,添加一行以允许普通用户使用sudo。例如,如果要允许用户"Asi"使用sudo,可以添加以下行:
然后我们创建一个test.txt
文件,是以普通用户Asi创建的,然后我们再用sudo
命令创建一个test2.txt
的文件,并没有要求我输入密码,是因为以方便普通用户在几分钟或者十几分钟之内可能仍需要强权执行任务。
[Asi@localhost ~]$ sudo ls
[sudo] password for Asi:
[Asi@localhost ~]$ touch test.txt
[Asi@localhost ~]$ ll
total 0
-rw-rw-r-- 1 Asi Asi 0 Sep 10 19:52 test.txt
[Asi@localhost ~]$ sudo touch test2.txt
[Asi@localhost ~]$ ll
total 0
-rw-r--r-- 1 root root 0 Sep 10 19:53 test2.txt
-rw-rw-r-- 1 Asi Asi 0 Sep 10 19:52 test.txt
Linux权限管理
在linux操作系统当中,大多数的操作都涉及对于文件的操作。所以说,权限通常与文件、目录关联在一起。
文件访问者的分类(人)
- 拥有者:文件和文件目录的所有者:u—User(中国平民 法律问题)
- 所属组:文件和文件目录的所有者所在的组的用户:g—Group
- other:其它用户:o—Others (外国人)
📌说明:那么上面的root用户和普通用户,与这里的用户有冲突吗?并不是,超级用户与普通用户是指具体的人,而这里的文件访问者可以看作一种角色,而具体的人,可以承担各种各样的角色。
文件类型和访问权限(事物属性)
[Asi@localhost ~]$ ll
total 4
-rw-rw-r-- 1 Asi Asi 103 Sep 11 10:31 test.txt
文件类型
⚠️注意:在Linux当中,Linux系统本身区分文件类型与后缀无关,是与该文件是否具有可执行权限有关,后缀是给人看的!
那么Linux文件类型如何分类呢?用第一列的第一个字符来区分文件类型。
d
[directory]:文件夹-
:普通文件l
[link]:软链接(类似Windows的快捷方式)b
[block]:块设备文件(例如硬盘、光驱等)p
[pipe]:管道文件c
[char]:字符设备文件(例如屏幕等串口设备)s
[socket]:套接口文件
基本权限
- 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限。
- 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限。
- 执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限。
- “-” :表示不具有该项权限。
文件权限值的表示方法
- 字符表示方法
Linux表示 | 说明 | Linux表示 | 说明 |
---|---|---|---|
r - - | 只读 | - w - | 仅可写 |
- - x | 仅可执行 | r w - | 可读可写 |
- w x | 可写可执行 | r - x | 可读可执行 |
r w x | 可读可写可执行 | - - - | 无权限 |
- 八进制数值表示方法
权限符号 | 八进制 | 二进制 |
---|---|---|
r | 4 | 100 |
w | 2 | 010 |
x | 1 | 001 |
r w | 6 | 110 |
r x | 5 | 101 |
w x | 3 | 011 |
r w x | 7 | 111 |
- - - | 0 | 000 |
文件访问权限的相关设置方法
1. chmod
命令
-
功能:设置文件的访问权限
-
格式:chmod [参数] 权限 文件名
-
常用选项:
- R->递归修改目录文件的权限
- 说明:只有文件的拥有者和root才可以修改文件的权限
-
chmod命令权限值的格式:
- ①用户标识符+、-、=权限字符
权限符号:
+
:向权限范围增加权限代号所表示的权限
-
:向权限范围取消权限代号所表示的权限
=
:向权限范围赋予权限代号所表示的权限
用户标识符:
u
:拥有者
g
:拥有者同组用
o
:其它用户
a
:所有用户- 示例
[Asi@localhost ~]$ ll total 4 -rw-rw-r-- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rw-rw-r-- 1 Asi Asi 103 Sep 11 10:31 test.txt [Asi@localhost ~]$ chmod u+x abc.txt [Asi@localhost ~]$ ll total 4 -rwxrw-r-- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rw-rw-r-- 1 Asi Asi 103 Sep 11 10:31 test.txt [Asi@localhost ~]$ chmod g+x,o+w abc.txt [Asi@localhost ~]$ ll total 4 -rwxrwxrw- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rw-rw-r-- 1 Asi Asi 103 Sep 11 10:31 test.txt [Asi@localhost ~]$ chmod a+x test.txt [Asi@localhost ~]$ ll total 4 -rwxrwxrw- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rwxrwxr-x 1 Asi Asi 103 Sep 11 10:31 test.txt [Asi@localhost ~]$ chmod u=rw test.txt [Asi@localhost ~]$ ll total 4 -rwxrwxrw- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rw-rwxr-x 1 Asi Asi 103 Sep 11 10:31 test.txt
- ②三位八进制数字
示例:
[Asi@localhost ~]$ ll total 4 -rwxrwxrw- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rw-rwxr-x 1 Asi Asi 103 Sep 11 10:31 test.txt [Asi@localhost ~]$ chmod 664 abc.txt [Asi@localhost ~]$ ll total 4 -rw-rw-r-- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rw-rwxr-x 1 Asi Asi 103 Sep 11 10:31 test.txt [Asi@localhost ~]$ chmod 640 test.txt [Asi@localhost ~]$ ll total 4 -rw-rw-r-- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rw-r----- 1 Asi Asi 103 Sep 11 10:31 test.txt
2. chown
命令
- 功能:修改文件的拥有者
- 格式:chown [参数] 用户名 文件名
- 示例:
[Asi@localhost ~]$ chown user1 test.txt chown: changing ownership of ‘test.txt’: Operation not permitted [Asi@localhost ~]$ sudo chown user1 test.txt [Asi@localhost ~]$ ll total 4 -rw-rw-r-- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rw-r----- 1 user1 Asi 103 Sep 11 10:31 test.txt
3. chgrp
命令
-
功能:修改文件或目录的所属组
-
格式:chgrp [参数] 用户组名 文件名
-
常用选项:-R 递归修改文件或目录的所属组
-
示例:
[Asi@localhost ~]$ sudo chgrp user1 test.txt [sudo] password for Asi: [Asi@localhost ~]$ ll total 4 -rw-rw-r-- 1 Asi Asi 0 Sep 11 11:35 abc.txt -rw-r----- 1 user1 user1 103 Sep 11 10:31 test.txt
4. umask
命令
-
前提:我们先研究一下默认权限
通过观察,我们可以看到创建普通文件的默认权限用八进制数字表示是664
创建目录文件的默认权限用八进制数字表示是775
[Asi@localhost ~]$ touch test1.txt [Asi@localhost ~]$ mkdir dir1 [Asi@localhost ~]$ ll total 8 drwxrwxr-x 2 Asi Asi 4096 Sep 11 13:16 dir1 -rw-rw-r-- 1 Asi Asi 0 Sep 11 13:16 test1.txt
-
功能:查看或修改文件权限掩码
- 新建文件起始权限为
666
,新建目录起始权限为777
- 所以实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到权限掩码
umask
的影响。
- 新建文件起始权限为
-
格式:umask [权限值]
我们可以输入umask查看Linux的默认权限掩码为0002
,是需要看后三位,第一位告诉我们为八进制数字,不需要管第一位。那么我们使用umask 0004
修改权限掩码之后,再次创建test2.txt
文件,发现这个文件的权限变为了662
,咦,那么最终的权限是怎么推算的呢?[Asi@localhost ~]$ umask 0002 [Asi@localhost ~]$ umask 0004 [Asi@localhost ~]$ touch test2.txt [Asi@localhost ~]$ ll total 8 drwxrwxr-x 2 Asi Asi 4096 Sep 11 13:16 dir1 -rw-rw-r-- 1 Asi Asi 0 Sep 11 13:16 test1.txt -rw-rw--w- 1 Asi Asi 0 Sep 11 13:27 test2.txt
-
规则:
最终权限 = 起始权限 & (~umask)
.凡是在权限掩码中出现的权限,最终都要在起始权限中去掉。
那么,最终的权限就是单纯的起始权限减去umask
所得到的结果吗?- 验证:
如果对于一个普通文件起始权限为666
,将权限掩码设为003
,那么最终普通文件权限会是我们计算的rw-rw--wx
权限吗?
我们执行umask 0003
,创建一个test3.txt
文件,然后执行ll
命令,发现此普通文件的权限为rw-rw-r--
.结果是怎么回事呢?
[Asi@localhost ~]$ umask 0003 [Asi@localhost ~]$ touch test3.txt [Asi@localhost ~]$ ll total 8 -rw-rw-r-- 1 Asi Asi 0 Sep 11 14:03 test3.txt
👇🤔让我们具体分析一下:
所以我们的计算并不是相减那么简单,当然也并不复杂,这里就需要用到按位与运算符
&
来计算。我们知道,1 & 1 = 1, 1 & 0 = 0 ,0 & 1 = 0, 0 & 0 = 0
,所以我们可以先对umask
按位取反再按位与上起始权限,所得到的就是最终权限了。 - 验证:
5. file
命令
- 功能说明:辨识文件类型
- 语法: file [选项] 文件或目录
- 常用选项:
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
- -z 尝试去解读压缩文件的内容
目录的权限
可执行权限: 如果目录没有可执行权限, 则无法cd到目录中。
可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容。
可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件。
-
进入一个目录,需要什么权限呢?
我们对拥有者的r
、w
、x
权限进行了验证,最后没有x
权限的情况下,系统提示:-bash: cd: dir: Permission denied
,所以,进入一个目录,需要执行权限。[Asi@localhost study]$ mkdir dir [Asi@localhost study]$ ll dir total 0 [Asi@localhost study]$ ll total 4 drwxrwxr-x 2 Asi Asi 4096 Sep 11 14:53 dir [Asi@localhost study]$ chmod u-r dir [Asi@localhost study]$ cd dir [Asi@localhost dir]$ cd .. [Asi@localhost study]$ chmod u+r,u-w dir [Asi@localhost study]$ cd dir [Asi@localhost dir]$ cd .. [Asi@localhost study]$ chmod u+w,u-x dir [Asi@localhost study]$ ll total 4 drw-rwxr-x 2 Asi Asi 4096 Sep 11 14:53 dir [Asi@localhost study]$ cd dir -bash: cd: dir: Permission denied
-
那么对于一个目录的
r
权限,将有什么限制呢?
通过下面验证,我们可以知道,是否允许一个指定用户查看目录的文件列表,需要r
权限。[Asi@localhost study]$ ll total 4 d-wxrwxr-x 2 Asi Asi 4096 Sep 11 14:53 dir [Asi@localhost study]$ cd dir [Asi@localhost dir]$ ls ls: cannot open directory .: Permission denied [Asi@localhost dir]$ touch test.txt [Asi@localhost dir]$ ll ls: cannot open directory .: Permission denied
-
那么对于一个目录的
w
权限,将有什么限制呢?
我们删去了dir目录的w
权限,发现可以进入该目录,可以查看该目录的文件列表,但是不可以在该目录下创建文件。[Asi@localhost study]$ chmod u+r,u-w dir [Asi@localhost study]$ ll total 4 dr-xrwxr-x 2 Asi Asi 4096 Sep 11 15:03 dir [Asi@localhost study]$ cd dir [Asi@localhost dir]$ pwd /home/Asi/study/dir [Asi@localhost dir]$ ll total 0 -rw-rw-r-- 1 Asi Asi 0 Sep 11 15:03 test.txt [Asi@localhost dir]$ touch test1.txt touch: cannot touch ‘test1.txt’: Permission denied
于是, 问题来了~~
换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限.
这好像不太对啊, 我张三创建的一个文件, 凭什么被你李四可以删掉? 我们用下面的过程印证一下。
[root@localhost ~]# chmod 0777 /home/
[root@localhost ~]# ls /home/ -ld
drwxrwxrwx. 3 root root 4096 9月 19 15:58 /home/
[root@localhost ~]# touch /home/root.c
[root@localhost ~]# ls -l /home/
总用量 4
-rw-r--r--. 1 root root 0 9月 19 15:58 abc.c
drwxr-xr-x. 27 lisi lisi 4096 9月 19 15:53 lisi
-rw-r--r--. 1 root root 0 9月 19 15:59 root.c
[root@localhost ~]# su - lisi
[lisi@localhost ~]$ rm /home/root.c #lisi可以删除root创建的文件
rm:是否删除有写保护的普通空文件 "/home/root.c"?y
[lisi@localhost ~]$ exit
logout
一般而言,不同的账号是不会在同一目录下的。
因为默认新建的用户,只有拥有者,也就是`root`才具有权限。
[root@localhost home]# ll
total 24
drwx------ 3 admin admin 4096 Aug 31 11:14 admin
drwx------ 4 Asi Asi 4096 Sep 11 14:52 Asi
drwx------ 2 zhangsan zhangsan 4096 Sep 11 12:56 user1
drwx------ 2 zhangsan zhangsan 4096 Sep 11 15:25 zhangsan
那么假如有特殊情况,应任务需要,在一个团队中多个账号协同共享一些数据呢?这样就不会在某一个人的主工作目录之下,而是在root用户的根目录下创建一个名为shared
的目录,要求团队用户都在这个share
路径下工作,那么此时对于root的角度来说,other的rwx
权限也需要同时放开,那么为了避免他人删除该目录下的一些共享数据(假如两人闹掰了,张三想要删除李四在shared
目录里写的文件),此时w
权限是不是应该取消呢? 如果取消,那么团队里的成员该如何往shared
里面写数据呢?
这样的问题是不是很棘手,下面针对这个问题,我们引入粘滞位的概念。
粘滞位
[root@localhost ~]# chmod +t /home/ # 加上粘滞位
[root@localhost ~]# ls -ld /home/
drwxrwxrwt. 3 root root 4096 9月 19 16:00 /home/
[root@localhost ~]# su - litao
[litao@localhost ~]$ rm /home/abc.c #litao不能删除别人的文件
rm:是否删除有写保护的普通空文件 "/home/abc.c"?y
rm: 无法删除"/home/abc.c": 不允许的操作
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除