前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >第七章 权限管理

第七章 权限管理

作者头像
晓天
发布于 2019-07-04 06:17:43
发布于 2019-07-04 06:17:43
7530
举报

第七章 权限管理

7.1 用户使用资源限制文件

Linux中,对于用户使用系统资源,如:CPU、内存、磁盘空间等,都可以做出限制,需要在相关的配置文件中做设置:

vi /etc/security/limits.conf ---编辑资源限制文件,可写入

zhang soft nproc 70

---soft 设置软限制,即警告值, nproc表示该用户运行起的进程数

zhang hard nproc 100 ---hard 设置硬限制,即上限最大值

以上案例可以实现对用户zhang限制其运行进程的数量,到达soft软限制时,会有警报,但仍可继续使用,到达hard硬限制时,将不允许再使用了。

注:该文件注释中的<item>项对可设定限制的资源项有解释。

7.2 文件访问权限设置

7.2.1 文件详细信息介绍

之前我们学习过,ls –l 或 ll后可见到目录下文件的详细信息,那么具体这些信息都是什么呢?我们来详细介绍下:

ls -l ---显示目录内容的详细信息,会显示7项信息

从左至右依次为:文件权限 硬链接数 文件的所属者(属主) 文件的所属组(属组) 文件大小(单位:B) 上一次修改时间 文件名

对应下图:

其中:文件权限部分由10个字符组成,意义如下:

- rwx rwx rwx

文件类型 所属者权限u 所属组权限 g 其他用户权限 o

注:三类用户统一表示用 a

第一个字符的文件类型,由不同字符表示不同类型的文件,具体如下:

- 二进制文件,即文档类 d 目录 l 软链接 b 块设备,如磁盘 c 字符设备,如磁带

注:块设备、字符设备的原理,我们将在后续章节中介绍

每类用户的权限,都由rwx组成,表示了该类用户的访问权限:r读取 w写入 x执行,例如:-rw-r--r-- 表示文档类文件,属主具备读写权限,属组成员具备只读权限,其他用户具备只读权限。

权限的10个字符后的数字1 表示该文件的硬链接数,之前已经讲过。在后面的两个root,前一个表示文件的所属者即属主,后一个表示文件的所属组即属组。二者的权限对应权限中的u和g块。

7.2.2 权限配置

我们先来看一个案例:

图中,以root用户创建并写入一个文件f1,切换到zhang用户下,可查看但不可写入,原因是对于f1文件来讲,属主是root,属组是root,而zhang用户属于其他用户类别,所以只有读权限,没有写权限。那么如果想要允许zhang用户能够写入f1,则需要做权限的更改。更改权限的命令是chmod,它有三种设置方式:

chmod u+x,g+w,o-r f1 ---增减方式配置权限

chmod a+x f1 ---三类用户统一设置

注:增减的方式是在原有权限的基础上做增加或减去

chmod u=rw,g=r,o=r f1 ---赋值方式

chmod a=rw f1

注:赋值方式是全新赋值,覆盖原有权限

chmod 644 f1 ---数字赋值方式,即u=6,g=4,o=4

解释:把rwx三个权限视为一组3bit的二进制数字,有该权限,对应位置1;没有该权限,对应位置0,再转回十进制

例:rw- => 110 => 6 rwx=> 111 =>7 r-x => 101 => 5

所以:chmod 644 f1即 u=rw g=r o=r

chmod 66f1 ---位数不足三位,采用高位补零,即066,称为:右匹配原则

7.2.3 目录的rwx对应的意义

对于文件,我们很容易判断rwx三种权限的功能,即r读取文档,w写入文档,x执行该程序。但是对于目录,我们可能不太清楚rwx的功能,下面具体介绍一下:

r ---显示目录下的内容,即ls功能

w ---允许在目录下创建子目录、子文件

x ---进入目录的功能,即cd功能

可参考如下实验:

由图中可见,只有单x权限的目录,其他用户只能cd进去,却ls查看不了;只有单r权限的目录,其他用户只能ls查看其内容,但cd不进去。而w权限对于目录应该是比较好理解的,表示能够在目录下创建、删除、改名子目录或子文件。

7.2.4默认权限

由前面的案例可见,root创建目录后的默认权限是755,创建文件后的默认权限是644,原因是Linux中有一个权限参数变量:umask 默认值是0022,先关注后三位,即022。可用umask命令查看到其值:

umask ---查看umask变量的值

文件的默认权限其实是由满权限减去umask的后三位的值得到的,如下:

文件默认权限:满权限 - umask = 默认权限

666 - 022 = 644

目录默认权限:满权限 - umask = 默认权限

777 - 022 = 755

注:普通文件因为一般无需执行,所以满权限被认为是666;目录因为必须有x权限才可进入,所以满权限被认为是777

其实umask的值也不是固定的,不同身份的用户umask值也不同,管理员root umask=0022 普通用户 umask=0002,读者可自行查看。

另外,umask的应用除了系统中会有使用,很多文件传输类服务,如:FTP,在上传文件时也会设置umask以制定默认权限,这里暂不展开讲解,先行记住即可。

7.2.5安全位 ---set位

安全位的概念有些复杂,比较难以理解,读者需要多做实验,加以印证。

功能:可以给u 或 g 增加安全位 即 u+s 或 g+s,并且安全位是加给某个程序的,

则运行该程序时,程序所访问到的文件,以此文件的所属者或所属组身份访问

案例:chmod u+s /usr/bin/cat ---给cat命令程序增加用户安全位

su zhang

cat f1 ---则此时,访问f1时,以f1文件的所属者身份访问

ll /usr/bin/cat

注:查看显示程序信息,安全位s显示在x权限的位置,大写S说明之前无x权限,小写s说明之前有x权限

案例如下图:

如图,给cat命令的执行程序增加安全位后,zhang用户使用cat命令时,读取f1的内容,按f1文件的属主身份访问,但是如果使用head、tail、more等命令读取f1时仍应该是拒绝的。

同样道理,如果给cat命令增加了g+s即组的安全位,则cat访问f1时,会以f1的属组身份访问的。

7.2.6 粘贴位 ---sticky位,又称粘连位

我们可以想象一下,如果我们以一个用户的身份进入系统,在某目录下创建了自己的目录和文件,当其他用户也登录进系统,如果权限允许,是可以删除我们所创建的文件的,这样对于我们的个人资料就不安全了,为了保护用户的个人资料,可以使用目录粘贴位的方式加以保护。

介绍:可以给目录增加粘贴位,粘贴位只能加到o 上,即 o+t,增加了粘贴位的目录,目录中的内容只有创建者有权删除

案例如图:

上图中,我们首先给/mnt的o增加了w权限,因为默认/mnt目录的权限是755,即其他用户无权写入。查看是用ll –d /mnt是只显示/mnt目录的信息,不显示/mnt目录下内容的信息。之后我们使用zhang用户进入/mnt中,创建了目录和文件,但是切换到moon用户下时,是可以删除的。下面我们来看一下增加了粘贴位的效果:

上图中可见,给/mnt增加了粘贴位后,zhang所创建的目录及文件,moon用户无权删除了,这就是粘贴位的功能。

7.2.7 权限配置进阶

有了安全位、粘贴位的概念,我们再来看一下四位数字赋值的方式

chmod 5755 d1

解释:第一位数字表示 u g 的安全位和o的粘贴位组成的3bit的二进制,如:5表示 s-t,即 u+s o+t

umask 中的第一位数字,也代表的也是文件默认的u g 的安全位和o的粘贴位。

另外,我们可以做实验证明,当给目录设置权限以后,目录内的子目录、子文件是不跟着一起变化的,那么如果我们想要实现改变目录的权限,其内部文件一起变,即配置的继承功能,则需要增加–R 参数,我们称之为递归操作,案例如下:

chmod -R 755 /mnt/d1 --- -R 表示递归操作

7.3 所属信息配置

我们在ls -l 查看的结果中,第三、第四项表示文件的所属者、所属组。当创建文件、目录后,默认当前的创建者即是文件的所属者,所属者所在的私有组即是该文件的所属组。可以想象一下,在权限为644的文件上,如果禁止更改权限,却仍想要允许zhang用户写入文件,可以采用的方法是更改文件的所属者为zhang用户,则zhang即可有写入权限了。

7.3.1 所属信息配置命令

更改文件所属的命令是chown,具体格式如下:

chown zhang f1 ---更改文件的所属者

注:更改后可验证zhang用户对f1有写入权限了

chown .zhang f1 ---更改所属组, 用 . 前面空白,表示略过属主,设置属组,注:用.或:都可以,如 chown:zhang f1

chown root.root f1 ---同时改两项, 等同于:chown root:rootf1

其实更改所属组,还有一个命令是 chgrp,但我们日常使用并不多,所以这里仅仅提示一下。如:chgrp zhang f1

另外,如果我们更改所属的对象是一个目录,默认仅是更改了目录的所属,而目录内的子文件、子目录并未跟着一起更改,若想实现目录内容继承更改,则需要增加递归参数–R,命令如下:

chown -R zhang.zhang dd ---更改目录及其内容的所属信息,-R 递归

最后再来看一下文件复制对文件所属信息的影响:

如图可见,复制目录后,文件的所属发生了变化,变回root属主root属组了。那么如果想要复制后保持原所属信息不变,可增加 –p 参数,如下图:

7.4 访问控制列表ACL

7.4.1 ACL的功能

我们可以试想一下,如果我们有一个文件,属主root,属组root,权限644,现不希望更改文件所属,却想仅允许用户zhang可以写入,该怎么办呢?如果用o+w的操作,虽然zhang可以写了,但是除了zhang以外的其他用户,如:lisi等,也具备了写的权限,这与我们的初衷不符,这时候,就可以使用acl来解决此问题。

ACL的功能就是:针对文件,设置特权用户,即允许特定用户访问

如:f1文件权限644,属主root,属组root,则zhang无权写入,可给zhang设定特权,仅允许zhang写入

7.4.2 ACL命令

具体的配置命令如下:

getfacl f1 ---查看文件的acl信息

setfacl -m u:zhang:rw f1 --- 针对文件,设置用户的acl, -m表示设置 u: 表示设置用户的acl

如图所见,用户zhang即对f1有rw权限了,可尝试编辑f1文件加以验证。

另外针对文件,也可以做组的ACL,命令如下

setfacl -m g:zu11:rw f1 --- g:表示设置组的acl

若要撤销acl,可使用-x或-b参数,具体如下:

setfacl -x u:zhang f1 ---撤销单个acl

setfacl -b f1 ---撤销文件的所有acl

7.5 文件属性设置

关于文件属性,其实日常工作中使用较少,这里我们只是简单介绍下,读者能够知道其功能即可。

属性,即文件的某些特性。使用lsattr命令查看,案例如下

lsattr -aR /root ---查看 /root 下的文件及目录权限

-a: 显示指定目录下的文件及目录的属性

-R: 递归显示

文件的常用属性有:

i: 只读属性

A:不更新文件的访问时间 .可减少磁盘 IO 操作

a:可追加数据,但无法修改、删除、重命名

c:压缩, 文件使用时自动解压, 离开文件 / 目录时自动压缩,以节省使用空间

d: 忽略 dump 备份 , 文件有此属性将不允许备份

S: sync 同步

s:安全删除属性 , 文件不可恢复

u:文件删除后,可恢复

其中我们比较容易理解的是:i a c 等属性

我们可以用 chattr命令,使用 + - 号来给文件增加或删除属性:

如图所示,在给f1增加i属性前,是可以写入的,给f1增加了i属性后,f1即处于只读状态,可用lsattr查看到,便不可再写入了。之后去除i属性后,f1又可写了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 教主小筑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java 死锁的问题怎么解决的
在 Java 中解决死锁问题通常需要结合代码设计、工具检测和预防策略。以下是详细的解决方案和最佳实践:
用户6556402
2025/05/29
1140
线程安全及其他理论
  如果现在有两个线程thread1和thread2,整个体系之中存在两把锁,mutex1和mutex2,现在出现这这样一种情况:
