一、Linux权限的概念
权限就是特定用户对特定文件某属性操作的限制
1.1 Linux中的用户类别
Linux下有两种用户:超级用户(root)、普通用户
- 超级用户:可以再linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
超级用户基本不受linux权限系统的限制,下面介绍的访问者和访问权限对root用户无效。
如何进行用户切换?
- su:切换为超级用户(root)
- su -:切换为root并返回root的工作目录
- su username:切换为指定的普通用户
- su - username:切换为指定的普通用户并返回指定用户的工作目录
- 超级用户root可以随意切换到任何普通用户且无需密码。
- 普通用户切换到root或普通用户之间进行切换需输入用户密码。
用户回退:exit / ctrl+d。不建议使用su username的方式进行回退,因为不退出登录bash进程就不会被终止,多次切换会导致后台运行的bash进程过多。
sudo指令——临时权限提升
- 语法:sudo + 命令
- 不切换用户,但以root权限执行这条命令
- 需输入普通用户的密码
- 普通用户在使用sudo命令前需添加信任关系
如何添加信任关系?
- 打开sudoers配置文件进行修改
vim /etc/sudoers
- 在表Allow root to run any commands anywhere(100行左右) 下添加信任用户
- 在表Allows people in group wheel to run all commands(108行左右)下添加信任组
- 保存并退出
gpasswd指令——加入或退出用户组
- 功能: 加入或退出用户组,一般需要root权限
- 语法: gpasswd [op] username grpname
- 常用选项:
- -M:加入指定用户组
- -d:退出指定用户组
- 举例:
sudo gpasswd -M ztt zty //加入zty组
sudo gpasswd -d ztt zty //退出zty组
id指令——查看用户信息
- 功能: 依次显示用户id,组id,所属组
- 语法: id username
- 举例:
1.2 文件访问者的类别
- 文件的权限是针对不同访问者来区别设置的
- 文件访问者分为以下三类:
- 拥有者:owner
- 所属组:group
- 其他人:other
不是拥有者,且与拥有者不在同一组就是other
1.3 文件类型和访问权限
ll指令查看文件的具体属性
详细内容点这里:详解Linux下ll命令的完整属性信息
Linux中的文件类型
- 在Linux文件系统中,不以文件后缀区分文件类型。
说明:这句话的适用范围是Linux文件系统中。Linux系统中的命令或程序还是要通过后缀来区分文件类型的。
- 文件属性第一部分的第一个字符标识文件的类型:
- -:普通文件【文本,各种动静态库,可执行程序,源程序】
- d:目录文件
- c:字符设备文件【键盘与显示器】
- b:块设备文件【磁盘】
- p:管道文件【通信】
- l:链接文件【软链接】
基本权限
- 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说,具有删除、移动、创建目录内文件的权限
- 执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- “—”表示不具有该项权限
二、Linux权限管理
2.1 文件权限值的表示方法
字符表示法
8进制数表示法
- 由于权限的位置是确定的而且是两态的(有或没有),所以各访问者的权限可以用二进制数表示;又因为最大是111,所以每种身份的权限可以简化为一个8进制。三种访问者即3位8进制数。
2.2 文件访问权限的设置方法
chmod指令——设置访问者的权限
- 功能: 设置文件的访问权限
- 格式: chmod [参数] 权限 文件名
- 常用选项:
- -R:递归修改目录文件的权限(用户至少拥有读和执行权限)
- 说明:只有文件的拥有者和root才可以改变文件的权限
通过权限字符设置
chmod [参数] 用户标识符+/-/=权限字符 文件名
用户标识符
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
+/-/=
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
实例:
chmod u+w /home/abc.txt
chmod u-rx /home/abc.txt
chmod o-x /home/abc.txt
chmod u+w,g=wx,o-x, /home/abc.txt
chmod a=x /home/abc.txt
chmod a=rx /home/abc.txt
通过三位8进制数字设置
chmod [参数] <权限码> 文件名
实例:
chmod 664 /home/abc.txt
chmod 640 /home/abc.txt
chown指令——修改文件的拥有者和所属组
- 功能: 修改文件的拥有者和所属组
- 格式: chown [参数] 用户名:所属组 文件名
- 常用选项:-R 递归修改文件或目录的所属组
- 实例:
chown user1 f1 //修改文件的拥有者
chown user1:grp1 f1 //修改文件的拥有者和所属组
chown :grp1 f1 //修改文件的所属组
chown -R user1 filegroup1 //递归修改访问者
chgrp指令——修改文件的所属组
- 功能: 修改文件或目录的所属组
- 格式: chgrp [参数] 用户组名 文件名
- 常用选项:-R 递归修改文件或目录的所属组
- 实例:
chgrp users /abc/f2
root可以不受限制的修改任何文件的访问权限、拥有者和所属组。因此,文件的创建者不一定是文件的拥有者。
2.3 目录的权限
- 可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.
- 可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
- 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
- 目录的可执行权限是表示你可否在目录下执行命令。
- 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
- 而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录甚至可以打开目录中的文件(已知文件名)。但由于没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
- 只拥有r权限时,ll查看目录中的内容只能显示文件名;拥有rx权限才能显示详细信息。
- chmod -R 递归修改访问者的权限时,拥有者至少需要rx权限。
上面介绍的目录权限体系存在一个问题,那就是如果我们想创建一个公共目录:访问者可以在目录中创建和修改文件,但不能删除不属于自己的文件。这样的目录就存在写入权限的矛盾。如果放开其他人的写入权限,那么他就有权力删除文件中的所有文件(包括不属于自己的文件),以下是测试过程:
[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 litao litao 4096 9月 19 15:53 litao
-rw-r--r--. 1 root root 0 9月 19 15:59 root.c
[root@localhost ~]# su - litao
[litao@localhost ~]$ rm /home/root.c #litao可以删除root创建的文件
rm:是否删除有写保护的普通空文件 "/home/root.c"?y
[litao@localhost ~]$ exit
logout
为了解决这个不科学的问题, Linux引入了粘滞位的概念。
2.4 粘滞位
- 粘滞位只能对目录设置,一般是限制other权限的
- 对于设置了粘滞位的目录,任何人都可以在目录下创建文件,但不能删除不属于自己的文件。只有文件的拥有者才可以删除文件,其他人不能删除。
注意:
- 粘滞位是独立于rwx权限之外的,并不是与x权限绑定在一起的,只是在文件属性中的位置与o:x相同。
- 如果想发挥粘滞位的上述功能,需要在o=rwx权限的基础上再增加粘滞位。
- 粘滞位的设置方法: chmod +t/o+t 目录名
- 测试过程:
[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": 不允许的操作
- 实际应用: 事实上,所有用户在运行过程中产生的临时文件都存放在系统的/tmp路径下。所有用户在/tmp路径下均可创建、修改、读取、删除属于自己的临时文件,但不能对其他用户的临时文件进行操作。
- 当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
- 超级管理员删除
- 该目录的所有者删除
- 该文件的所有者删除
2.5 默认权限
新建文件的权限配置就是默认权限。
默认权限的由来
- 起始权限码(default0)
- 普通文件的起始权限码:666
- 目录文件的起始权限码:777
- 利用权限掩码将起始权限码转换为默认权限
- 调用umask指令查看权限掩码(默认为0002)
- 将权限掩码的指定位关闭:
- default = default0 & (~mask)
- 经过转换后权限码变为:
普通文件的默认权限码:664
目录文件的默认权限码:775
- 根据文件类型对默认权限进行调整
最后再根据文件类型进行调整,如可执行程序a.out具有执行权限。
自定义默认权限
通过umask+权限掩码,设置权限掩码,从而改变默认权限
注意:自定义默认权限只在本次登录中有效。
umask指令——显示或修改权限掩码
- 功能:显示或修改权限掩码(默认为0002)
- 语法:umask [权限掩码]
- 实例: