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–4100
-w-2010
–x1001
rw-6110
r-x5101
-wx3011
rwx7111
0000

文件访问权限的相关设置方法

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信任组中加入我们自己

操作步骤:

  1. 先按 su,输入密码后,进入root身份

  2. 如果有安装vim,则输入vim/etc/sudoers;否则,输入vi /etc/sudoers。注意:vi后要加一个空格

    1、2的步骤:

  3. 进入sudoers后,输入:,再输入set nu,显示行号:

  4. 再用向下的方向键,翻到大概106行的样子,找到以下段落:

  5. 先输i,看见左下方出现后,输入ysj ALL=(All) ALL,当然ysj是我需要添加的用户名,你只需要改成你自己的用户名即可。

  6. 再按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就无法对其修改。

那么,在特定目录下,普通用户可以删除别人的文件吗?

答案是:可以的。

换句话来讲,就是只要用户具有目录的写权限,,用户就可以删除目录中的文件,,而不论这个用户是否有这个文件的写权限。
这好像不太科学啊, 我张三创建的一个文件, 凭什么被你李四可以删掉?

我们印证一下 :

  1. 我们当前的身份是普通用户ysj,观察hehe的权限及拥有者(user)情况:

    我们看到hehe是用户ysj的,且具有rwx权限。

  2. 再进入hehe,观察其各文件的权限及拥有者(user)情况:

    test1、test2是普通用户ysj的,test3、test4是超级用户root的。

  3. 我们现在的身份是普通用户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权限的主要内容,如果未能解决你的问题,请参考以下文章

gitlab 可以进行版本和权限控制,bug管理吗?供部门内部使用,而且是Linux和Windows平台都能使用

gitlab 权限说明

[linux][c/c++]代码片段01

Django REST框架--认证和权限

[linux][c/c++]代码片段02

片段中的请求权限