Linux的权限问题
引入:权限的意义是什么?
权限就是为了让人能做某些事或不能做某些事
一:Linux下的用户种类
Linux下只有两种用户:root 和 普通用户
root:拥有至高无上的权限,任何的权限都不能限制root
普通用户:会被权限限制
例子:
这是root用户 这是普通用户
Q:如何区分二者?
A:
方法一:
超级用户的命令提示符是“#”;而普通用户的命令提示符是“$”。
方法二:
root用户的家目录在根目录(/)下;
而所有普通用户的家目录,都在根目录下的home目录下(/home)
如图:
解释:采取-d是因为根目录(/)下,用ls会显示很多
解释:因为当前只有一个普通用户 所以用ls
二:用户种类之间的切换
1:普通用户切换到root
普通用户切换到root有两种方法,su和su-
①:su
解释:普通用户进行su指令操作,输入root的密码后,即可切换为root用户,且目录相对与切换之前没有改变
②:su-
解释:普通用户进行su -指令操作,输入root的密码后,即可切换为root用户,且目录会更换到根目录下的root目录
总结:
su-:以root身份重新登录。所以目录会变
su:切换到root身份,所以目录不变
2:root切换到普通用户
①:su
解释:root进行su指令操作,可以直接切换成普通用户,不用输入密码
3:普通用户切换到普通用户
①:su
解释:普通用户之间的切换,输入想要切换到的普通用户的密码即可
三:指令提权
语法: sudo 指令
功能: 提升当前指令的权限。
假设我只是一个不知道root密码的普通用户,但我在执行某些指令的时候,又要用到root的身份才行,那怎么办,进行指令提权即可!
指令提权:提升当前指令的权限,不必切换到超级用户。
场景:普通用户wtt1想修改普通用户wtt2的密码
解释:
第一步:我们直接以普通用户wtt1的身份进行passwd wtt2 修改的时候,是不可以的,显示只有root用户才能这样做
第二步:我们进行sudo提权的时候,先让我们输入了进行sudo提权的普通用户wtt1的密码,然后我们就可以输入wtt2的新密码了!达到了指令提权的效果
Q:为什么要先输入wtt1的密码
A:因为进行sudo提权需要记录下来是谁在提权,毕竟sudo有可能进行有风险的操作!
Q2:那岂不是人人需要权限的时候,sudo一下就可以了,还要什么root?
A2:并不是,能sudo的用户都是被root加入到类似白名单(sudoers file )里面的用户,而没被加入的,无论如何都无法sudo,如下(非白名单(sudoers file )里面的用户 无法进行sudo提权)
解释:显示wtt2不是sudoers file 里面的用户,所以无法进行提权操作!
总结:只有被root信任的人,才能被放进sudoers file 里面,才能sudo操作
而如何把一个普通用户放进sudoers file 中,暂不解释,下一章会讲~
四:文件的权限
第四点仅谈文件的权限,目录的权限后面单独说
1:文件的角色和权限
要理解权限,看个例子:
你是一个大学的校长,你能管理学校;此时大学校长为角色,管理学校为权限。
而此时如果你不是校长,你无法管理学校;你是校长,你也无法管理校外事务。
所以要完成对应的事, 角色 + 权限 缺一不可
而对于Linux系统的文件来说,角色有三种:
u:拥有者
g:所属组
o:其他用户/其他人
权限也分为三种:
r:读
w:写
x:执行
2:所属组的意义
Q:拥有者我能理解,其他人我也可以理解,所属组是什么?其意义是什么?
A:下面举个例子。
在某个公司当中有两个小组团队(A组、B组)在同一个Linux服务器上进行着同一款项目的开发(赛马模式),而你就是A组当中的一员。
如果没有所属组的概念,那么当你创建了一个文件后,要么就是只有你自己(拥有者)能看到,要么就是其他人(other)也都能看到。而你所希望的是你自己和你的小组成员能看到,剩下的人看不到。于是就有了所属组这个概念!这时你就可以将文件设置为拥有者和所属组可见,而other不可见。所以所属组的存在是为了更灵活的进行权限配置,满足团队协作。
3:文件的属性代表的意义
所以下面来看一个文件的属性是如何体现角色和对应的权限的:
两张图展示:
解释:由图可知, 当我们ll显示一个文件的属性的时候,前面的2~10个字符,依次显示的是拥有者的权限,所属组的权限,其他人的权限,且每个角色的权限顺序都是rwx(读写执行);后面的wtt1,则是拥有者,wtt2则是所属组!其他的信息,与这里讲解东西无关,暂不了解
Q1:为什么2~9为有些字符是‘ - ’?这代表什么?
A1:-代表无此权限,比如拥有者是rw-,则代表拥有者其无执行权限,详细解释如图:
Q2:为什么o(其他人)这个角色没有显示出来?
A2:因为除开拥有者和所属组,其余的都是其他人;判断角色的时候,不是拥有者,也不是所属组,那就一定是其他用户了,所以不用显示了
4:rwx权限的演示
①:w权限的体现:
解释:我们是wtt1,为拥有者,有w权限,所以进行ehco指令的时候,会成功运行
②:r权限的体现:
解释:拥有者有r读权限,所以cat读出了刚刚写入的"hello"
相反,来看一下没有w和r权限下,强行进行w和r操作,会出现什么
场景:拥有者wtt1无r无w权限:
强行进行w和r操作:
解释:发现其报错:Permission denied(权限被拒绝)
③:x权限的演示:
x权限为执行权限,所以前提是该文件为一个可执行文件,所以我们先创建一个.c文件,用nano在文件中写入代码,然后对其gcc,使其成为一个a.out的可执行文件;然后因为生成的a.out默认带x权限,所以此时我们运行该可执行文件,会出现打印效果,如下:
此时若是a.out对于拥有者wtt1无x权限了,尽管该文件是一个可执行文件,但也无法执行:
总结:
一个文件要想能被执行,条件有两个!
1:执行的角色有x权限;2:该文件是可执行文件
到这里rwx的权限演示就完了,但有一个细节:
Q:wtt1作为拥有者,没有x权限,所以无法执行a.out,这我能理解!但是wtt1不也同时作为所属组吗?而对于所属组这个角色而言,wtt1是有x权限的啊!为什么不能执行该可执行文件?
A:因为Linux确定你的角色的时候,顺序为u拥有者,g所属组,o其他人,确认即停;所以上面确认了其是拥有者,则就停止,按照拥有者的权限来判断其是否有对应的权限!
5:root对权限的无视
场景:ugo都是无任何权限的平普通文件和可执行文件
下面探究root是否可以对这种文件进行随意操作?:
先把身份切回root
对file.c文件进行写和读操作,发现均可
再对a.out进行执行操作:
发现root竟然权限被拒绝???
此时我们root属于o角色,现在我们让o拥有x权限,再让root执行:
发现成功了
总结 :root虽然可以在linux系统下做任何事情,不受限制,但是也要遵循Linux的规则
好比 :虽然钱是万能的,但你也不能犯法
执行操作:
可执行文件的加载和执行由内核严格管控,必须满足 至少一个权限组的x
位(用户/组/其他)。这是为了防止恶意代码或错误操作破坏系统稳定性。
即使
root
强制尝试执行(如./a.out
),内核仍会返回Permission denied
。
五:更改权限
指令:chmod功能: 设置文件的访问权限格式: chmod [ 参数 ] 权限 文件名
那我们想要更改一个文件或者目录的权限,应该怎么做?
对以下文件进行更改权限:
解释:方便演示权限的增删,所以先把所有权限进行删除
1:增加权限
①:给单个角色增加权限
给拥有者加上r权限:
给拥有者加上wx权限:
值得注意的是,这里的file.c虽然有了x权限,但是wtt1照样无法执行,因为该文件不是可执行文件
②:给多个角色加上权限
给多个角色都加上了r权限:
给多个角色加满权限:
所以a代表all,即ugo角色都集体操作
2:取消权限
+换成-即可,道理类似,不再赘述
3:赋予权限
=操作即可
原本拥有者是rwx的,现在赋予了r,所以只有了r
总结:
4:八进制修改法
还有一种更简单的权限修改法,叫八进制修改法:
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。例如:
例子如下:
000 让ogu角色的权限都取消了
不一定三个数字都要写!如下:
Q为什么7和0没有匹配到拥有者和所属组,而是所属组和其他人?
A:如果提供的数字少于3位(如 70
),系统会 自动在前面补零!
总结:
八进制修改法,建议三个数字都给上;而单个角色的权限修改,还是建议使用老方法符号模式来修改
六:更改角色
指令:chown
功能 :修改文件的拥有者格式 : chown [ 参数 ] 用户名 文件名常用选项: -R 递归修改目录文件的拥有者指令: chgrp ->修改文件的所属组
场景:一个普通用户wtt1对自己拥有的文件,进行角色的更改
1:进行拥有者的更改
解释:操作不被允许,因为普通用户即使拥有一个文件,也无法更改其拥有者。
-
如果普通用户可以随意更改文件所有者,可能会导致:
-
恶意用户 将系统关键文件的所有者改成自己,提权攻击。
-
普通用户 误操作导致文件归属混乱,影响系统安全。
-
2:进行所属组的更改
解释:发现还是不行,这里的不行,不是一定不行,wtt2是所属组的成员,就可以修改成功,但现在wtt2不是所属组的成员
3:进行其他人的修改
没有此操作, 其是随着o 和 g 的角色的变化而动态变化的
4:sudo提权才能更改角色
我们wtt1是sudoers file里面的成员,所以我们sudo一下:
发现sudo成功更改拥有者角色
发现 sudo成功更改所属组角色
Q:为什么第二次wtt1去sudo不用输入wtt1的密码?
A:因为短期内的连续sudo,只用输入第一次密码
也可以仅用chown取修改多个角色:
总结:
chown就能完成角色的更换,一般chgrp不常用
七:文件类型
指令:file功能说明 :辨识文件类型。语法 : file [ 选项 ] 文件或目录 ...
1:第一个字符的意义

