[Linux修炼]Linux用户与权限(二)

73 阅读9分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

前言

      本文就来分享一波笔者对于Linux下用户和权限的学习经验和心得,本篇系第二篇。

      笔者水平有限,难免存在纰漏,欢迎指正交流。

Linux用户与权限(二)

Linux权限管理

文件访问者的分类(人)

文件和文件目录的所有者: u---owner

文件和文件目录的所有者所在的组的用户: g---group

其它用户也就是既不是所有者也不是所在组的用户: o---other

      为什么会存在所属组呢?

举个例子:

      假设某个公司里有两个团队开发同一个项目,而能提供的只有一台Linux机器(问就是穷),于是它们两个团队就共用一台机器。这里假如只有owner和other两类用户,有一天团队A里张三的领导想要看看张三的代码,张三是他自己代码的owner,除张三外其他人都是都是其他用户other,那领导不就看不到张三的代码了嘛,干脆放开other权限,这样领导就看到了,但与此同时团队B的人也就都能看到张三的代码了。

image-20220930145359966

      这样看来只设置owner和other显然不太合理,所以Linux引入了group所属组的概念,同一个组内的人可以互相访问。

文件类型和访问权限(文件属性)

      当我们列出文件详细信息时会发现一长串字符,下图进行解释:

image-20220928185426561

文件类型

d:文件夹

-:普通文件(源代码、库文件、可执行程序、文档压缩包等等)

l:软链接(类似Windows的快捷方式)

b:块设备文件(例如硬盘、光驱等)

p:管道文件

c:字符设备文件(例如键盘、显示器等串口设备)

s:套接口文件

      注意:Linux和windows下文件类型差别很大。windows下靠文件后缀来区别文件,而Linux区别文件与文件后缀无关,如果要使用的话,仅仅只是给用户做一个提示符号来用,后缀本质上被系统认为是文件名的一部分。

      虽然Linux本身对文件后缀没要求,不过gcc等工具可能会对文件后缀有要求。

基本权限

i.读(r): Read 对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限

ii.写(w): Write 对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限

iii.执行(x): execute 对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限

iv.“—”表示不具有该项权限

文件权限值的表示方法

字符表示方法

image-20220930152813096

image-20220928195534602

八进制数值表示方法

image-20220928195604747

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

1.chmod

功能: 设置文件的访问权限

格式: chmod [参数] 权限 文件名

常用选项: -R 递归修改目录文件的权限

说明: 只有文件的拥有者和root才可以改变文件的权限

chmod 用户表示符 操作符(+ - =) 权限字符 文件名

或者

chmod 权限八进制数值 文件名

+:向权限范围增加权限代号所表示的权限

-:向权限范围取消权限代号所表示的权限

=:向权限范围赋予权限代号所表示的权限

用户符号:

u:拥有者

g:拥有者同组用

o:其它用户

a:所有用户

看具体例子就明白了

举例:

image-20220930153701147

image-20220930153858285

image-20220930161844019

image-20220930162031609

      注意:在识别用户时遵循这样一个顺序:先判断是不是拥有者,不是的话再判断是不是所属组成员,还不是的话就是其他用户了,而且这几次判断是if()...else if()...else()的关系,只要前面的成立就不会再判断后面的了。照这么说,如果你属于拥有者,那就不会判断你为所属组成员,要是拥有者不具有读权限而所属组具有的话拥有者不可读文件。

2.chown

功能: 修改文件的拥有者

格式: chown [参数] 用户名 文件名

      把东西给别人需要征得别人的同意么?给你钱需不需要你同意?给你钱你还不要?那么给你黑锅让你背你要不要?无论心意是好是坏,原则上当然需要征得别人的同意。那在Linux下给文件需要别人同意吗?需要,那你可能会觉得麻烦,你还得等别人同意,其实也可以sudo一下再给别人,因为root用户是想给就给的不需要同意的。

实例:

image-20221002112212922

3.chgrp

功能: 修改文件或目录的所属组

