Linux权限
Posted aaaaaaaWoLan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux权限相关的知识,希望对你有一定的参考价值。
文章目录
Linux权限的概念
Linux下有两种用户:超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令: su [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su
root(root可以省略),此时系统会提示输入root用户的密码口令。
Linux权限管理
文件访问者的分类(人)
文件和文件目录的所有者: u—User
文件和文件目录的所有者所在的组的用户: g—Group
其它用户: o—Others
举个例子:一个公司有A、B两个小组需要完成同一个任务,但公司只有一台服务器,A小组的张三自己写了一些代码后,不想给B组的成员看,所以就有了User和Others的区别,Others不能查看张三写的代码。但同时,A组的其他人也不能查看该代码,所以有了Group,Group内的人有权限查看代码或修改代码,所以Others就是除了User和Group外的人。
超级用户、普通用户与文件访问者(User/Group/Others)是不冲突的,比如我们在家里是主人,在公司是员工,有着不同的权限。
文件类型和访问权限(事物属性)
此时我们就可以解释ls指令时,文件信息对应的是哪些属性了
文件权限这一组中,共用9个字符(不包括.
)。
三三为一组,第一组为User的权限,第二组为Group的权限,第三组为Others的权限
a) 文件类型
d:文件夹
-:普通文件 (源代码,图片,动静态库,可执行程序,视频音频)
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
b)基本权限
i.读(r/4): Read,对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
ii.写(w/2): Write,对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
iii.执行(x/1): execute,对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
iv.“-”表示不具有该项权限
文件权限值的表示方法
1)字符表示方法
-
表示不具有相应的权限
Linux 表示 | 说明 | Linux表示 | 说明 |
---|---|---|---|
r– | 只读 | -w- | 仅可写 |
–x | 仅可执行 | rw- | 可读可写 |
-wx | 可写和可执行 | r-x | 可读可执行 |
rwx | 可读可写可执行 | — | 无权限 |
2)8进制数值表示方法
1表示有权限,0表示无权限
r w x分别对应三个二进制位,范围在0-7,所以可以用八进制表示
权限符号(读写执行) | 八进制 | 二进制 |
---|---|---|
r– | 4 | 100 |
-w- | 2 | 010 |
–x | 1 | 001 |
rw- | 6 | 110 |
r-x | 5 | 101 |
-wx | 3 | 011 |
rwx | 7 | 111 |
— | 0 | 000 |
文件访问权限的相关设置方法
a)chmod
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
- R -> 递归修改目录文件的权限
- 说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限值的格式
① 用户表示符+/-/=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
实例:
chmod u+w /home/abc.txt 给拥有者增加对abc.txt的写权限
chmod o-x /home/abc.txt 给其他用户增加对abc.txt的可执行/进入权限
chmod a=x /home/abc.txt 设置所有用户对abc.txt的权限为可执行
将abc.txt的所有权限设置为无:
执行chmod u+w /home/abc.txt
此时abc.txt的user就拥有了对其读的权限
执行chmod o+x /home/abc.txt
此时abc.txt的others就拥有了对其执行的权限
执行chmod a=x /home/abc.txt
此时所有的访问者类型都被设置成了对abc.txt只有执行的权限
②三位8进制数字
实例:
chmod 664 /home/abc.txt
chmod 640 /home/abc.txt
664:6对应的二进制形式是110,4对应的二进制形式是100,所以第一个6表示user的权限是110,即可读可写(rw),但不可执行/进入;第二个6表示group的权限与user相同;4表示其他用户的权限是只读®,不可写和执行。
640:同样,6对应的二进制形式是110,4对应的二进制形式是100,0对应的二进制形式是000。所以6表示user的权限是110,即可读可写,但不可执行/进入;4表示所在组的权限是只读,不可写和执行;0表示其他用户不具有任何权限。
b)chown
功能:修改文件的拥有者(user)
格式: chown [参数] 用户名 文件名
**注意:**根据上文所说的,只有文件的拥有者和root才可以改变文件的权限 。一般我们修改文件的拥有者是无法直接成功的,因为这个文件是其他人的,我们要先经过别人的同意,才能拥有该文件。所以在指令前加上sudo,表示权限的提升,输入后一般要再输入原拥有者的密码。
比如下面,我们看到test.c的user是ysj,现在想把它改为root
如果我们直接输入chown root test.c
,结果会失败:
所以要加上sudo,下面第二行就是输入原拥有者ysj的密码,密码正确后即可完成拥有者的转换。
此时test.c的user就变成了root
实例:
sudo chown -R root test 将目录test的所有内容的拥有者递归改为root,如果不用-R,则只会改变test的拥有者
关于sudo
可能我们使用sudo时会出现这种情况:
这种情况需要在sudoers信任组中加入我们自己
操作步骤:
-
先按
su
,输入密码后,进入root身份 -
如果有安装vim,则输入vim/etc/sudoers;否则,输入vi /etc/sudoers。注意:vi后要加一个空格
1、2的步骤:
-
进入sudoers后,输入
:
,再输入set nu,显示行号: -
再用向下的方向键,翻到大概106行的样子,找到以下段落:
-
先输i,看见左下方出现后,输入
ysj ALL=(All) ALL
,当然ysj是我需要添加的用户名,你只需要改成你自己的用户名即可。 -
再按Esc,输入
:w!
,再输入:q
,就完成了
c)chgrp
功能:修改文件或目录的所属组
格式: chgrp [参数] 用户组名 文件名
常用选项:
-R 递归修改文件或目录的所属组
实例:
chgrp users /abc/f2 将/abc/f2的所属组改为users
d)umask
功能:
查看或修改文件掩码
新建文件夹默认权限0666
新建目录默认权限0777
我们暂且先不管第一位的0是什么意思。
验证一下:
创建一个新的tmp.c的普通文件和tmp的目录,他们的默认权限如下:
根据上面的8进制数值表示方法表,rwx rwx r-x对应的三个8进制数字为775,rw-rw-r–对应的三个8进制数字为664,那么疑问来了,为什么不是777和666呢?这就要引入我们的umask
了
假设默认权限是mask
,则实际创建的出来的文件权限是: mask & ~umask
运算比较复杂,我们可以理解成去除umask中的权限
格式: umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用
户默认为0002。
上面验证中,我们就是以普通用户的身份进行的创建,所以0775和0664就是简单的0777减2和0666减2吗?
当然不是,我们说了,是去除umask中的权限,既然umask是002,所以代表的权限就是其他人的只读,对于tmp目录,本来是拥有rwx的others,去除了只读权限,就变成了r-x。
同样,对于tmp.c普通文件,本来是拥有rw权限的others,去除了w权限,就变成了r–
我们可以将权限值修改为0003,进而观察umask对权限的影响
umask 查看权限值
umask 0003 设置 权限值为0003
0003表示的是others的w和x权限
对于tmp目录(默认权限位rwx),原来拥有rwx权限的others,去除了w和x,就变成了r–
对于tmp.c文件(默认权限为rw-),原来拥有rw权限的others,当然,它本身就没有x权限,去不去除都是-,所以去除w和x后,就变成了r–
file指令:
功能说明:辨识文件类型。
语法: file [选项] 文件或目录…
常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形
-z 尝试去解读压缩文件的内容
使用 sudo分配权限
(1)修改/etc/sudoers 文件分配文件
# chmod 740 /etc/sudoers
# vi /etc/sudoer
格式:接受权限的用户登陆的主机 =(执行命令的用户) 命令
(2)使用 sudo 调用授权的命令
$ sudo –u 用户名 命令
实例:
$sudo -u root /usr/sbin/useradd u2
目录的权限
上面说了那么多的r、w、x,我们却不知道r、w、x权限到底是什么权限,没有这些权限有什么后果呢?
- r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容
- w(Write,写入):对文件而言,具有新增,修改,删除文件内容的权限;对目录来说,具有新建,删除,修改,移动目录内文件的权限。如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
- x(eXecute,执行):对文件而言,具有执行文件的权限;对目录来说该用户具有进入目录的权限。如果目录没有可执行权限, 则无法cd到目录中
我们(我们是user)将test.c(空文件)的user权限设置为只可写:
chmod u=w test.c
说明我们对test.c可以写入内容
echo “hello” > test.c
那我们怎么知道将hello写入test.c了呢?
之前我们特地设置test.c为空文件(内存为0),所以写入hello后,内存就不为0了
我们现在了解了r和w的权限,那么x权限是干嘛的呢?上面提到了x对目录来说是具有进入目录的权限。
我们将hehe目录的user权限设置为rw-,也就是可读可写,但不可进入。
chmod u=wr hehe
所以目录hehe的权限被改成了rw-,此时就进入不了hehe了:
那么我们再多思考一下,既然我们不能进入hehe,那我们可以读或者写hehe吗?
就比如我们买了新房,但是我们没钥匙进不去,那我们还可以参观或者装修吗?
所以答案显然是,没有x权限,我们也不能对目录里的文件读或者写了
hehe中包含以下几个文件(在设置rw权限之前才可以用tree指令访问hehe,没有x权限后就无法访问了):
试图对hehe/test2进行写操作:
结果很明显,我们的行为是不被允许的
那么我们试试读取hehe/test2:
同样,还是失败了。
即使使用tree指令,hehe的子节点也不会展示:
总结:访问者没有对目录的x权限,也就意味着失去了对其中文件r和w的权限。
对于以上操作,我们都是以普通用户的身份进行操作的,如果我们以root的身份操作,就不存在权不权限的问题了。
使用su
进入root身份,再进入目录hehe,我们发现什么错误都没有发生
再试试读和写:
所以,root的身份是没有权限限制的,无视读写和进入的权限。当然,有些情况还是无法对其随意访问修改的,比如一个文件被别人打开后且正在使用,root就无法对其修改。
那么,在特定目录下,普通用户可以删除别人的文件吗?
答案是:可以的。
换句话来讲,就是只要用户具有目录的写权限,,用户就可以删除目录中的文件,,而不论这个用户是否有这个文件的写权限。
这好像不太科学啊, 我张三创建的一个文件, 凭什么被你李四可以删掉?
我们印证一下 :
-
我们当前的身份是普通用户ysj,观察hehe的权限及拥有者(user)情况:
我们看到hehe是用户ysj的,且具有rwx权限。
-
再进入hehe,观察其各文件的权限及拥有者(user)情况:
test1、test2是普通用户ysj的,test3、test4是超级用户root的。
-
我们现在的身份是普通用户ysj,能不能以ysj的身份删除root的内容呢?
结果证明,这是没问题的,那这不是一个超大的bug吗?
为了解决这个不科学的问题, Linux引入了粘滞位的概念。
粘滞位
语法:chmod +t 目录
功能:使用户只能删除自己的文件或目录,当然,root不受限制。
chmod +t hehe
此时我们再进入hehe,删除test4是否会成功呢?
为什么还是成功了呢?
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员(root)删除
二、该目录的所有者删除
三、该文件的所有者删除
我们看目录hehe的所有者,是ysj,而当前正是ysj在执行rm命令,所以是可以执行删除的,如果将hehe的所有者改为root,那么使用ysj的身份,就不能再删除test4了
sudo touch test4 …/hehe 再次在目录hehe创建所有者为root的test4
sudo chown root …/hehe 将hehe的所有者改为root
rm test4 试图删除test4
关于权限的总结
- 目录的可执行权限是表示你可否在目录下执行命令。
- 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目录, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
- 而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读 权限 ,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档
以上是关于Linux权限的主要内容,如果未能解决你的问题,请参考以下文章