所有类型如下:
-:普通文件(文本,源代码,图片,视频,库,可执行程序等)
d:目录
b:块设备文件
c:字符设备文件
l:链接文件
p:管道文件
s:socket文件
目前常用的就是d(目录)和-(普通文件)
所以,在Linux中文件类型是第一个字符来表示,不像windows中的后缀表示,但是这不意味着Linux中无后缀以及后缀无作用
2:后缀的重要性
体现后缀作用的场景:
当我们想把一个文件进行gcc,使其成为一个可执行文件的时候,那这个文件必须是.c后缀的,所以下面演示对一个不是.c后缀的文件,企图进行gcc操作的后果,以此体现后缀的重要性:
解释:报错:file.txt
不是有效的可执行文件或目标文件
那我们把file.txt改为file.c,再进行gcc操作:
解释:用mv操作修改名字,让其后缀为.c,然后gcc可以生成可执行文件; 准备gcc编译的时候 只能对.c文件进行编译 所以gcc这个工具需要后缀
但是该文件现在已经是可执行文件了,那你可以随便改后缀,照样可以执行,所以这里的a.out随便改名字都可执行:
解释:mv操作让a.out改名为file.2,依旧可以执行该文件,呈现代码所示的打印效果
总结:推荐使用后缀,①:某些工具需要后缀 ②:肉眼看起来更明确
3:file指令的作用
对刚刚的file.2文件仅file指令:
解释:显示信息为:file.2是一个可执行文件(精华部分)
file对于链接类型的文件,有很显著的效果!如下4
4:file指令对链接类型文件的作用
场景:在一个深度很深的地方有一个可执行文件a.out
我不想每次都进入该目录,才能执行该文件a.out,所以我在一个常用的目录下用一个文件mycode链接到该可执行文件a.out,此时我执行mycode文件就OK了;所以我在root目录下就进行链接指令操作:
解释:ln -s 指令是链接指令,此时会发现生成的mycode文件的第一个字符是l了,即链接文件
然后在root目录下就可以执行mycode文件,和a.out是一样的效果:
演示file指令对mycode的效果:
解释:非常详细的呈现了mycode是链接到那个目录下的文件的
5:root对目录权限的无视
不再演示 与文件权限中类似
八:目录的权限
之前在第四点中,介绍了文件的权限,现在介绍目录的权限,目录的权限依旧和文件类似
角色:u拥有者 g所属组 o其他人
权限:r读 w写 x执行
但是,在目录中,却有所不同:
r:能查看该目录下的文件/目录的属性信息
w:能在该目录下创建/删除文件或目录;能更改该目录下的文件或目录的属性(权限)
x:能否进入目录
场景:一个目录dir中有一个目录dir1和一个文件file.txt;dir属于一个普通用户wtt1
1:目录的r权限意义
此时我们去掉目录对于拥有者wtt1的r权限
意味着wtt1不能查看该目录下的文件/目录的属性信息:
解释:不管是在dir的上级目录对dir进行ll,还是cd进入dir,再进行ll,都无法查看dir目录中的文件或者目录的属性
2:目录的w权限意义
此时我们去掉目录对于拥有者wtt1的w权限
意味着不能在该目录下创建/删除文件或目录
解释:因为有x权限,所以我们是可以进入dir目录的,但由于无w权限,所以无法创建目录或文件
3:目录的x权限意义
此时我们去掉目录对于wtt1的x权限
意味着wtt1不能进入该dir目录:
解释:报错操作不被允许
总结:
r:能查看该目录下的文件/目录的属性信息
w:能在该目录下创建/删除文件或目录;能更改该目录下的文件或目录的属性(权限)
x:能否进入目录
九:文件能否被删取决的因素
场景:root用户在普通用户wtt1的目录下创建一个文件,其该文件权限为000,请问wtt1能删除root所创建的文件吗?
如图:
dir的拥有者是wtt1,file.txt是root创建的文件,且权限为000:
此时能确定的是,wtt1对于该文件的角色为其他人,所以rwx都无权限:
解释:wtt1的rwx操作都不被允许
那普通用户wtt1直接删除root创建的file.txt可以吗? 如图:
解释:可以删除
总结:一个文件是否被一个用户删除,和该文件无关,而是取决于该用户是否拥有该文件所属目录的w权限!
因为拥有一个目录的w权限,代表你可以对该目录下的东西进行自由的删除,创建!
这和第八点中讲的一致
你root来我家,占用一个房间,不让我进(x),不让我看(r),不让我动(w),但我可以直接打包你的东西全扔了(rm)
Q1:root这种行为对吗?
A1:不对!你不该进入别人的家目录进行创建自己的文件和目录!
Q2:root这种行为怎么避免?岂不是人人都可以进我的目录为所欲为?
A2:不用担心,任何普通用户的家目录都只有自己能够进入,如果你root强行进入创建自己的文件,那我删了就是。所以对于普通用户他进不来,对于root用户,进来了也可以删~
十:tmp目录
如果两个普通用户要在一个目录下实现文件共享呢,但现在彼此又进不了对方的家目录,怎么办?
Linux提供一个叫作tmp的目录,该目录专门用来让用户之间进行文件的共享的!
解释:tmp目录位于根目录(/)下
1:粘滞位
Q:tmp第十个字符 t 是什么意思?
A:t叫粘滞位,在保留x的功能上,同时让此目录里的文件,只有root和文件的拥有者才能删除,所以可以放心的进行共享!不用担心,别人删你的文件。
总结:
当一个目录被设置为 " 粘滞位 "( 用 chmod +t), 则该目录下的文件只能由一、超级管理员删除二、该目录的所有者删除三、该文件的所有者删除
十一:权限掩码
指令:umask
作用:查看设备的权限掩码
我们创建一个文件或目录的时候,会发现每次创建其的权限2~10位是固定的,这叫默认权限:
Q:为什么目录默认权限是rwx rwx r-x?为什么文件默认权限是rw- rw- r--?
1:权限掩码
解释:0002的后三位002就是权限掩码!
2:起始权限
任何设备在Linux下的文件和目录的起始权限一定是一致的:
文件起始权限:666( rw- rw- rw-)文件不能进入,所以三个x无
目录起始权限:777(rwx rwx rwx)
3:运算法则
公式:起始权限&(~umask)= 默认权限
运算过程如下: