目录
1. 用户权限
2. linux权限管理
2.1 文件访问者的分类
2.2 文件类型和访问权限
2.3 文件权限值的表示方法
2.4 .文件访问权限的设置
2.4.1 chmod
2.4.2 chown
2.4.3 chgrp
2.5 目录权限
2.5.1 目录权限的作用
2.5.2 粘滞位
2.6 umask
Linux下有两种用户:超级用户(root)、普通用户
root和普通用户的切换,实际上就是权限的切换,由root——>普通用户,权限降低;由普通用户——>root,权限提升
linux下如何进行身份切换
从普通用户切换成root用户
// 方法一:su
[hqs@VM-8-2-centos ~]$ su
// 方法二:su -
[hqs@VM-8-2-centos ~]$ su -
// 方法三: su root
[hqs@VM-8-2-centos ~]$ su root
输入命令之后按回车会提示你输入密码,注意此时的密码是root用户的密码,设置root用户密码的命令为
[hqs@VM-8-2-centos ~]$ sudo passwd root
输入root密码后,就由普通用户切换成了root用户
[hqs@VM-8-2-centos ~]$ su
Password:
[root@VM-8-2-centos hqs]# whoami
root
从root用户切换成普通用户
// 方法一:su + 用户名 ———— 可以从root直接切换成任一用户
[root@VM-8-2-centos hqs]# su hqs
[hqs@VM-8-2-centos ~]$ whoami
hqs
// 方法二:直接按ctrl + d
[root@VM-8-2-centos ~]# whoami
root
[root@VM-8-2-centos ~]# logout // ctrl + d
[hqs@VM-8-2-centos ~]$ whoami
hqs
// 方法三:logout
[root@VM-8-2-centos ~]# logout
[hqs@VM-8-2-centos ~]$ whoami
hqs
linux下一切皆文件
认识linux下的权限也就是认识文件的权限
当我们想要访问一个文件时,对于这个文件而言,其访问者通常有三种身份
所有者:一般为这个文件或文件目录的创建者
所属组: 文件或文件目录所有者所在的组(在linux下,一个用户必然属于一个组,一个组内可以只有一个用户)
other:除了所有者和所有组内部的用户之外,其余的人都是other
例如:hqs这个用户属于A小组,他创建了一个文件,那么这个文件的所有者就是hqs,所属组就是A小组,A小组内的成员访问这个文件的身份就是所有组,除此之外都是other
在linux下,使用 ll 指令将文件的详细信息显示出来,能够看到文件的所有者和所属组
如何更改所有者和所属组
命令 chown 用户名 文件名 来修改文件的所有者
在Linux下, ll 显示的文件信息具体含义如下
[hqs@VM-8-2-centos 7]$ ll
total 8
drwxrwxr-x 2 hqs hqs 4096 Jan 7 10:59 dir
-rw-rw-r-- 1 hqs hqs 14 Jan 7 10:59 file.txt
文件类型 所有者权限 所属组权限 other权限 连接数 所属用户 所属用户组 文件大小 最新修改日期 文件名
d rwx rwx r-x 2 hqs hqs 4096 Jan 7 10:59 dir
其中开头十个字母代表文件的类型和访问者权限
以目录文件dir的文件信息进行分析
drwxrwxr-x
第一位(d):文件类型(目录文件)
不同字符对应的文件类型如下
- d:目录文件
- -: 普通文件
- l: 软链接(类似Windows的快捷方式)
- b:块设备文件(例如硬盘、光驱等)
- p:管道文件 (常用于进程间通信)
- c:字符设备文件(例如键盘、显示器)
- s:套接口文件
注意:在linux下,文件类型与后缀名无关,这一点与windows不同
drwxrwxr-x
第2-10位代表了访问者的权限,其中基本权限属性有4种:
- i.读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- ii.写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
- iii.执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- iv.“-”表示不具有该项权限
drwxrwxr-x
第2-4位(rwx): 所有者权限
表示所有者对该文件拥有读权限、写权限和可执行权限
第5-7位(rwx): 所属组权限
表示所有者对该文件拥有读权限、写权限和可执行权限
第8-10位(r-x): other权限
表示其他组对该文件拥有读权限和可执行权限,不具有写权限
字符表示方法
Linux表示 | 说明 | Linux表示 | 说明 | |
r-- | 只读 | -w- | 仅可写 | |
--x | 仅可执行 | rw- | 可读可写 | |
-wx | 可写可执行 | r-x | 可读可执行 | |
rwx | 可读可写可执行 | --- | 无任何权限 |
8进制数值表示方法
对于任意一个文件访问者,其权限只需要3个字符就能表示,其固定格式为:读+写+执行,对于每一个权限,要么有该权限要么没有,因此可以考虑用二进制位代表权限——使用1代表有该权限,0代表没有该权限,如:110 代表 rw-,表示可读可写,不可执行,而110的八进制数字6,我们可以使用一个8进制数来唯一确定一种权限
权限符号(读写执行) | 八进制 | 二进制 |
r-- | 4 | 100 |
-w- | 2 | 010 |
--x | 1 | 001 |
rw- | 6 | 110 |
r-x | 5 | 101 |
-wx | 3 | 011 |
rwx | 7 | 111 |
--- | 0 | 000 |
全称:change mode
格式:chmod [参数] 权限 文件名
功能:设置文件的访问权限
常用选项
- R -> 递归修改目录文件的权限
- 说明:只有文件的拥有者和root才可以改变文件的权限
方法一:chmod 用户表示符+/-/=权限字符 文件名
首先说明用户表示符,用来代表你要操作的用户类型
用户标识符
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
用来给设置权限的符号
权限字符
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
举个例子:
---------- 1 hqs hqs 14 Jan 7 10:59 file.txt // 一个去掉所有权限的file.txt文件
// 给file所有者增加读权限
[hqs@VM-8-2-centos 7]$ chmod u+r file.txt
[hqs@VM-8-2-centos 7]$ ll
-r-------- 1 hqs hqs 14 Jan 7 10:59 file.txt
// 给file所属组增加读写权限
[hqs@VM-8-2-centos 7]$ chmod g+rw file.txt
[hqs@VM-8-2-centos 7]$ ll
-r--rw---- 1 hqs hqs 14 Jan 7 10:59 file.txt
// 给file的other增加读写和可执行权限
[hqs@VM-8-2-centos 7]$ chmod o+rwx file.txt
[hqs@VM-8-2-centos 7]$ ll
-r--rw-rwx 1 hqs hqs 14 Jan 7 10:59 file.txt // 此时file.txt有执行权限,但并不能被执行,因为他不是一个可执行文件
// 给file的other减去可执行权限
[hqs@VM-8-2-centos 7]$ chmod o-x file.txt
[hqs@VM-8-2-centos 7]$ ll
-r--rw-rw- 1 hqs hqs 14 Jan 7 10:59 file.txt
// 给file的所有者增加写权限,减去读权限
[hqs@VM-8-2-centos 7]$ chmod u+w,u-r file.txt // 用逗号分隔
[hqs@VM-8-2-centos 7]$ ll
--w-rw-rw- 1 hqs hqs 14 Jan 7 10:59 file.txt
// 用=给所有用户赋可执行权限
[hqs@VM-8-2-centos 7]$ chmod a=rw file.txt
[hqs@VM-8-2-centos 7]$ ll
-rw-rw-rw- 1 hqs hqs 14 Jan 7 10:59 file.txt // 此时没有被赋值到的权限变为-
注意:一般而言,只有文件的所有者和root可以随意修改文件的权限
方法二: 用户表示符 三位8进制数字 文件名
之前已经提到,一个八进制数字可以代表三位的权限,如 0 代表 -,7代表 rwx,因此可以使用三个八进制数来分别代表所有者、所属组和other的权限,如000代表 ---,777代表 rwxrwxrwx
举个例子:
// 将所有者、所属组和other权限都改成0(---)
[hqs@VM-8-2-centos 7]$ chmod 000 file.txt
[hqs@VM-8-2-centos 7]$ ll
---------- 1 hqs hqs 14 Jan 7 10:59 file.txt
// 将所有者、所属组和other权限都改成7(rwx)
[hqs@VM-8-2-centos 7]$ chmod 777 file.txt
[hqs@VM-8-2-centos 7]$ ll
-rwxrwxrwx 1 hqs hqs 14 Jan 7 10:59 file.txt
如果给的八进制数不足三位,则默认从右向左赋予权限,如
---------- 1 hqs hqs 14 Jan 7 10:59 file.txt // 给出一个没有权限的file.txt
// 只给一位八进制数默认是给other的
[hqs@VM-8-2-centos 7]$ chmod 5 file.txt
[hqs@VM-8-2-centos 7]$ ll
-------r-x 1 hqs hqs 14 Jan 7 10:59 file.txt
[hqs@VM-8-2-centos 7]$
// 给两位八进制数默认分别给other和所属组
[hqs@VM-8-2-centos 7]$ chmod 52 file.txt
[hqs@VM-8-2-centos 7]$ ll
----r-x-w- 1 hqs hqs 14 Jan 7 10:59 file.txt
全称:change owner
格式:chown [参数] 用户名 文件名
功能:修改文件的拥有者
我们先先换成root用户,并使用下面的命令创建一个临时用户temp
useradd -m temp
为临时用户创建密码使用命令
passwd temp
这样我们的机器里就有了两个用户,但由于权限不够,此时由普通用户将 file.txt 文件的所有者转移给temp会被拒绝
[hqs@VM-8-2-centos 7]$ chown temp file.txt
chown: changing ownership of ‘file.txt’: Operation not permitted
需要在root用户下才能将更改文件的所有者,或者使用sudo命令临时提升普通用户权限后,再将文件转移给temp
[root@VM-8-2-centos 7]# chown temp file.txt
[root@VM-8-2-centos 7]# ll
total 4
----r-x-w- 1 temp hqs 14 Jan 7 10:59 file.txt // 此时file.txt的所有者变成了temp,但所属组仍为hqs
同时更改文件所有者和所属组
[root@VM-8-2-centos 7]# chown temp:temp file.txt // 修改后的所有者:修改后的所属组
[root@VM-8-2-centos 7]# ll
total 4
----r-x-w- 1 temp temp 14 Jan 7 10:59 file.txt
全称:change group
格式:chgrp [参数] 用户组名 文件名
功能:修改文件或目录的所属组
常用选项
- -R 递归修改文件或目录的所属组
chgrp用法和chown类似
[root@VM-8-2-centos 7]# chgrp temp file.txt
[root@VM-8-2-centos 7]# ll
total 4
----r-x-w- 1 hqs temp 14 Jan 7 10:59 file.txt // 修改file所属组为temp
对于一个目录文件,对于每个访问者同样具有读、写和执行权限,但这些权限的实际作用和普通文件有所区别
- 可读权限: 允许查看目录内的文件,如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容
- 可写权限: 允许在目录内创建或删除文件,如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
- 可执行权限: 允许进入目录,如果目录没有可执行权限, 则无法cd到目录中
注意:如果你既是所有者也属于所属组,那么对文件的访问权限却决于你的所有者权限 ——权限只被认证一次,只要你是所有者,系统会以所有者的身份去验证你的权限,之后也不再以所属组对你进行验证
// 使用chmod删除所有者的执行权限
[hqs@VM-8-2-centos 7]$ chmod u-x dir/
[hqs@VM-8-2-centos 7]$ ll
drw-rwxr-x 2 hqs hqs 4096 Jan 7 19:08 dir // 此时hqs对目录文件dir不再具有执行权限
[hqs@VM-8-2-centos 7]$ cd dir/ // 进入目录文件dir
-bash: cd: dir/: Permission denied // 没有权限
// 使用chmod删除所有者的写权限
[hqs@VM-8-2-centos 7]$ chmod u-w dir/
[hqs@VM-8-2-centos 7]$ ll
dr-xrwxr-x 2 hqs hqs 4096 Jan 7 19:08 dir // 此时hqs对目录文件dir不再具有写权限
[hqs@VM-8-2-centos 7]$ cd dir/ // 正常进入dir
[hqs@VM-8-2-centos dir]$ touch file.c // 尝试创建一个文件
touch: cannot touch ‘file.c’: Permission denied // 没有权限
// 使用chmod删除所有者的读权限
[hqs@VM-8-2-centos 7]$ chmod u-r dir/
[hqs@VM-8-2-centos 7]$ ll
d-wxrwxr-x 2 hqs hqs 4096 Jan 7 19:08 dir // 此时hqs对目录文件dir不再具有写权限
[hqs@VM-8-2-centos 7]$ ls dir/ // 打印dir中文件
ls: cannot open directory dir/: Permission denied // 没有权限
为什么需要粘滞位?
我们知道,只要一个用户对目录具有写权限,那么他就可以在目录内创建或删除文件,但在Linux中,一件很违反直觉的事是——一个对目录具有写权限的用户可以对其他用户在当前目录下的文件进行删除
[hqs@VM-8-2-centos 7]$ sudo touch CreatByRoot // 创建一个普通文件,所有者和所属组均为root
[hqs@VM-8-2-centos 7]$ sudo chmod 000 CreatByRoot // 去掉CreatByRoot的所有权限
[hqs@VM-8-2-centos 7]$ ll
---------- 1 root root 0 Jan 7 19:59 CreatByRoot
[hqs@VM-8-2-centos 7]$ rm CreatByRoot // 使用普通用户的身份对CreatByRoot进行删除
rm: remove write-protected regular empty file ‘CreatByRoot’? y
[hqs@VM-8-2-centos 7]$ ll
total 0 // 成功删除CreatByRoot
即使对一个文件没有读写执行权限,但仍然可以删除,因此对文件进行权限设置可以防止别人读写和执行该文件,但并不能阻止别人对文件进行删除,这是因为
文件是否可以被访问者删除由访问者在文件当前所处目录下的权限决定,与文件本身权限无关
考虑一种场景,多个用户在一个共同的路径下,对该目录具有读写执行权限,就有可能使得别人将我们的文件删除,而如果仅仅改变某个用户对该目录的权限,会使得该用户无法对自己的文件进行操作,因此为了保护我们的文件,需要设置粘滞位
什么是粘滞位?
为了满足实际的需要:
- 多个用户共享一个目录,需要在该目录下进行读写,创建和删除文件
- 文件只能由创建者删除,不能被别人删除
设置粘滞位就是满足这种需求,一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件
怎样设置粘滞位?
粘滞位只能给目录设定,给一个目录设置粘滞位,就使得在该目录下的文件只能由所有者或root删除
chmod -t 目录
对于目录文件来说,粘滞位只能给other设置,目录文件的所有者和所属组对整个目录的权限是足够高的,因此对目录设置粘滞位后,other在该目录下的可执行权限变为t
[hqs@VM-8-2-centos 7]$ chmod +t public/ // 对public这样一个目录增加粘滞位
[hqs@VM-8-2-centos 7]$ ll
total 4
drwxrwxr-t 2 hqs hqs 4096 Jan 7 20:22 public // other的可执行权限变为t
在Linux下,默认
一个目录被创建,起始权限是777
一个普通文件被创建,起始权限是666
但实际上我们看到的权限却是
[hqs@VM-8-2-centos 7]$ mkdir dir
[hqs@VM-8-2-centos 7]$ touch file
[hqs@VM-8-2-centos 7]$ ll
total 4
drwxrwxr-x 2 hqs hqs 4096 Jan 7 19:26 dir
-rw-rw-r-- 1 hqs hqs 0 Jan 7 19:27 file
目录:775
普通文件:664
这是因为存在系统掩码umak,umask指明了哪些权限不应该在文件的最终权限中出现,例如umask = 022,二进制位 000 010 010 ,说明所属组和other的可写权限不该出现
设置umask能够在创建新文件或目录时,屏蔽掉新文件或目录不应有的访问允许权限,以保证系统的安全,Linux下的umask为:0002
[hqs@VM-8-2-centos 7]$ umask
0002
我们也可以手动设置umask
[hqs@VM-8-2-centos 7]$ umask 0003 // 将umask设置为003
[hqs@VM-8-2-centos 7]$ mkdir dir // 创建一个目录
[hqs@VM-8-2-centos 7]$ touch file // 创建一个普通文件
[hqs@VM-8-2-centos 7]$ ll
total 4
drwxrwxr-- 2 hqs hqs 4096 Jan 7 19:37 dir // 最终权限发生了改变
-rw-rw-r-- 1 hqs hqs 0 Jan 7 19:37 file
一个文件的最终权限 = 起始权限 & (~umask)
因此,默认情况下一个目录的最终权限为:777 & (~002) = 775 ,一个普通文件的最终权限为:777 & (~002) = 775