Linux权限详解
引言
权限是什么???,你思考过吗。
一、什么是权限?
通俗来说权限是:访问资源时,你是能还是不能《即你有没有权限》
二、在Linux中为什么要有权限?
因为:Linux是多用户操作系统,Linux同时会有多个人进行登录访问,也有普通用户和root用户之分。
权限本质是为了更好的进行用户管理。
Eg:A用户不能随便修改其他用户的东西,A用户有修改其他用户东西的权限,A用户才能去修改,A用户没有权限,就不能修改。
三、权限 = 人 + 文件属性
权限是针对特定群体的(限定人的权限) --- 与人有关(普通用户 or root)
目标主题,必须天然具备对应的属性,才能访问(比如:你想在XX视频里写代码,你想在蛋糕店里吃臊子面,......等等,XX视频就是让看的,不能在里面写代码,蛋糕店里面没有卖的臊子面,所以刚刚的要求是不合理的,所有说:目标主题,必须天然具备对应的属性,才能访问),你想运行文本文件,显然是不可能的,文本文件是用来写东西用的,本身不具有运行属性。
Linux下一切皆文件,所以文件有三大属性:可读(r),可写(w),可执行(x)。所以可以限定某人对特定文件的rwx属性,来限定某人的权限。
1.Linux用户问题
Linux下有两种用户:超级用户(root)和普通用户
- 超级用户(root):不受权限约束(在Linux下做任何事,百分之99不受限制)(但也不绝对)
- 普通用户:在Linux下做事情有权限限制
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
命令:su [用户名]
功能:切换用户
su - :以重新登陆的方式切换到root。
例如:要从root用户切换到普通用户user,则使用su user(不需要输入密码)。 要从普通用户user切换到root用户则使用 su root(root可以省略)(需要输入密码),此时系统会提示输入root用户的口令。从普通用户1切换到普通用户2,也需要输入密码,要输入用户2的密码。
# 从root到任意用户,不需要输入密码,直接su 用户名 就行
[root@hcss-ecs-f571 ~]# whoami
root
[root@hcss-ecs-f571 ~]# su zhangsan
[zhangsan@hcss-ecs-f571 root]$ whoami
zhangsan
[zhangsan@hcss-ecs-f571 root]$
# 普通用户到root,需要输入密码
[zhangsan@hcss-ecs-f571 root]$ whoami
zhangsan
[zhangsan@hcss-ecs-f571 root]$ su
Password:
[root@hcss-ecs-f571 ~]# whoami
root# su - 以重新登陆的方式切换成root
[zhangsan@hcss-ecs-f571 ~]$ su -
Password:
Last login: Thu Aug 21 20:45:19 CST 2025 on pts/5
[root@hcss-ecs-f571 ~]# pwd
/root
[root@hcss-ecs-f571 ~]#
# 普通用户之间转换需要输入密码
[zhangsan@hcss-ecs-f571 ~]$ su lisi
Password:
[lisi@hcss-ecs-f571 zhangsan]$ whoami
lisi
2.普通用户如何做一次root权限的事
比如:安装软件(拷贝到系统指定的目录下)---> OS不让普通账号进行拷贝,只能由root来操作,所有普通用户怎么安装软件呢?
普通用户可以短暂提高权限
命令:sudo(需要root在文件中配置一下)
功能:使普通用户短暂拥有root权限
使用:在任何命令前加sudo ,以root的权限来运行(需要输入普通用户的密码)。
配置:
[root@hcss-ecs-f571 ~]# ls /etc/sudoers
/etc/sudoers
在root的权限下在这个文件中改一个地方:
进入该文件
[root@hcss-ecs-f571 ~]# vim /etc/sudoers
给zhangsan增加sudo权限,找到root这一行,然后拷贝一下,名字改成zhangsan即可(建议先学一下vim的基本操作再来改)
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
zhangsan ALL=(ALL) ALL
在zhangsan账号下,以root身份创建test.txt:
[zhangsan@hcss-ecs-f571 ~]$ sudo touch test.txt
[sudo] password for zhangsan:
[zhangsan@hcss-ecs-f571 ~]$ ls
test.txt
[zhangsan@hcss-ecs-f571 ~]$ ll
total 0
-rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt
[zhangsan@hcss-ecs-f571 ~]$
疑问:为什么sudo是输入普通用户的密码,而不是root的密码??
答:1.可以使用sudo命令的用户,都配置在了白名单中(普通账号默认是执行不了sudo的),出了事,直接在白名单中找。
2. 一但要输入root密码,那么sudo命令只能由root来做了,普通用户完全可以登陆root来操作,但是普通用户不应该知道root的密码。
3.Linux角色问题
权限是依附于角色的!!!
Linux下有三个角色
1.拥有者角色(owner)2.所属组角色(group)
3.other角色
当我们创建一个text.txt文件时,有下面信息,对应位置有对应的信息:
那么other角色在哪里呢?
不是文件的拥有者,也不是文件的所属组,就是文件的other角色。
角色是需要有人来扮演的
1.拥有者角色 2.所属组角色 3.other角色,是需要人来扮演的
上面的text.txt的拥有者是root,所属组是root,那么other就是zhangsan或者lisi。
解释一下为什么需要一个所属组
假设有A,B两个小组,在同一台Linux机器上操作,A和B是竞争关系(“赛马”机制),一天A,B的老板C 要分别看A的内容,那么C是什么角色呢?
假如没有所属组,那C只能是other组的,一旦A给other组 r(读)的权限,那B也就可以直接看到A的内容了,非常不好。
所以有了所属组,可以将老板C加入到所属组中来。
4.文件类型:
-:普通文件,源代码,文本,动静态库,可执行
d:目录
I:链接文件(类似于Windows中的快捷方式)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)、
b:块设备文件(例如硬盘,光驱等)
s:套接口文件
5.Linux权限问题
root是不受权限限制的,权限是给普通用户安排的。
Linux中有三个权限:r(只读),w(只写),x(可执行权限)
看下图中,权限与角色的对应关系(三三为一组,一一对应):
以第一组为例(其他类似):
rw- : 对应着是否可读,是否可写,是否可执行。三个位置固定。-表示没有该权限。
root可有读,可以写test.txt文件,不可以执行该文件。
四、权限的指令操作
权限 = 人 + 文件属性
可以改人,也可以改文件属性。
1.chmod
功能:设置文件的访问权限
格式:chmod [参数] 权限文件名
常用选项:
• R -> 递归修改目录文件的权限
• 说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限值的格式:
• 用户表示符 + / - = 权限字符
◦ +: 向权限范围增加权限代号所表示的权限
◦-: 向权限范围取消权限代号所表示的权限
◦ =: 向权限范围赋予权限代号所表示的权限
◦ 用户符号:
◦ u:拥有者
◦ g:拥有者同组用
◦ o:其它用户
◦ a:所有用户
实例:
[zhangsan@hcss-ecs-f571 ~]$ ll total 0 -rw-rw-r-- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt [zhangsan@hcss-ecs-f571 ~]$ chmod u-w test1.txt [zhangsan@hcss-ecs-f571 ~]$ ll total 0 -r--rw-r-- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[zhangsan@hcss-ecs-f571 ~]$ chmod g-rw test1.txt [zhangsan@hcss-ecs-f571 ~]$ ll total 0 -r-----r-- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[zhangsan@hcss-ecs-f571 ~]$ chmod o+w test1.txt [zhangsan@hcss-ecs-f571 ~]$ ll total 0 -r-----rw- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[zhangsan@hcss-ecs-f571 ~]$ chmod a+w test1.txt [zhangsan@hcss-ecs-f571 ~]$ ll total 0 -rw--w-rw- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[zhangsan@hcss-ecs-f571 ~]$ chmod u+rwx,g-rwx test1.txt [zhangsan@hcss-ecs-f571 ~]$ ll total 0 -rwx---rw- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt [zhangsan@hcss-ecs-f571 ~]$ [zhangsan@hcss-ecs-f571 ~]$ chmod a-rwx test1.txt [zhangsan@hcss-ecs-f571 ~]$ ll total 0 ---------- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt [zhangsan@hcss-ecs-f571 ~]$
• 三位8进制数字
用每三位对应的二进制转换成8进制对应的数子来修改(三个bit位对应0-7,所以是8进制数字)
[zhangsan@hcss-ecs-f571 ~]$ ll total 0 -rw-rw-r-- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[zhangsan@hcss-ecs-f571 ~]$ chmod 000 test1.txt [zhangsan@hcss-ecs-f571 ~]$ ll total 0 ---------- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[zhangsan@hcss-ecs-f571 ~]$ chmod 777 test1.txt [zhangsan@hcss-ecs-f571 ~]$ ll total 0 -rwxrwxrwx 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[zhangsan@hcss-ecs-f571 ~]$ chmod 666 test1.txt [zhangsan@hcss-ecs-f571 ~]$ ll total 0 -rw-rw-rw- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[zhangsan@hcss-ecs-f571 ~]$
疑惑解答,看下面代码:
zhangsan是所属组的,且所属组有w权限,为什么zhangsan不能写入内容呢?
[zhangsan@hcss-ecs-f571 ~]$ ll total 0 ----rw---- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt -rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt [zhangsan@hcss-ecs-f571 ~]$ echo "aaa" > test1.txt bash: test1.txt: Permission denied [zhangsan@hcss-ecs-f571 ~]$
因为:用户访问文件的时候,确定自己相对于文件的身份角色,只会验证一次。
权限只会验证一次,从左往右来验证。zhangsan已经被验证为了拥有者,不会再是所属组了。
关于可执行权限
文件要被执行
2个条件:
1.文件本身就是一个可执行的文件
2.文件本身具有可执行权限
有了这两个条件,文件才能被执行,否则文件不能被执行。
一个文件即使有可执行权限,但本身不可以被执行,那该文件还是不能被执行。
(给你机会,你不中用)
2.chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
3.chgrp
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名文件名
常用选项:-R 递归修改文件或目录的所属组
实操:
[root@hcss-ecs-f571 zhangsan]# ll
total 0
-rw-rw-rw- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt
-rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[root@hcss-ecs-f571 zhangsan]# chown root test1.txt
[root@hcss-ecs-f571 zhangsan]# ll
total 0
-rw-rw-rw- 1 root zhangsan 0 Aug 21 23:08 test1.txt
-rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[root@hcss-ecs-f571 zhangsan]# chgrp root test1.txt
[root@hcss-ecs-f571 zhangsan]# ll
total 0
-rw-rw-rw- 1 root root 0 Aug 21 23:08 test1.txt
-rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[root@hcss-ecs-f571 zhangsan]# chown zhangsan:zhangsan test1.txt
[root@hcss-ecs-f571 zhangsan]# ll
total 0
-rw-rw-rw- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt
-rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt
[root@hcss-ecs-f571 zhangsan]#
拥有者 不能 改变拥有者和所属组,为什么???
[zhangsan@hcss-ecs-f571 ~]$ ll
total 0
-rw-rw-rw- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt
-rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt
[zhangsan@hcss-ecs-f571 ~]$ chown lisi test1.txt
chown: changing ownership of ‘test1.txt’: Operation not permitted
[zhangsan@hcss-ecs-f571 ~]$ chgrp lisi test1.txt
chgrp: changing group of ‘test1.txt’: Operation not permitted
[zhangsan@hcss-ecs-f571 ~]$
这是很合理的,在现实生活中,你给别人东西是不是要征得别人的同意,不能直接给别人,万一是一口黑锅呢!!!
在Linux中改变拥有者或者所属组,只能是root,或者通过sudo来修改。
五、关于权限的细节问题
1.目录权限问题:“我”进入一个目录需要什么权限?
r:用户是否有权力查看指定目录下的文件属性
w:决定了特定用户是否有权力在该目录下,能否新增,删除文件和修改文件名
x:有x权限可以进入该目录,没有x权限,就进不去。
[zhangsan@hcss-ecs-f571 ~]$ mkdir dir1
[zhangsan@hcss-ecs-f571 ~]$ ll
total 4
drwxrwxr-x 2 zhangsan zhangsan 4096 Aug 22 11:53 dir1
-rw-rw-rw- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt
-rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt[zhangsan@hcss-ecs-f571 ~]$ chmod u-x dir1
[zhangsan@hcss-ecs-f571 ~]$ ll
total 4
drw-rwxr-x 2 zhangsan zhangsan 4096 Aug 22 11:53 dir1
-rw-rw-rw- 1 zhangsan zhangsan 0 Aug 21 23:08 test1.txt
-rw-r--r-- 1 root root 0 Aug 21 21:13 test.txt
[zhangsan@hcss-ecs-f571 ~]$ cd dir1
-bash: cd: dir1: Permission denied
2.为什么我们新建的目录和普通文件的权限是我们所看到的样子
新建几个文件,会发现为什么权限是这个样子的呢?
[zhangsan@hcss-ecs-f571 dir1]$ touch test.txt
[zhangsan@hcss-ecs-f571 dir1]$ touch hello
[zhangsan@hcss-ecs-f571 dir1]$ mkdir dir01
[zhangsan@hcss-ecs-f571 dir1]$ ll
total 4
drwxrwxr-x 2 zhangsan zhangsan 4096 Aug 22 11:56 dir01
# 7 7 5
-rw-rw-r-- 1 zhangsan zhangsan 0 Aug 22 11:56 hello
-rw-rw-r-- 1 zhangsan zhangsan 0 Aug 22 11:56 test.txt
# 6 6 4
[zhangsan@hcss-ecs-f571 dir1]$
对于普通文件,起始权限是从666开始
对于目录文件,起始权限是从777开始
在Linux中为了对权限进行细粒度控制,Linux中:权限掩码
命令:umask
功能:查看/修改权限掩码
关注后3位即可。
[zhangsan@hcss-ecs-f571 dir1]$ umask
0002
凡是在权限掩码中的权限,最终都应该在起始权限中去掉:
“最终权限” = 起始权限 “去掉” umask
所有实际创建出来的文件权限是 = 起始权限 & ~umask
[zhangsan@hcss-ecs-f571 dir1]$ umask 000
[zhangsan@hcss-ecs-f571 dir1]$ touch test2.txt
[zhangsan@hcss-ecs-f571 dir1]$ ll
total 4
drwxrwxr-x 2 zhangsan zhangsan 4096 Aug 22 11:56 dir01
-rw-rw-r-- 1 zhangsan zhangsan 0 Aug 22 11:56 hello
-rw-rw-rw- 1 zhangsan zhangsan 0 Aug 22 12:11 test2.txt
-rw-rw-r-- 1 zhangsan zhangsan 0 Aug 22 11:56 test.txt
[zhangsan@hcss-ecs-f571 dir1]$
这里将umask改成000,创建一个test2.txt,发现权限是666。
3.文件权限:---,可以被删吗?粘滞位问题
在zhangsan的一个目录下,root创建了一个文件,权限是000,zhangsan可以直接把root的文件给删了,因为是在zhangsan的家里,zhangsan可以管理他的文件。
在Linux中一个普通用户不能进入另一个普通用户的家里面
假如在root里面有个共享目录,zhangsan和lisi都需要管理,一天wangwu来了,把zhangsan和lisi的文件给删了,因为都是other权限,所有可以删除,那怎么解决这个问题呢?
粘滞位
当一个目录被设置为"粘滞位"(用 chmod+t),
则该目录下的文件只能由
1. 超级管理员删除
2. 该目录的拥有者者删除
3. 该文件的拥有者删除
[root@hcss-ecs-f571 dir1]# ll
total 4
drwxrwxr-x 2 zhangsan zhangsan 4096 Aug 22 11:56 dir01
-rw-rw-r-- 1 zhangsan zhangsan 0 Aug 22 11:56 hello
-rw-rw-rw- 1 zhangsan zhangsan 0 Aug 22 12:11 test2.txt
-rw-rw-r-- 1 zhangsan zhangsan 0 Aug 22 11:56 test.txt[root@hcss-ecs-f571 dir1]# chmod +t dir01
[root@hcss-ecs-f571 dir1]# ll
total 4
drwxrwxr-t 2 zhangsan zhangsan 4096 Aug 22 11:56 dir01
-rw-rw-r-- 1 zhangsan zhangsan 0 Aug 22 11:56 hello
-rw-rw-rw- 1 zhangsan zhangsan 0 Aug 22 12:11 test2.txt
-rw-rw-r-- 1 zhangsan zhangsan 0 Aug 22 11:56 test.txt
[root@hcss-ecs-f571 dir1]#