上期我们学习了使用Linux的基本指令,现在已经能初步使用Linux这个系统了。本期进一步讲解,拨开权限的迷雾。
多用户
我们了解过,Linux是一个多用户系统,但对这个“多用户”不太了解。
用户方面,只有三种用户:
- root 超级管理员 (不受任何权限约束)
- 加入“sudoers”的“白名单用户”
- 普通用户
那如何切换用户呢?
su
是什么
用于切换用户的命令。
怎么用
su [用户名]
- root 切换到 其他用户:直接切
- 非root用户之间的切换:输入要切换至的用户的密码
- 回到上个用户:exit/[ctrl+d]
怎么切换你说完了,但是什么是加入sudoers的“白名单用户”我还不知道呢?
我们需要先了解 “sudo” 这个命令。
sudo
是什么
用来短暂提权的命令。
怎么用
sudo [root才能执行的命令]
-
sudo + 命令:提权执行命令
-
sudo -i:sudoer切换到root用户(输入sudoers的密码)
*sudo过后一小段时间提权才失效
有了以上了解,可以大概明白,sudoers就是可以执行sudo的人。
【那怎么成为sudoer呢?】
打开 /etc/sudoer,找到对应位置,添加用户名。具体的操作见下篇基本开发工具
权限是什么意思?
简单理解:某个人能不能做某件事。
如,在某视频app上,你不是会员,就不能看“VIP专属电影”。
有了前面的基础,Linux下的权限就好理解多了。
研究Linux下的权限,首先要明确Linux的设计哲学:一切皆文件! 那么谈论Linux下的一切权限,就都是在谈论对文件的权限!
文件的权限又是什么呢?我们讲过:文件 = 文件内容 + 文件属性。“文件属性”就是本篇要谈的。但除了“文件属性”,还有一个重要的点:用户身份
所以权限的意思迁移到Linux下,就是:
Linux下的权限 = 用户身份 + 文件属性
意思就是,某个身份对某个文件有没有r/w/x的权限
用户身份
分三种:
- owner:文件/目录的拥有者
- grouper:文件/目录的所属组
- other:除了owner和grouper外的其他人
*身份的匹配从左到右(owner => grouper,你无法同时拥有两个身份
【为什么有所属组?】
为了团队协作:只有拥有者和其他人,太绝对,团队协作类的事情就做不了。
【怎么理解所属组?】
比如,你给家里买了台电脑,家里的人都能用,但是外边的陌生人不能随便进来用。你就是owner,家人就是grouper,外边的人就是other。
文件属性
文件属性分为 文件类型 和 文件权限值
文件类型
注意,Linux系统本身不用后缀名作区分,但是不排除有些软件会用,而且写后缀名也易于区分,所以还是写上。
文件权限值
权限的意义
- 文件
- 文件的读:读文件的内容
- 文件的写:向文件写内容
- 文件的执行:执行文件
- 目录
- 目录的读:查看目录下内容
- 目录的写:在目录下创建内容
- 目录的执行:进入目录(cd)
这些意义理解记忆。
【为什么可以用二进制表示?】
因为权限这东西只有两种状态:有/无。所以可以用1/0分别表示有/无。
而八进制就是由二进制转换来的:1个二进制位 = 3个八进制位(可以快速计算:[读=4] + [写=2] + [执行=1] = 7)
结合文件属性和用户身份来理解
- owner(bacon)对目录dir,有rwx权限
- grouper(bacon)对目录dir,有rwx权限
- other对目录dir,有r和x权限
- owner(bacon)对普通文件file,有rw权限
- grouper(bacon)对普通文件file,有rw权限
- other对普通文件file,有r权限
Linux是多用户的系统,不同身份不同权限更利于安全管理。
设置文件权限方面,我们可以设置 某身份对文件的权限 和 文件所属的身份。
设置某身份对文件的权限
什么是某身份对文件的权限?
怎么设置呢?
chmod
是什么
是用来修改某身份对文件的权限的指令。
怎么用
- chmod [身份][+/-][权限标识符] [文件名]
- chmod [八进制表示] [文件名]
- 身份
- u:拥有者(owner/user)
- g:所属组(grouper)
- o:其他人(other)
- a:所有人(all)
设置文件所属的身份
什么是文件所属的身份?
怎么设置呢?
chown & chgrp
是什么
chown:修改文件的owner
chgrp:修改文件的grouper
了解怎么用之前,我们先想想:给别人一个东西的时候,需要经过别人的同意吗?
1˚“不用吧,我给你打1个w,还需要经过你的同意吗?”
2˚ “臭家伙,来!臭掉的牛奶,喝!”
保险起见,还是需要的……
但是每次要改一下owner就要发送请求,直到预备owner同意,才能改好,那不是太费劲了吗?
这时候root来了:”你们这也太费劲了!都闪开,我来改!“
当root没空,就sudo:“root大哥让我来办点事……”
怎么用
chown [要修改至的用户名] [要修改的文件名]
chgrp [要修改至的用户名] [要修改的文件名]
没有choth?own和grouper变了,other自动变,而且other也不需要专门改。
我们创建一个文件(目录/文件)的时候,它默认的权限是这样的:
那为什么是这样呢?
文件的默认权限由两个东西决定:文件/目录设定的默认权限 + 权限掩码。
默认权限
- 文件的默认权限:666(为什么就没执行?因为大多普通文件本来就不具有可执行属性)
- 目录的默认权限:777(默认可以查看、创建、进入)
也不对啊,有一些权限是没有的啊。是因为有权限掩码……
权限掩码umask
是什么
用来“掩盖”掉原权限的一串码。
umask中出现的,在原权限的对应位置去掉
这样讲有点抽象,放到实例中看看
怎么用
作指令:
-
umask:查看当前权限掩码
默认的umask是002(第一个0是为说明后面的数是八进制数),也就是默认去掉other的写权限。
再次看看“刚出炉的文件”权限值对了没:
-
目录的默认权限是777 = rwx rwx rwx,umask是002 = --x
umask出现的地方对应去掉 rwx rwx rw**-** ,这就对了
-
文件的默认权限是666 = rw- rw- rw-,umask是002 = --x
umask出现的地方对应去掉 rw- rw- r**-** - ,这就对了
-
-
umask xxx:修改权限掩码为 xxx
我们把umask设置成222,代表每个身份都“掩盖”掉w(写权限),果然成功。
【umask是怎么实现“掩盖”的?】
直接相减?
目录的默认权限“掩盖”时直接相减:777 - 002 = 775(other可读可执行)?并不是。
那是怎么操作的?
位运算:xxx & (~umask)
- umask要“掩盖的”是1,取反后,要“掩盖”的是0
- 或——0是老大,有0的地方都变成0
多人协作时,常常创建一个共享的tmp文件夹,用来管理各自的临时文件。那这个tmp,应该设置什么样的权限呢?
777,每个人都能读写执行看起来就挺不错的,真的吗?
万一我的代码写得好,别人把我代码移到自己的目录了咋办?万一别人看我不爽,把我代码删了咋办?
粘滞位这不就来了嘛~
是什么
是一种权限,使得只有root和owner可以 移动/删除文件。
怎么用
粘滞位设置给谁呢?文件?不是的,互删文件的错误由目录产生,所以给目录设置粘滞位——粘滞位是一种目录权限
可以看到,可执行权限的位置被改成了 t,这就代表这个目录被设置了粘滞位
此时切换用户,user不是owner或者root,所以就算他气急败坏地“rm -rf *”,也没用。(嘻嘻嘻
Linux下的权限是一个关键概念,如有讲得不透彻、不清楚,或有错漏之处,望请斧正!
本期的分享就到这里啦,这里是培根的blog,期待和你共同进步!