文章目录
一. Linux用户的身份切换
Linux 下有两种用户: 超级用户和普通用户
- 超级用户是
root
, 是超级管理员, 用户目录是/root/
.
在Linux系统下做任何事情, 不受限制. 相当于 windows 里面的 administrator - 普通用户则是非 root 用户, 用户目录是
/home/xxx
, 以在Linux下做有限的事情
如何身份切换?
使用
su
指令进行身份切换
su -
以 root 重新登陆. 将当前工作目录改为 root
家目录
超级用户命令提示符是 #
; 普通用户命令提示符则是 $
按住 Ctrl-D
可以退出当前用户的登陆.
每登陆一个用户就会创建一个相对应的 bash
进程, 退出实则是杀死 bash
进程.
本质上, 自己是可以登陆自己的, 两者对应的 bash
进程进程 id 肯定不一样
su
普通用户切换成 root
不同于 su -
, su -
是直接将当前工作目录更改为 root
家目录
而 su
的当前工作目录仍然没有变化
总结
普通用户切换用户(包括 root
和 普通用户)都需要输入目标用户的密码(登陆到root
需要root
密码, 登录到普通用户需要普通用户密码).
root
切换成普通用户不用验证.
为什么要进行身份切换
普通用户想要进行只能
root
操作的命令, 只能切换为root
进行操作.
但每次切换会很麻烦
sudo + 原本要输入的指令
, 可以以普通用户身份按 root
权限执行一条命令.
sudo
对当前的指令进行短暂提权, 需要输入当前用户密码.
但是上述操作仍然没有成功, 提示当前用户没有在sudoer file
, 这是用户信息列表配置文件, 只有 root
才可以进行修改.
sudoer file 相当于白名单, 但是只能
root
进行修改
用户名在配置文件中, 允许用户使用sudo
用户名不在配置文件中, 不允许用户使用sudo
这也就是为什么 sudo
指令只需要输入当前用户密码, 普通用户只有经过 root
管理员现实中同意后, 管理员通过 root
将其添加到配置文件中, 才可以用 sudo
sudo
和 直接切换 root
账号是完全不一样的. root
的密码只能由管理员掌握, 不可能让所有人都能登陆 root
, sudo
虽然让指令有 root
权限, 但实际操作的仍然是普通用户, 而非 root
用户.
在 /etc/sudoers
文件里添加一行将用户添加到root
用户组就可以使用 sudo
了
二. Linux权限管理
什么是权限呢?
权限一定是让不让做这件事.
- 权限限制的是身份, 正如在视频网站上面, 有VIP身份才可以看一些视频.
- 权限限制的是对应操作对象有没有满足需求的属性, 比如即使是视频网站的VIP身份, 也不可以在上面刷算法题, 敲代码.
在 Linux 下一切皆文件的理念下, 权限就是能不能对文件作出一些操作.即文件权限.
- 身份就是Linux群体, 限定的是具体角色.
- 属性就是Linux操作对象属性, 文件本身是否可读可写等.
1. 文件访问者的分类(人)
- 文件和文件目录的所有者:
u--User
- 文件和文件目录所有者所在组的用户:
g--Group
- 其他用户:
o--Other
在对应文件属性有所体现
文件可能属于某个人(拥有者), 也可能属于某个组(所属组).
在文件属性列表中, 没有 other, 因为除去 拥有者和所属组就是 other.
那么这个所属组究竟是什么呢?
所属组的存在方便了文件共享, 如果只有拥有者和other, 那么就只会有完全私有和完全公开两个选择. 如果只想文件多属于一个人, 可以直接将其拉入所属组, 这样可以做到部分公开, 组内共享.
2. 文件类型和访问权限(事物属性)
文件类型
Linux 文件类型不通过后缀区分(不代表Linux不用后缀), 对于系统来说, 文件分为以下几种
-
普通文件
文本, 源代码, 图片, 视频, 库, 可执行文件等.
-
目录文件
-
块设备
支持随机访问, 例如常见磁盘
可以在/dev
里看到磁盘文件
-
字符设备
不支持随机访问, 例如键盘, 显示器
服务器可以在/dev/pts
看到显示器文件
-
链接文件
特别像快捷方式
库文件有很多链接文件
也可以自己创建链接文件
-
管道文件
可以自己创造管道文件
管道文件是
|
的亲兄弟, 终端与终端可以通过管道文件实现通信
使用 file
命令, 可以查看文件类型
文件基本权限
- 读(r/4): Read. 对文件而言, 具有读取文件内容的权限. 对目录而言, 具有浏览该目录的权限.
- 写(w/2): Write. 对文件而言, 具有修改文件内容的权限. 对目录而言, 具有具有删除移动目录内文件的权限.
- 执行(x/1): Execute. 对文件而言, 具有执行文件的权限. 对目录而言, 具有进入目录的权限.
- "-"表示不具有该项权限.
3. 文件权限值的表示方法
Linux表示 | 说明 | 八进制表示 |
---|---|---|
r– | 只读 | 4 |
-w- | 仅可写 | 2 |
–x | 仅可执行 | 1 |
rw- | 可读可写 | 6 |
r-x | 可读可执行 | 5 |
-wx | 可写可执行 | 3 |
rwx | 可读可写可执行 | 7 |
— | 无权限 | 0 |
注意
- 权限表示只能按照 r w x 的顺序表示, 不可以修改顺序, 如果该权限没有, 用 - 代替.
- r 对应 4; w 对应 2; x 对应 1.
- 9位文件权限只能按照 拥有者 所属组 其他用户的顺序, 不可以修改顺序
4. 文件访问权限的相关设置方法
注意: 只有文件拥有者和root才可以改变文件的权限
设置文件的访问权限 chmod
指令: chmod
格式: chmod [参数] 权限 文件名
常用选项:
R: 递归修改目录文件的权限
(1). 用户表示符 +/-/= 权限字符
+
: 向权限范围增加权限代号所表示的权限
-
: 向权限范围取消权限代号所表示的权限
=
: 向权限范围赋予权限代号所表示的权限
u
: 拥有者 user
g
: 拥有者所属组 group
o
: 其他用户
a
: 所有用户
文件原来的权限属性:
chmod u-r test.c
减去拥有者读权限
chmod g-rw test.c
减去所属组读写权限
chmod u+r,g+rw test.c
加上拥有者读, 所属组读写权限
chmod a+rwx
所有人加上所有权限
(2). 三位8进制数字
最高位是拥有者权限
中间位是所属组权限
最低位是其他用户权限
chmod 000 test.c
所有用户无权限
chmod 421 test.c
拥有者有r, 所属组有w, 其他用户有x
验证有无权限的对比表现
这是实验文件本来的权限: 拥有者和所属组都可以读写, 其他用户可以读
首先减去了拥有者的读权限
但是观察文件属性, 此时所属组仍然有读权限, 本用户属于这个所属组, 却被提示权限不够.
原因是系统在判断当前用户属于哪个角色的时候只会匹配一次, 按照 拥有者 所属组 其他用户的顺序进行匹配.
当前用户 usr_1 第一次就匹配到了拥有者, 只要拥有者没有读权限, 那么 usr_1 就没有读权限.
修改一下该文件的拥有者, 该指令下一段会讲到, 这个时候系统会把 usr_1 匹配成所属组, 文件读取成功
继续操作, 此时显然 test.cpp 没有执行权限, 给拥有者加上 rx
权限
但是, 想要执行该文件, 却执行失败
一个文件可以被执行, 不仅需要用户有该文件的执行权限, 还需要文件本身可以执行.
修改文件的拥有者 chown
指令: chown
格式: chown [参数] 用户名 文件名
注意如果是普通用户操作, chown
需要有root权限以及验证自己用户的密码
这是文件原来的文件属性
chown usr_2 file.txt
将文件拥有者改为 usr_2
此时如果再想修改文件权限, 就不可以了, usr_1 不是该文件的拥有者.
可以用 chown root:root file.txt
的格式同时修改拥有者和所属组
修改文件的所属组 chgrp
指令: chgrp
格式: chgrp [参数] 所属组名 文件名
chgrp root file.txt
将文件所属组更改为 root 组
查看或修改文件掩码 umask
指令: umask
格式: umask 权限值
实例:
umask //查看
umask 044 //设置
有关 umask
细节在下面一段会详细讲解.
三. 常见权限三个问题
1. 对于目录而言, 进入一个目录需要什么权限?
可以做个实验, 以此将新创建目录的各权限关闭. 以下所有权限都是相对于拥有者而言的.
去掉目录的 r
权限, 目录可以进入, 但不可以看目录下文件的属性
去掉目录的 w
权限, 目录可以进入, 但不可以在目录下创建和删除文件
去掉目录的 x
权限, 目录不可以进入.
Linux 一切皆文件, 目录也是文件, 结合 文件=内容+属性 理解, 目录的内容就是该目录下的文件, 目录的属性就是该目录本身的属性.
总结
- 目录没有
r
权限, 不可以看目录下的文件属性 - 目录没有
w
权限, 不可以创建和删除目录下文件 - 目录没有
x
权限, 不可以进入目录
2. 为什么创建的普通文件, 默认权限不是 777 ,而是 664
新创造的普通文件和目录 有其默认权限
普通文件的起始权限是 666. (普通文件并不需要执行)
目录文件的起始权限是 775.
系统是通过权限掩码设置文件默认权限的.
可以通过 umask
查看权限掩码
普通用户是 002
, root 用户是 022
文件的默认权限 = 初始权限 &(~umask)
可以通过 umask
修改默认权限
umask 0421
3. 一个文件文件能否被删除, 并不取决于文件本身, 而取决于文件所属目录拥有者是否有写权限(w)
使用 root 用户在普通用户 usr_1 拥有的目录下创建了一个文件
将该文件的所有权限关闭
此时只有目录是属于 usr_1 的, 该用户不可查看, 修改该文件的内容
但是, usr_1 可以直接删除该文件
究其原因, 是因为目录拥有者是该用户, 且该用户有 w 权限
这个特点, 在实现文件共享的时候是致命的.
Linux 系统有一个 /tmp
目录可以进行文件共享, 拥有者和用户组都是 root
因为用户各自目录的权限都只对自己开放, 为了方便用户间共享文件, /tmp
目录对所有用户都开放权限.
先以 usr_1 的身份创建了一个文件, 将其权限放开给所有人
以 usr_2 的身份可以对该文件进行读写
那么这个时候 usr_2 可以删除该文件吗? 答案是不可以.
明明 usr_2 有该目录的 w 权限, 想对目录的文件进行删除, 却不被允许. 再仔细看一下 /tmp
目录的权限属性. 多的.
, 是粘滞位.
这里如果把 /tmp
的粘滞位去掉, usr_2 显然可以删除 usr_1 创建的文件
粘滞位就是为了解决目录的拥有者可以对目录下文件随意删除的致命缺点的.
添加粘滞位指令: 给目录的其他用户权限添加 t
chmod o+t 目录名
这样就能保证只有以下角色可以删除该目录下的文件
- root 用户
- 该目录下的文件的所有者
本章完.