格式: chgrp [参数] 用户组名 文件名

常用选项: -R 递归修改文件或目录的所属组

类同于chown,root用户想改就改。

实例:

image-20221002112510431

chown xxx:xxx file 同时把所属组和拥有者改了

image-20221002112649395

4.umask

功能: 查看或修改文件的权限掩码值

      新建文件默认权限=0666 新建目录默认权限=0777(最左边的0暂时不管)

      那为什么我们创建的目录或文件的权限会是这样的一个权限呢?

image-20220930163437570

      实际上你所创建的文件和目录,看到的权限往往不是默认值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask,简单来说就是凡是在umask中出现的权限,都必须在默认权限中去掉。root用户默认掩码值为0022,普通用户默认为0002。

image-20221001082248813

格式: umask 权限掩码值

实例:

image-20221001082503757

file指令

功能说明: 辨识文件类型。

语法: file [选项] 文件或目录

常用选项:

-c 详细显示指令执行过程,便于排错或分析程序执行的情形。

-z 尝试去解读压缩文件的内容。

实例:

      这里用file辨识文件emp1的类型,发现是目录类型:

image-20221001082703343

目录的权限

可执行权限x: 如果目录没有可执行权限, 则无法cd到目录中

可读权限r: 如果目录没有可读权限,则无法用ls等命令查看目录中的文件内容

可写权限w: 如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件

      目录的可执行权限是表示你可否在目录下执行命令。 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目录, 即使目录仍然有-r 读权限(这个地方很容易犯错,会误认为有读权限就可以进入目录读取目录下的文件)。

      而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录,但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

      为什么系统要规定一个目录的默认权限值为777?因为所有的目录被创建出来一般都要能被进入,如果不需要某个权限就可以通过修改掩码值从而控制初始权限值。

粘滞位

      Linux下可以有很多用户,有时候需要在一个公共的目录下进行临时文件的操作(增删查改),而这个目录一般不属于任何普通用户(属于root用户)。

      我们查看根目录ll /,可以看到这么一个高亮目录tmp,它就是一个公共目录。你可能发现了权限中other权限的可执行权限变成了t,这是为什么呢?别急,这就跟我们要说的粘滞位有关了。

image-20221017101907966

      这个公共目录的other权限全部放开了,所以各个用户都能进入并操作这个目录。

      我们自己创建一个目录mytmp,看看怎么成为公共目录:

image-20221017103337380

      我们用chmod改变权限,把other权限全放开,发现mytmp高亮了,说明变成了公共目录:

image-20221017103528093

      于是,问题来了~~

      根据上面所述,我们发现只要用户具有目录的写权限,用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限。

      这好像不太合理啊,公共目录大家都可以改,我张三在公共目录下创建的一个文件我就不给你写,但凭什么你李四可以删掉?

      我们思考一下,一个文件是否能被删掉与它本身所具有权限有关吗?其实是跟它所在目录权限有关,而与文件本身无关——毁灭你与你无干(笑)。

      那我就不爽了,我放在公共目录下的文件都不让别人读写了居然能被他删掉?要是别人故意找茬删我文件,我这文件不就白写了么?

      就是说我们希望在公共目录中,大家各自可以进行rwx操作,但是禁止大家删除别人的文件。

      为了解决这个不合理的问题,Linux引入了粘滞位的概念。

      我们要给公共目录设置粘滞位。

      当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能:

1.由超级管理员(root)删除

2.由该目录的所有者删除

3.由该文件的所有者删除

      我们就来试一试,把前面创建的mytmp目录设置粘滞位:

image-20221017111510247

      所以other权限中的t代表的就是粘滞位。

      我们在设置了粘滞位的mytmp目录下进行下列操作,以此来验证粘滞位作用:

image-20221017112359731


以上就是本文全部内容,感谢观看,你的支持就是对我最大的鼓励~

src=http___c-ssl.duitang.com_uploads_item_201708_07_20170807082850_kGsQF.thumb.400_0.gif&refer=http___c-ssl.duitang.gif