本篇文章主要是了解Linux的用户组的概念以及权限的概念,后面还会再提到粘滞位的概念,其中用户组和权限的概念是相当的重要,是大家务必要掌握的
用户的UID
在linux系统中,每一个用户都有一个用户UID,用户UID是独一无二的,我们看到的是用户名,在系统中会转化成UID,系统是靠UID来识别该用户,root(管理员)的UID默认是 0,其中1-999是留给系统内部使用的,自己创建的用户的UID是从1000开始的
用户UID的信息存放地址为 /etc/passwd
通过vim编辑器来到 passwd,看查看到每个用户信息的列举
user : x : 1000 : 1000 : : /home/user : /bin/bash
user:表示该用户的用户名
x:表示该用户登陆时是否需要密码,如果把x去掉,再切换到该用户就不需要密码
(这个修改权限只有root用户才具备)
第一个1000:表示该用户的UID
第二个1000:表示该用户的组的GID
/home/user:表示该用户所在的目录(即家目录)
/bin/bash:表示该用户是用的是shell脚本命令
用户的组
每个用户都有自己独一无二的UID,每个组也都有自己的GID,在创建一个用户的时候会默认生成一个组,组的组名和该用户的用户名相同,这个组也可以称为该用户的主组
一个用户可以拥有多个组,但拥有独一无二的主组,除了主组,其他都称为附加组,该用户在附加组里属于附加组的组内成员,该用户在自己的主组里不属于组内成员,但拥有该组的权限
用户组的信息存放地址为 /etc/group
使用vim进入到group,如下图
上图信息第一列表示组名
第二列的x表示用户登陆组时是否需要密码,只有root有修改权限
第三列是组的GID
再后面就是组内成员,如果组内没成员就不显示
对用户及组进行操作的相关命令
useradd:创建新用户
userdel:删除一个用户
usermod:修改用户的信息
groupadd:创建新组
groupdel:删除一个组,但是用户的主组不能删除
groupmod:修改组的信息
groupmems:管理组成员
-a:添加组成员,-g:指定组名,-d:删除组的成员,-p:清空组的成员,-l:列出组的成员
使用这些命令可搭配各种选项,通过man帮助查看各选项的具体作用
需要注意的是,如果使用userdel命令直接就删除了某个用户,会导致用户删除了,但该用户的家目录和里面的文件都是没有被删掉的,这会导致一个问题,当新创建的某个用户分配到这个未删掉的家目录的原主人的UID,那么该新创建的用户拥有对这个未删除的家目录的操作权限,会导致信息泄漏,因此删除某个用户时,最好加上选项 -r
权限
权限的含义
为什么要有权限?Linux是多人开发系统,如果你写的某些东西不想让其他人看到,只给自己看或者给和你同组的人看,那这个时候你就需要给写的东西设置一些权限,要求只有你能看,或者和你同组的人才能看,可见权限还是比较重要的
权限并不是针对某个人而言的,而是你所承担什么样的角色,比如在公司里,你是你所在开发组的组员,你的角色就是组员,那么你就拥有组员对应的权限,当你离开这个开发组,你就没有组员的权限了,这并不是你人变了,而是你的角色变了,所以你相应的权限也就变了,Linux有三种角色,分别是拥有者,所属组,其他人
Linux一般用户都是会受到权限的约束的,但是有一个用户除外,那就是root用户,root不受权限的约束,基本可以为所欲为,可见root用不好是很危险的,所以root一般是不开放使用的
但是有些命令的执行,普通用户没有相应的权限,而又需要执行这个命令该怎么办呢?
Linux有 sudo 命令,这个命令是提权命令,就是暂时拥有root的权力去执行命令,如果你可以使用 sudo 命令,权力提升至和root一样,那你几乎相当于root了,所以想要使用sudo命令,必须得在 sudo文件的白名单里,表明你是可被信任的,不会乱来的,
权限的表示
如上图使用命令ll,能查看当前目录里各个文件或目录的详细信息,通过上面详细信息的列举,我们来认识一下权限的表示
权限的表示在第一列,能看到第一列有10个字符,我们把这10个字符分成2部分
- rw- --- ---
d rwx r-x r-x
d rwx r-x r-x
第一部分是文件类型,可见有的是 '-' ,有的是'd' ,这表示目录或文件的类型
- :表示是普通文件,文本文件,二进制文件,压缩文件,源代码文件...
d :表示目录
c:表示字符设备,不存储数据的设备,如鼠标,键盘,终端等
b:表示block(块设备),存储数据的文件
l:链接文件,类似于win的快捷方式,可链接到可执行文件
第二部分都表示权限,用字母rwx表示
但对文件和目录来说权限又代表不一样的含义
对文件:
r:能否查看文件
w:能否修改文件
x:能否执行文件(二进制代码文件,脚本或命令文件等)
对目录:
r:能否看到目录里的内容
w:能否在该目录下创建和删除文件或重命名文件
x:能否进入到目录里
对于目录的权限来说一般rx是成对出现的,因为只有r权限的话,只能看到该目录里的文件或目录名,无法进入或修改目录,而只有x权限没有r权限的话,即使能进到该目录里,但是什么都看不到
上面探讨的是rwx所代表的权限,不过我们能看到有三组rwx,又分别代表什么呢?
第一组的rwx表示拥有者的权限,第二组的rwx表示所属组的权限(即所属组的组内成员对该文件的权限),第三组的rwx表示其他人的权限
以上是介绍权限的表示,接下来我们看看上面那张图片的第三和第四列,可见两列都写满了root,那么这两列都代表什么呢?第三列表示的是这个文件或目录的拥有者,第四列表示的是这个文件或目录的所属组,也就是说,上面这些文件和目录都是属于root用户,且属于root的主组
权限的修改
认识了权限和权限的表示,我们就可以尝试去修改文件的权限了
修改文件权限,只有文件的拥有人和root才能够修改文件的权限
可以使用命令 chmod 来修改
u:拥有人, g:所属组, o:其他人
' = ' 表示赋予, ' + ' 表示增加,' - '表示去掉
我们一个一个测试,首先看 ' = ',如下图,我们通过chmod命令给文件 practice.txt 的所属组赋予 rw 权限,原先的所属组是没有w权限的,赋予后,就有了w权限
接下来我们看看' - ',这个就是去掉权限,刚才我们不是给所属组赋予了rw权限嘛,接下来,去掉所属组的w权限,使用命令 chmod g-w practice.txt 该文件的所属组的w权限就没了
再来看看' + ',这个是增加权限,刚刚减去了所属组的w权限,这次再给它加回来
使用命令 chmod g+w practice.txt 该文件所属组的w权限就又回来了
权限的表示也可用数字来替换,我们知道,rwx这三个权限在表示时,有就是1,无就是0
只有读权限 r - - | 只有写权限 - w - | 只有执行权限 - - x |
二进制表示 1 0 0 | 二进制表示 0 1 0 | 二进制表示 0 0 1 |
十进制表示 4 | 十进制表示 2 | 十进制表示 1 |
所以 r 的写法等价于数字4,w 的写法等价于数字2, x 的写法等价于数字1
rwx 就是 111,也就是十进制的7,剩下的大家可自行推导
修改拥有人和所属组
修改拥有人和所属组
上面我们说到权限的修改只有拥有者和root用户才可以修改,假设我的一个朋友和我共用一台linux机器,而且我们两个都不是root用户,他想试试修改权限的感觉,但他又懒得去创建一个练习文件,于是他跟我说,你把你的练习文件的拥有者改成我,这样我不就可以修改那个练习文件了嘛
听着好像可行,但事实上,文件的拥有者是不能够随便更改的,即使你是文件的拥有者,你也不能把这个文件的拥有者换成其他人,为什么这样呢?我的文件我想给其他人还不行吗?设想一个极端的场景,如果我们可以随便修改文件的拥有人,我写了一段有很大漏洞的代码,给电脑造成一定损害,然后我把这个漏洞文件的拥有人换成了我的同事,把锅甩给同事,这样就很恶心,当然现实中基本不会出现这种情况,而且命令的执行是可以追溯的,这里只是举一个极端的例子。就像我们给别人东西,别人也是有拒绝的权力呀,不然我给别人什么别人都得要的话,这个世界就乱套了
不过凡事都有一个例外,别忘了root是不受约束的,你文件拥有者做不到,我root可是能做到,root想把文件的拥有者改成谁就可以改成谁
chown user file/dir -r递归修改(是目录的话就要加上)
如下图,root通过命令 chown,把practice.txt的拥有人改成了langyu
文件的所属组与文件的拥有者略有区别
root用户和文件的拥有人都可以修改文件的所属组,但前提是该拥有人需要在要修改的组里
chgrp group file/dir -r递归修改 (是目录的话就要加上)
文件及目录的匹配优先级
当你使用文件时,系统会判断你有没有对这个文件的权限,三种角色,当你对这个文件只有一个角色时,那就匹配对应的角色
但会出现拥有两个角色的情况,当你是文件的拥有者,且文件的所属组是你的主组时,那么你既有拥有者的权限,也有所属组的权限,这个时候会涉及到优先级的问题,Linux的优先级如下
1.先匹配拥有者的权限(不是拥有者才会向下匹配)
2.再匹配所属组的权限
3.最后是其他人的权限
关于权限的知识扩展
1.要复制一个文件,需要r权限,需要对文件所在的目录有x权限
2.重命名某文件需要有该文件所在目录的w权限
3.目录的权限是层层控制的,上一级目录对下一级目录里的内容并没有权限的
4.Linux规定,目录的起始权限是777,普通文件的起始权限是666(这个扩展可能会略绕,不明白可多看几遍,以下内容皆是讲解扩展4)
到上面那张图片,你可能会说我是个臭骗子,不是说好目录的起始权限是777嘛,那不应该是 rwx rwx rwx 你看看新创建的那个test.1目录的权限明明是 rwx r-x r-x 也就是755,还有test.2的权限,起始的是666嘛,那就该是 rw- rw- rw- 怎么变成了 rw- r-- r-- 也就是644了
莫慌,Linux确实是这样规定的,但并不代表最终生成的权限就是如此了,接下来请我们的另一个主角umask,umask是权限掩码,在掩码中出现的权限就必须在起始权限中去掉,输入命令umask就可以查看你的umask值,共四位数字,暂时忽略第一位数字
什么意思呢?看上图,我的umask码默认是0022,忽略第一位,取002,上面我们说过,在掩码中出现的权限都要去掉,我们将这三位掩码换成二进制表示就是 000 010 010 ,去掉掩码中的权限,那将掩码值按位取反不就是想要的嘛,掩码按位取反后变成 111 101 101,将取反后的掩码再与起始权限按位与,就能得到最终的权限
这下再看看,是不是和test.1 ,test.2的权限就对应上了,umask的值是可以更改的,通过命令 umask 0002 就将umask的默认值改成了 0002
粘滞位
什么是粘滞位
在解释粘滞位的概念时,我们要事先了解粘滞位的使用场景,Linux是多用户操作系统,在一些情况下,我们需要一个公共的目录,该系统上所有的用户都能对该公共目录进行操作,在公共目录上创建一个文件,所有的用户都能够看到这个文件,并且对文件进行修改
比如某开发组在进行日志记录时规定,某某成员对系统内的文件进行了修改,修改了什么,怎么修改的,都要记录到公共目录里的日志文件里,因为是公共目录,所以大家都可以记录自己今天干了某某事
那么这个公共目录应该由谁来创建呢?显然我们普通用户是没有那么大的面子的,这种体现权力的事显然是要交给root来处理的,那Linux有没有默认的公共目录呢?答案也是有的,我们Linux的tmp目录就是一个公共目录,看下图,tmp目录的权限被拉满了,就是所有用户都拥有对tmp目录的读写权限
接下来我用root创建一个公共目录test,并在里面创建一个文件hello
随后我切到普通用户上,然后直接把hello文件给删掉了,我这个普通用户并没有对hello文件的修改权,为什么我能够删掉root创建的hello文件呢?事实上删除某目录内的文件是对目录的内容进行修改,这需要用到修改目录的权限,而不是修改文件的权限,而这个目录又是公共目录,任何人都能对目录里的内容进行修改,所以我这个普通用户就能随便删掉 hello 文件,可见我们在拥有修改公共目录里文件的权限时,也会带来一定的隐患,可以随便就把别人的文件给删掉了,那能不能在保有修改目录内容的权限的同时不能够删掉别人的文件呢?这就请出来我们的主角粘滞位了
如何设置粘滞位
粘滞位就是为了防止在公共目录乱删别人文件,那么如何设置粘滞位呢?
操作起来也挺简单,只需要用root对公共目录 test 执行命令 chmod +t test,就可以将公共目录test设置粘滞位了,设置粘滞位之后,就不能乱删别人的文件了
设置粘滞位后,其他人原来的执行权限就由 x 变成了 t ,表示该公共目录被设置了粘滞位