用户11029129
2024/10/27
1240
线程安全及其他理论
1.3w字,一文详解死锁!
死锁(Dead Lock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁。
磊哥
2021/09/09
4090
1.3w字,一文详解死锁!
【高并发】优化加锁方式时竟然死锁了!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
5480
【高并发】优化加锁方式时竟然死锁了!!
面试官提问:谈谈你对死锁的理解?
在之前的文章中,我们介绍了synchronized同步锁关键字的作用以及相关的用法,它能够保证同一时刻最多只有一个线程执行修饰的代码段,以实现线程安全执行的效果。
Java极客技术
2023/09/22
2650
面试官提问:谈谈你对死锁的理解?
死锁的典型情况、产生的必要条件和解决方案
一个线程去尝试获取更多的锁,在获取第二把锁的过程中,会对第一把锁始终保持获取状态。
用户10788736
2023/10/16
3520
死锁的典型情况、产生的必要条件和解决方案
Java 程序死锁问题原理及解决方案
Java 语言通过 synchronized 关键字来保证原子性,这是因为每一个 Object 都有一个隐含的锁,这个也称作监视器对象。在进入 synchronized 之前自动获取此内部锁,而一旦离开此方式,无论是完成或者中断都会自动释放锁。显然这是一个独占锁,每个锁请求之间是互斥的。相对于众多高级锁 (Lock/ReadWriteLock 等),synchronized 的代价都比后者要高。但是 synchronzied 的语法比较简单,而且也比较容易使用和理解。Lock 一旦调用了 lock() 方法获取到锁而未正确释放的话很有可能造成死锁,所以 Lock 的释放操作总是跟在 finally 代码块里面,这在代码结构上也是一次调整和冗余。Lock 的实现已经将硬件资源用到了极致,所以未来可优化的空间不大,除非硬件有了更高的性能,但是 synchronized 只是规范的一种实现,这在不同的平台不同的硬件还有很高的提升空间,未来 Java 锁上的优化也会主要在这上面。既然 synchronzied 都不可能避免死锁产生,那么死锁情况会是经常容易出现的错误,下面具体描述死锁发生的原因及解决方法。
哲洛不闹
2018/09/18
1K0
Java 程序死锁问题原理及解决方案
咋办,死锁了
在面试过程中,死锁也是高频的考点,因为如果线上环境真多发生了死锁,那真的出大事了。
小林coding
2021/04/21
4630
死锁概念解析及避免策略:如何让你的程序避免崩溃
死锁是多线程编程中的一种常见问题,它会导致程序无法继续执行,造成性能瓶颈甚至系统崩溃。本文将深入解释死锁的概念、产生的原因,并介绍几种有效的避免死锁的策略。无论你是刚接触多线程编程的小白,还是有一定经验的开发者,本文都将帮助你理解如何识别和避免死锁。让我们一起探索如何提高程序的稳定性和并发性能吧!😊
默 语
2025/05/21
1410
【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题
OK啊!!!小伙伴们,本小编又带来了一个重磅知识,我们上期讲解了关于线程安全问题,引出了加锁这个概念;但是加锁会产生一个严重的问题,就是当我们运用不当时,进行加锁会导致死锁的发生,那怎样才会导致死锁呢?以及如何避免呢?这就是小编本期的重要内容;
用户11288949
2024/09/27
1550
【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题
死锁与死锁避免算法
死锁(Deadlock)是在多任务环境中的一种资源竞争问题,其中两个或多个进程(线程)互相等待对方持有的资源,导致所有进程都无法继续执行。死锁是一种非常棘手的问题,因为它会导致系统无法正常运行。
恋喵大鲤鱼
2024/02/29
5700
死锁与死锁避免算法
死锁相关问题
两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,他们都将无法推进下去,陷入死循环
烟草的香味
2019/10/24
6030
面试官:什么是死锁?如何解决死锁?写一段死锁的代码吧!
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。产生死锁的原因,主要包括:
CG国斌
2020/05/15
21.8K2
cas 原理分析
顾名思义,就是很悲观,假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。
全栈程序员站长
2022/11/03
3710
cas 原理分析
死锁终结者:顺序锁和轮询锁!
死锁(Dead Lock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁。
磊哥
2021/09/06
3870
【JAVA-Day79】 线程死锁讲解
线程死锁是多线程编程中一种非常棘手的问题,它发生在多个线程互相持有对方所需的资源而无法继续执行的情况下。简单来说,当两个或多个线程彼此持有对方需要的资源,并且等待对方释放资源时,就会发生死锁。
默 语
2024/11/20
890
【JAVA-Day79】 线程死锁讲解
Java多线程死锁问题
 可以看出,线程1尝试获取锁2,线程2尝试获取锁1,但是二者并没有获取到对方的锁;这就发生了所谓的“死锁”!
全栈程序员站长
2022/09/14
5750
Java多线程死锁问题
什么是线程死锁?形成条件是什么?如何避免?
死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。
程序员追风
2020/05/29
3K0
什么是线程死锁?形成条件是什么?如何避免?
Java并发编程实战指南:JUC核心类、线程池、线程安全集合与死锁破解
JUC即java.util.concurrent是Java的一个包,下面有非常多的并发编程相关的类。
小皮侠
2024/10/24
4880
Java并发编程实战指南:JUC核心类、线程池、线程安全集合与死锁破解
当 MySQL 事务 “杠上”,死锁就是这么来的!
在多用户、多事务并发执行的数据库系统中,死锁是一种不可避免的现象。当两个或多个事务相互等待对方释放锁资源时,就会形成死锁,导致这些事务无法继续执行,进而影响数据库系统的正常运行。MySQL 作为一种广泛使用的关系型数据库管理系统,提供了一系列的死锁处理机制来检测和解决死锁问题。
羑悻的小杀马特.
2025/04/07
1360
当 MySQL 事务 “杠上”,死锁就是这么来的!
推荐阅读
相关推荐
java 死锁的问题怎么解决的
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档