持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
前言
本文就来分享一波笔者对于Linux下用户和权限的学习经验和心得,本篇系第二篇。
笔者水平有限,难免存在纰漏,欢迎指正交流。
Linux用户与权限(二)
Linux权限管理
文件访问者的分类(人)
文件和文件目录的所有者: u---owner
文件和文件目录的所有者所在的组的用户: g---group
其它用户也就是既不是所有者也不是所在组的用户: o---other
为什么会存在所属组呢?
举个例子:
假设某个公司里有两个团队开发同一个项目,而能提供的只有一台Linux机器(问就是穷),于是它们两个团队就共用一台机器。这里假如只有owner和other两类用户,有一天团队A里张三的领导想要看看张三的代码,张三是他自己代码的owner,除张三外其他人都是都是其他用户other,那领导不就看不到张三的代码了嘛,干脆放开other权限,这样领导就看到了,但与此同时团队B的人也就都能看到张三的代码了。
这样看来只设置owner和other显然不太合理,所以Linux引入了group所属组的概念,同一个组内的人可以互相访问。
文件类型和访问权限(文件属性)
当我们列出文件详细信息时会发现一长串字符,下图进行解释:
文件类型
d:文件夹
-:普通文件(源代码、库文件、可执行程序、文档压缩包等等)
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如键盘、显示器等串口设备)
s:套接口文件
注意:Linux和windows下文件类型差别很大。windows下靠文件后缀来区别文件,而Linux区别文件与文件后缀无关,如果要使用的话,仅仅只是给用户做一个提示符号来用,后缀本质上被系统认为是文件名的一部分。
虽然Linux本身对文件后缀没要求,不过gcc等工具可能会对文件后缀有要求。
基本权限
i.读(r): Read 对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
ii.写(w): Write 对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
iii.执行(x): execute 对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
iv.“—”表示不具有该项权限
文件权限值的表示方法
字符表示方法
八进制数值表示方法
文件访问权限的相关设置方法
1.chmod
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项: -R 递归修改目录文件的权限
说明: 只有文件的拥有者和root才可以改变文件的权限
chmod 用户表示符 操作符(+ - =) 权限字符 文件名
或者
chmod 权限八进制数值 文件名
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
看具体例子就明白了
举例:
注意:在识别用户时遵循这样一个顺序:先判断是不是拥有者,不是的话再判断是不是所属组成员,还不是的话就是其他用户了,而且这几次判断是if()...else if()...else()的关系,只要前面的成立就不会再判断后面的了。照这么说,如果你属于拥有者,那就不会判断你为所属组成员,要是拥有者不具有读权限而所属组具有的话拥有者不可读文件。
2.chown
功能: 修改文件的拥有者
格式: chown [参数] 用户名 文件名
把东西给别人需要征得别人的同意么?给你钱需不需要你同意?给你钱你还不要?那么给你黑锅让你背你要不要?无论心意是好是坏,原则上当然需要征得别人的同意。那在Linux下给文件需要别人同意吗?需要,那你可能会觉得麻烦,你还得等别人同意,其实也可以sudo一下再给别人,因为root用户是想给就给的不需要同意的。
实例:
3.chgrp
功能: 修改文件或目录的所属组
格式: chgrp [参数] 用户组名 文件名
常用选项: -R 递归修改文件或目录的所属组
类同于chown,root用户想改就改。
实例:
chown xxx:xxx file 同时把所属组和拥有者改了
4.umask
功能: 查看或修改文件的权限掩码值
新建文件默认权限=0666 新建目录默认权限=0777(最左边的0暂时不管)
那为什么我们创建的目录或文件的权限会是这样的一个权限呢?
实际上你所创建的文件和目录,看到的权限往往不是默认值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask
,简单来说就是凡是在umask中出现的权限,都必须在默认权限中去掉。root用户默认掩码值为0022,普通用户默认为0002。
格式: umask 权限掩码值
实例:
file指令
功能说明: 辨识文件类型。
语法: file [选项] 文件或目录
常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容。
实例:
这里用file辨识文件emp1的类型,发现是目录类型:
目录的权限
可执行权限x: 如果目录没有可执行权限, 则无法cd到目录中
可读权限r: 如果目录没有可读权限,则无法用ls等命令查看目录中的文件内容
可写权限w: 如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件
目录的可执行权限是表示你可否在目录下执行命令。 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目录, 即使目录仍然有-r 读权限(这个地方很容易犯错,会误认为有读权限就可以进入目录读取目录下的文件)。
而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录,但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
为什么系统要规定一个目录的默认权限值为777?因为所有的目录被创建出来一般都要能被进入,如果不需要某个权限就可以通过修改掩码值从而控制初始权限值。
粘滞位
Linux下可以有很多用户,有时候需要在一个公共的目录下进行临时文件的操作(增删查改),而这个目录一般不属于任何普通用户(属于root用户)。
我们查看根目录ll /
,可以看到这么一个高亮目录tmp,它就是一个公共目录。你可能发现了权限中other权限的可执行权限变成了t,这是为什么呢?别急,这就跟我们要说的粘滞位有关了。
这个公共目录的other权限全部放开了,所以各个用户都能进入并操作这个目录。
我们自己创建一个目录mytmp,看看怎么成为公共目录:
我们用chmod改变权限,把other权限全放开,发现mytmp高亮了,说明变成了公共目录:
于是,问题来了~~
根据上面所述,我们发现只要用户具有目录的写权限,用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限。
这好像不太合理啊,公共目录大家都可以改,我张三在公共目录下创建的一个文件我就不给你写,但凭什么你李四可以删掉?
我们思考一下,一个文件是否能被删掉与它本身所具有权限有关吗?其实是跟它所在目录权限有关,而与文件本身无关——毁灭你与你无干(笑)。
那我就不爽了,我放在公共目录下的文件都不让别人读写了居然能被他删掉?要是别人故意找茬删我文件,我这文件不就白写了么?
就是说我们希望在公共目录中,大家各自可以进行rwx操作,但是禁止大家删除别人的文件。
为了解决这个不合理的问题,Linux引入了粘滞位的概念。
我们要给公共目录设置粘滞位。
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能:
1.由超级管理员(root)删除
2.由该目录的所有者删除
3.由该文件的所有者删除
我们就来试一试,把前面创建的mytmp目录设置粘滞位:
所以other权限中的t代表的就是粘滞位。
我们在设置了粘滞位的mytmp目录下进行下列操作,以此来验证粘滞位作用:
以上就是本文全部内容,感谢观看,你的支持就是对我最大的鼓励~