前言
本文主要内容:
👥 用户分类
Linux中,有两种用户:
- root:超级用户
- 普通用户:root
adduser
添加的用户
root基本不受权限的约束,普通用户受权限约束。
这两个用户是可以相互切,不过从普通用户到root需要密码。
普通用户 -> root :使用
su
或者su -
首先我们要知道:Linux中所有用户都要有对应的密码。
比如我的 root账号 的密码是在云服务的控制台设置的,
而 root 在创建普通用户时,也一定会设置普通用户的密码。当普通用户输入
su
并回车:
此时要求输入的密码就是 root 账号的密码。
输入密码后,身份切换,但是所处的位置不变。
比如这里还是在之前用户的家目录:
如果要回退到普通用户,可以输入exit
,也可以使用Ctrl D
:
如果说
su
是单纯的身份变化,那么su -
就是身份变化加位置变化,
相当于以root
的身份重新登录:
root -> 普通用户: 使用
su <用户名>
root用户如果想切换到其他用户,可以直接su
加用户名,不用密码:
普通用户 -> 普通用户:
su 对应用户名
普通用户切换到其他普通用户,需要对应用户的密码。
🔓 提升指令权限
普通用户,如果想要对某条指令提高权限,可以在前面加上 sudo
:
很明显,这里让我们输的是当前用户的密码,而不是 root
的密码。
那岂不是人人都是 root
?当然不是:
只有加进了这个 sudoers file
的普通用户才能进行 sudo
。
相当于是系统的白名单。
🛡️ 什么叫做权限
一件事是否允许被你做,这就是权限。
1.权限认证的是身份,即权限和‘谁在用’有关。
2.权限也和事物的‘属性’有关
比如文件权限,一般包含可读、可写、可执行等等。
当使用 ls -l 列出文件的详细信息时,最前面的是十个符号:
drwxrwxr-x
-rw-rw-r--
第一个字符表示文件的类型。
d
rwxrwxr-x
-
rw-rw-r–
有人可能会想:
欸,不对啊,Windows中文件类型不是由后缀决定的吗?
你也知道那是Windows。。。
并不是所以操作系统都和Windows一样。
这里需注意,Linux系统中文件名后缀没有直接的意义。
而第一个字符代表的才是文件类型,
这里重点关注两个:
-
: 普通文件(源代码,可执行程序,库等)
d
: 目录文件
了解:
b
: 块设备文件(磁盘文件)
c
: 字符设备文件(键盘、显示器文件等)
p
: 管道文件
管道文件可以用来进行通信:
剩下九个字符表示对应位置的权限:
drwxrwxr-x
- rw-rw-r--
一般由下面这四个字符组成:
- r: 可读
- w: 可写
- x: 可执行
- -: 对应的权限位置,没有权限
把具体的用户当作人,那么权限身份就是每个人所扮演的角色。
权限身份有三个:
拥有者、所属组、其他人
拥有者:
drwxrwxr-x 2 ly
ly 4096 Dec 1 14:34 empty
-rw-rw-r-- 1 ly
ly 0 Dec 1 08:29 test.txt
所属组:
drwxrwxr-x 2 ly ly
4096 Dec 1 14:34 empty
-rw-rw-r-- 1 ly ly
0 Dec 1 08:29 test.txt
其他人:不是拥有者,也不是所属组,就是其他人。
此时,了解了权限身份,就可以把刚刚的九个字符分成三组来看:
drwx
rwx
r-x
-rw-
rw-
r--
前三个,代表拥有者权限。
中间三个,代表所属组权限。
后三个,代表其他人权限。
单独的看一组:
- 什么位置是什么含义,这是确定的。
- 每一个位置只有是或者否,具有指定的权限。
r/- | w/- | x/- |
---|---|---|
有/无读权限 | 有/无写权限 | 有/无执行权限 |
⚙️ 权限的修改
chmod
(change mode)用来改权限:
可以用字符表示,不过有点麻烦:
人:u
(拥有者)、g
(所属组)、o
(其他)、a
(所有)
操作:+
(加)、-
(删)、=
(设置)
权限:r
、w
、x
我比较喜欢用他的八进制修改方式。
单独拿出一组来看:
r
/-
w
/-
x
/-
,
很明显,三个位置分别对应两种情况(有 / 无),
总共 2 * 2 * 2 = 8种情况。
因此每一组都可以用一个八进制数字(0 ~ 7)表示。
而每一组权限的值由 4 个标志组成:
r
:读,值为 4
w
:写,值为 2
x
:执行,值为 1
-
:无,值为 0
如果我想把权限全部放开,就直接chmod 777 <文件名>
想把所属组、其他人的权限关闭,就chmod 700 <文件名>
root可以更改文件拥有者和所属组:
chown更改文件拥有者:
chgrp更改文件所属组:
chown也可以同时改变文件拥有者和所属组:
📝 补充
📜 文件权限的判断流程
当权限为: r–rw----
即拥有者不可以写,所属组可以写。
如果既是拥有者,又是所属组,那么可以写吗?
不可以,因为只会对应一个权限身份:
Start
|
v
用户发起操作(如访问文件/执行程序)
|
v
查身份(UID)
|
|-- 是 root(UID=0):直接允许操作 --> End
|
v
查目标对象权限(文件、目录等)
|
v
当前用户是不是目标对象的所有者?
|
|-- 是 --> 查所有者的权限位(rwx)
| |
| |-- 有权限 --> 允许操作 --> End
| |-- 无权限 --> 拒绝操作 --> End
|
v
当前用户是不是目标对象的所属组?
|
|-- 是 --> 查所属组的权限位(rwx)
| |
| |-- 有权限 --> 允许操作 --> End
| |-- 无权限 --> 拒绝操作 --> End
|
v
检查其他用户权限位(rwx)
|
|-- 有权限 --> 允许操作 --> End
|-- 无权限 --> 拒绝操作 --> End
🛠️ 权限掩码
为什么我们创建文件的默认权限是我们所看到的样子?
比如普通文件是664,目录文件是775?
我们首先得知道,文件和目录的起始权限:
文件:666 (rw-rw-rw-
)
目录:777 (rwxrwxrwx
)
而最终变成我们看到的默认权限,是因为这里还有一个东西,
权限掩码 umask
:
权限掩码:凡是在umask中出现的权限,不会在最终的文件权限中出现。
这里有个计算公式:
最终权限 = 起始权限 & ( ~umask)
单看公式比较抽象,举个例子吧:
比如上面,umask值为2,
对文件:
起始权限:666 (rw-rw-rw-)
umask
: 002 (-------w-)
取个反:~002 = 775 (rwxrwxr-x)
最终 = 666 & 775 = 664 (rw-rw-r–)
。。。
好像还是很抽象。。。
画个图:
简单讲,
umask中出现过的最终一定不会出现,
umask中没出现的最终不一定会出现。
🗂️ 目录权限与粘滞位
目录权限刚刚一直在讲,而具体作用在此处补充:
- r : 是否允许我们查看指定目录下的文件内容。
- w :是否允许我们在当前目录下进行创建,更改,删除。
- x :是否允许我们进入目录。
当不同用户需要相互协作时,
可以让root在根目录下建个共享目录:
但这时,有个问题出现了。
当A在此目录建立了自己的文件,并设置该文件权限为700。
而此时,我们已经可以知道,
一个文件能否被删除,不由文件属性决定,由文件所处目录决定。
shared目录让所有人都有了 w
权限,
等同于所有人都可以在当前目录下进行创建,更改,删除。
那么对B来说,
不能读、不能看、也不能修改A的文件,但可以删!?
针对这个问题。。。
粘滞位:给目录设置。
内容只有拥有者和root能删。
是的,搞个特殊就行了:
drwxrwxrwt
,这个 t
就是粘滞位
希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!