【Linux系统编程】4. Linux权限
一、Linux权限的概念
Linux下有两种⽤户:超级⽤户(root)、普通⽤户。
- 超级⽤户:可以再linux系统下做任何事情,不受限制。
- 普通⽤户:在linux下做有限的事情。
- 超级⽤户的命令提⽰符是
#
,普通⽤户的命令提⽰符是$
。
1、su指令
命令: su [用户名]
功能: 切换⽤户
举例:
- 从root⽤户切换到普通⽤户user(不需要输入密码)
su user

- 从普通⽤户user切换到root⽤户(需要输入密码,密码不回显)
su root # root可以省略

注意:
新建用户:adduser [用户名]
设置新建用户的密码:passwd [用户名]
2、sudo指令
语法:sudo [选项] [命令]
功能:是用来进行指定的短暂提权
常用选项:
- -u:指定以哪个用户身份执行命令,后面接用户名
- -l:列出当前用户可以使用 sudo 执行的命令列表
举例:
- 普通用户提权访问root的文件
sudo cat code.c

可以看到普通用户是无法直接访问root下面的文件的,但是通过sudo提权后就可以短暂的访问了。
但是要想能够提权的话,还需要将用户加入白名单中
先更改为root身份:su root
再编辑 sudoers 文件:visudo
在文件中找到类似 root ALL=(ALL) ALL
的行,根据自己的用户名,在下面添加一行即可。
- 以root权限安装软件包
sudo yum install cowsay

二、Linux权限管理
权限是什么?
权限的本质是:能或者不能做什么事情
为什么需要进行权限管理?
- 控制用户的行为,防止错误的发生
- 权限首先限制的是角色(人),权限要求目标必须具备对应的属性

⽂件类型:
- d:⽂件夹
- -:普通⽂件
- l:软链接(类似Windows的快捷⽅式)
- b:块设备⽂件(例如硬盘、光驱等)
- p:管道⽂件
- c:字符设备⽂件(例如屏幕等串口设备)
- s:套接⼝⽂件
三、⽂件访问权限的相关设置⽅法
1、chmod指令
语法: chmod [选项] 权限模式 文件或目录名
功能: 更改文件或目录的访问权限
常⽤选项:
- -R:递归修改⽬录⽂件的权限
注意: 只有⽂件的拥有者和root才可以改变⽂件的权限
权限模式分为 字母表示法 或 数字表示法 。
1)字母表示法
语法: chmod [u g o a] [+ - =] [r w x] 文件或目录名
举例:
- 添加权限:
chmod u+x my.txt
- 移除权限:
chmod o-r my.txt
2)数字表示法
这里是用3个8进制数字来表示的,每一个8进制数字可以分为3个bit位,正好对应所拥有的权限。
例如:666
举例:chmod 666 my.txt
2、chown指令
功能: 修改⽂件的拥有者
格式: chown [选项] [新拥有者][:新所属组] 目标文件/目录
举例:
-
仅修改拥有者:
sudo chown root my.txt
-
同时修改拥有者和所属组:
sudo chown zsy:zsy my.txt
注意: 系统默认不允许我们把文件给别人,想给别人必须高权限,通过sudo / su 切换成为root。
3、chgrp指令
语法: chgrp [选项] 组名 文件或目录名
功能: 修改⽂件或⽬录的所属组
常⽤选项: -R 递归修改⽂件或⽬录的所属组
举例: `
- 修改所属组
4、umask指令
语法: umas [权限掩码]
功能: 查看或修改⽂件掩码
对于普通文件:起始权限666,默认不带x。
对于目录文件:起始权限777,默认带x。
但实际上我们所创建的文件和目录,看到的权限往往不是上面这个值,因为系统默认会存在一个叫做权限掩码的概念,超级⽤户默认掩码值为0022,普通⽤户默认为0002。

举例:
-
查看当前umask掩码:
umask
-
设置新的umask掩码(数字表示法)
重点:
-
umask 目的是什么?
:希望凡是在umask中出现的权限,都不应该在最终权限中出现。 -
为什么要有umask?
:a. 默认权限,由OS自主决定,无法在创建前进行修改 — 系统可配置,可以灵活满足需要的一种表现。
:b. 特殊情况下,配置umask,可以控制文件的默认权限,让我们的代码都是可控的。
5、file指令
语法: file [选项] 文件或目录
功能: 识别文件的类型
常⽤选项:
- -c:详细显⽰指令执⾏过程,便于排错或分析程序执⾏的情形。
- -z:尝试去解读压缩⽂件的内容。
举例:
四、⽬录的权限
- 如果目录没有r,就无法查看目录里面的文件
- 如果目录没有w,就无法在目录内部新建文件,也无法在目录中删除文件
- 如果目录没有x,就无法进入目录
于是,问题来了,换句话来讲,就是只要用户具有⽬录的写权限,⽤户就可以删除⽬录中的⽂件,⽽不论这个⽤户是否有这个⽂件的写权限。
这好像不太科学啊,我张三创建的⼀个⽂件,凭什么被你李四可以删掉?
1、粘滞位
为了解决这个不科学的问题,Linux引⼊了粘滞位(t)的概念。
当⼀个⽬录被设置为"粘滞位"(chmod + t),则该⽬录下的⽂件只能由超级管理员、该⽬录的拥有者、该⽂件的拥有者删除,而不能被非拥有者删除。

此时我们在切换到其他用户,尝试删除操作
可以发现此时无法再删除文件了!
五、关于权限的总结
-
用户只能更改自己的文件权限
-
没有权限系统会拒绝让我们访问
-
确定权限信息的时候,系统会先确定用户是谁?在Centos下,用户角色确定,只确定一次,顺序是:拥有者,所属组,other
-
root用户不受权限约束
-
可执行权限 != 文件可以执行
-
理解linux多用户之间是怎么互相隔离的?任何用户无法进入其他用户的家目录!
-
一个文件能否被删除,与文件本身无关!与文件所处的目录w权限有关!