Linux用户管理及权限控制
正文开始@Assassin
1. linux权限的概念:
在Linux下有两种用户,分别是超级用户(root)和普通用户。超级用户 root 可以在Linux下做任何事情,几乎不受限制,而普通用户一般只能在自己的工作目录下(/home/xxx)工作,以及在系统上做有限的工作;
举个不恰当却不争的栗子,所谓的权限的概念都是用来限制普通用户的,而超级用户几乎不受限制。普通用户是权限的约束者,超级用户是权限的制定者
在linux系统中,默认普通用户的命令提示符是 " $ ": 在linux系统中,超级用户 root 默认命令提示符是 " # ": 强烈建议不要把普通用户的passwd设置成跟root相同,切换用户时可能会出现认证失败的情况;在便于区分和管理的层面上来讲,也应该区分root密码跟普通用户密码
2. 用户账号之间的切换:
我们普通用户在进行日常操作时可能会遇到权限不足的问题,需要从普通用户切换到超级用户,进而完成某些相对谨慎的操作;
2.1 普通用户之间的切换:
语法: su -?username 功能: 实现用户之间的切换 普通用户之间的用户切换需要输入切换目标的passwd
2.2 普通用户与root之间的切换:
语法: su -?username 功能: 实现用户之间的切换
普通用户 -> root:需要root密码 root -> 普通用户:不需要密码 小贴士:
- ① 从普通账号切换为root账号时,指令当中的root可省略,因为root账号只有一个,默认就是为root
- ② 切换用户后,若想切回上次的用户,可通过Ctrl+D实现,Ctrl + D也就相当于 exit / logout
- 切换用户时也可不带 " - ",这种切换方式不会改变当前目录,而带 " - " 的切换方式会默认处于当前用户的工作目录 " ~ ",推荐使用带 " - " 的切换方式
" - " 后面不带用户名,默认是切换为 root 切换用户时不加 " - ",不会改变用户的当前目录: 切换用户时带上 " - ",会默认处于当前用户的工作目录: 推荐后者。
快速切换为前一个用户:Ctrl + D / exit / logout
3. 提升当前用户的权限:
在处于普通用户进行工作时,会遇到有些指令权限不足,不可执行的情况: Permission denied 倘若这时候你不想切换成root或者你压根没有权限使用root(事实上,在公司中一般都接触不到root),这个时候就可以使用 sudo 提升当前用户的权限 (root体验卡): 语法: sudo?[指令] 功能: 提升当前的用户的权限,使其有权限执行该命令
例如,我现在要以一名普通用户的身份,修改另一个普通用户的账号密码: 输入passwd后便修改了该用户密码
如果是第一次使用sudo的话(没有被添加到信任列表),大概率会遇到这种情况:以xiaoming为例,我的xiaoming用户没有被添加到信任列表 xiaoming is not in the sudoers file.
xiaoming想修改Assassin的密码,该操作直接被拒绝了
提示没有被超级用户(root)添加到信用列表当中,所以当前用户的的权限得不到提升,只有当被超级用户添加到信任列表后,才拥有提升当前用户权限的能力
4. 将普通用户添加到信任列表:
切换到root用户或者一个具有sudo权限的普通用户,此时有权利将另一个没有root权限的普通用户添加到信任列表,例如我这里直接用Assassin直接进行演示了,因为我的Assassin用户具有sudo权限(当然用root肯定是毫无问题的~)
用vim打开sudoers文件:
[Assassin@Ninghai ~]$ sudo vim /etc/sudoers
底行模式下set nu:显示出行号 命令行模式下输入:/root 快速找到修改位置 将xiaoming按照相同格式填入即可: 底行模式输入 wq!强制保存退出over
测试此时xiaoming是否具有sudo权限:不然呢[doge]
5. Linux权限管理:
文件访问者的分类(可以类比人)
对于用户来说,权限可以将用户分为三大类:
- ① 文件和文件目录的所有者(文件拥有者)
- ② 文件拥有者所在的组的用户(文件所属组)
- ③ 其他用户(others)
我们听过一个说法,在linux中一切皆文件,所以linux中的权限管理可以统一到对于文件的管理
对于多用户,多任务的Linux来说,文件和目录的权限管理非常重要。在Linux中目录是一种特殊的文件,这里将文件和目录统称为文件;文件权限就是指对文件的访问控制,决定哪些用户,哪些组对文件具有哪种访问权限
对于文件自身来说,访问权限也分为三大类:
- ① 可读 read ( r )
- ② 可写 write ( w )
- ③ 可执行 execute ( x )
那么对文件权限管理,就包括这两个方面,即文件的访问者身份和不同身份对文件的访问权限
小贴士:
- 对于某一文件而言,其拥有者,所属组和other就是由超级用户(root)和其他普通用户所扮演。
- 在Linux当中,所有用户都要隶属于某一个组,哪怕这个组只有一个用户,一人即一组(此时该组就以该用户名为组名)
为啥在linux中会有组(group)这个概念呢? 按理来说一个独立的用户便可以确定一个文件的所有者,这已经保证了文件所属的唯一性,多出来的组的概念是否显得有点多余了??
个人认为这应该是为公司内部开发竞争所考虑的,例如在某个公司当中有两个小组团队(A组、B组)在同一个Linux服务器上进行着同一款项目的开发(赛马模式),做出一个项目当然得是团队合作,所以说每个人完成的工作都需要汇总或者其他人修改完善,这就意味着一个团队里的资源时共享的,而需要跟其他团队有竞争的需求,这就意味着不同团队的资源时相互不可见的,这大概就是组(group)的概念⑧,btw,微信团队好像就是这么做出来的~~
引入所属组这个概念,能够很好地将组内跟组外分隔开,组间资源私有,而组内资源共享;所以所属组的存在是为了更灵活的进行权限配置,满足团队协作
具体看一下文件的具体信息:
[Assassin@Ninghai py_code]$ ll
ls -l会列出文件的所有者和所属组,至于others,不是所有者也不是所属组的用户就是others了
5.1 文件类型和访问权限:
权限涉及到某个具体的事物来说,我们还需要讨论事物本身的属性;对于文件来说,我们应该讨论其文件类型,以及是否具有可读、可写和可执行的属性。
使用指令ll,我们可以看到前面有一串字符,这串字符实际上就代表着该文件的类型和属性 这串字符由10个字符组成;其中第一个字符所代表的就是该文件的文件类型 不同的字符代表不同的文件类型:
- 1)-:代表普通文件
- 2)d:代表目录文件
- 3)l:代表链接文件(类似于Windows当中的快捷方式)
- 4)b:代表块设备文件(例如硬盘、光驱等)
- 5)p:管道文件
- 6)c:字符设备文件
- 7)s:套接口文件
小贴士: 在Linux当中,文件类型与文件后缀无关,linux文件的唯一标识符为inode
剩下的9个字符每三个为一组,分别代表该文件相对于其拥有者、所属组以及others是否拥有某种属性: 每一组的三个字符的第一个字符代表该文件是否具有可读 r 属性,第二个代表是否具有可写 w 属性,第三个代表是否具有可执行 x 属性 若是具有可读属性,则第一个位置的字符为r;若是具有可写属性,则第二个位置的字符为w;若是具有可执行属性,则第三个位置的字符为x。若某一位置为字符 - ,则说明不具有对应位置的属性;
以test.cpp为例:test.cpp文件是一个普通文件,该文件的拥有者和所属组均是Assassin;文件的所有者和所属组对其都是可读可写的,但该文件的others对其只有读的权限;
5.2 文案权限值的表示方法:
① 字符表示方法: ls -l 指令打印文件权限值时的表示方法就是字符表示法,如下图所示:
字符表示法 | 说明 |
---|
r - - | 仅可读 | - w - | 仅可写 | - - x | 仅可执行 | r w - | 可读可写 | r - x | 可读可执行 | - w x | 可写可执行 | r w x | 可读可写可执行 | - - - | 无权限 |
② 八进制数值表示法: 字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示,如下图所示:
字符表示法 | 二进制 | 八进制数值表示法 | 说明 |
---|
r - - | 100 | 4 | 仅可读 | - w - | 010 | 2 | 仅可写 | - - x | 001 | 1 | 仅可执行 | r w - | 110 | 6 | 可读可写 | r - x | 101 | 5 | 可读可执行 | - w x | 011 | 3 | 可写可执行 | r w x | 111 | 7 | 可读可写可执行 | - - - | 000 | 0 | 无权限 |
5.3 修改文件访问权限:
5.3.1 更改文件的访问权限:
语法: chmod?[参数]?[权限]?[文件名或目录名] 功能: 设置文件的访问权限 常用选项: -R 递归修改目录下文件的权限
chmod指令权限值的格式: 格式一: 用户符号 +,-,= 权限字符
- 1)+:向权限范围增加权限代号所表示的权限
- 2)-:向权限范围取消权限代号所表示的权限
- 3)=:向权限范围赋予权限代号所表示的权限
用户符号:
- 1)u:所有者
- 2)g:所属组
- 3)o:others
- 4)a:所有用户
还是以test.cpp为例:为test.cpp的others加上写和执行权限 当需要设置不同类用户的访问权限时,则需用逗号隔开,如下: 格式二: 三位八进制数字 将对应的八进制数转换为二进制,进而设置对应权限值;
5.3.2 更改文件的所有者:
语法: chown?[参数]?[用户名]?[文件名或目录名] 功能: 修改文件的所有者 常用选项: -R 递归修改目录文件的所有者
小贴士: 修改文件的所有者或所属组需要 root用户 进行操作,若是普通用户则需要进行sudo权限提升 chown指令也可以同时修改文件的所有者和所属组,只需要将所有者和所属组的用户名用冒号隔开即可:以dir目录文件为例
5.3.3 更改文件的所属组:
语法: chgrp?[参数]?[用户名]?[文件名或目录名] 功能: 修改文件的所属组 常用选项: -R 递归修改目录文件的所属组
5.4 修改文件的掩码:
新建的文件或目录都有着自己默认的权限,一般来说新建文件或目录的权限是固定的,普通用户与root用户文件文件或目录默认的权限不同; 实际上,新建文件的默认权限为0666,新建目录的默认权限为0777;其中第一位的0与特殊权限有关,不必深究,而后面三位就是权限的八进制数值表示方法,将其翻译为字符表示方法: 但是我们发现实际上所创建出来的文件和目录的权限值并不是所翻译出来的值,原因就是创建文件和目录的时候还要受到umask掩码的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask & (~umask) 需要注意的是:这里的 & 是按位与,~是按位取反
语法: umask?[权限值] 功能: 查看当前用户的文件掩码,加上权限值即为修改掩码值
通过umask查看当前用户文件默认掩码:可以看出普通用户的默认掩码为0002 注意umask掩码是四位八进制 因此实际创建出来的文件和目录的权限值还需要进行进一步换算才能得出,首先将掩码的后三位八进制换算为二进制,然后对其进行按位取反: 将新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是创建出来的文件和目录的权限值: 以上是普通用户文件权限的计算方法,root用户的计算方法相同,不再赘述
root默认掩码: 这里给出用户新建文件及目录的权限: root用户文件:644 root用户目录:755
普通用户文件:664 普通用户目录:775
这里根据经验可以得出一个更为简便的计算方法: 凡是在umask中出现的权限位,都不能在最终权限中出现,也就是说如果umask转换为二进制的某一位为1,那么实际权限对应的位只能为0; 举个例子: umask是可以修改的: 总结一哈:root用户的umask为0022,普通用户的umask为0002
5.5 目录权限:
普通文件的可读可写可执行的意义是显而易见的,可读也就是可以用cat more less等指令查看,可写也就是能通过vim,nano等编辑器修改并保存,可执行也就是可执行文件,如编译好的C/C++可执行程序;
而目录文件的可读可写可执行的意义并不是那么明显:
- ① 可读权限: 用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容
- ② 可写权限: 用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件
- ③ 可执行权限: 用户没有该目录的可执行权限,则无法通过cd指令进入到目录当中
这里有一个经典的问题: 只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,不管该文件的所有者是谁,甚至文件的所有者是root也能被删除,这显然是极其不合理的;为了避免这种不合理的操作,linux引入了粘滞位的概念;
5.6 粘滞位:
语法: chmod?+t?[目录名] 功能: 给目录加上粘滞位,用户只能删除目录中的所有者为自己的文件或目录
当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符 " t ": 此时进入test目录测试:test目录的所有者是root 当一个目录被设置为粘滞位,则该目录下的文件只能由:
- ① 超级用户 root 删除
- ② 该目录的所有者删除
- ③ 该目录下文件的所有者删除
小贴士: 虽然目录被加上了粘滞位,但如果用户有该目录的可写权限,则不影响其在该目录下创建文件;粘滞位只是起到防止误删的功能,目录的可写权限所赋予的创建文件或文件夹的功能不受影响~~
查阅一些博客发现有小伙伴说文件能否删除跟文件的w可写权限有关;我自己通过测试发现文件的rwx权限跟该文件能否被删除没有直接的联系,比如该文件的所有者无论有没有rwx权限都能将文件删除,不能确定该猜想是否合理,留个标记~~
突然想起文件永远是在目录中的,一个文件能否被删除在于该用户是否对目录有w可写权限,有了可写权限就能删除目录中的文件(而粘滞位的意义就是规定不是目录所有者的用户只能删除目录中所有者是自己的文件),所以猜想应该是正确的,文件能否被删除跟文件本身的rwx权限毫无关系!!
|