Linux基础学习笔记(五)——文件的ACL权限

2023-11-11

Linux基础学习笔记(五)——文件的ACL权限

前言

这一篇总结一下ACL权限的内容,对应《鸟哥的Linux私房菜》中的第十三章的内容。

什么是ACL控制

之前的学习笔记中,我们总结的关于文件权限,只有三种,使用者权限、群组权限、其他人权限。但是没有办法针对某一个使用者或某一个群组来设定特定的权限,比如我们有一个文件——data.file。当前的权限为774。也就是说该文件的所有者,已经群组的人员有权限对这个文件进行读写和执行,其他人只能读取文件内容。这个时候,有一个临时用户——temp,不属于data.file文件的所属的组群,但是,想对data.file有读和执行的权限,这个时候就有点麻烦了。

我们如果可以将temp用户加入到data.file所属的组群中,这样虽然能实现相关需求,但是temp用户对data.file文件具有了可写权限,这是非常不安全的。如果我们通过修改data.file其他人的权限,给其他人加上可执行权限,这也是扩大了data.file的权限范围,都有点不合适,因此这个时候ACL的作用就凸显出来了。

《鸟哥的Linux私房菜》中对ACL的权限是如下解释的:ACL——Access Control List,主要目的是在提供传统的owner,group,others的read,write,execute权限之外的细部权限限定。ACL可以针对单一使用者,单一文件或目录来进行r,w,x的权限规范,对于需要特殊权限的使用情况非常有帮助。

通常常见的文件系统都是支持ACL的,如果需要查看自己的磁盘文件系统是否支持ACL,可以通过如下命令

[root@localhost log]# dmesg | grep -i acl
[    2.079870] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[    4.335922] SGI XFS with ACLs, security attributes, no debug enabled

出现SGI XFS with ACLs表示支持ACL。

setfacl

这个命令用于设定某个目录/文件的ACL
在这里插入图片描述

相关实例

##创建一个文件夹
[root@localhost /]# mkdir acl_learn
[root@localhost /]# cd /acl_learn/
#创建一个acl_test1文件。
[root@localhost ~]# touch acl_test1
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 root root    0 May 29 16:47 acl_test1
##规定acl_test1文件的所有者和所属组群
[root@localhost ~]# useradd tony
[root@localhost ~]# groupadd stu
[root@localhost ~]# chown tony:stu acl_test1 
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 tony stu     0 May 29 16:47 acl_test1
#新建一个临时用户
[root@localhost ~]# useradd temp
[root@localhost ~]# ll
total 8
-rw-r--r--. 1 tony stu     0 May 29 16:47 acl_test1
#给临时用户temp赋予acl权限。
[root@localhost ~]# setfacl -m u:temp:rx acl_test1 
[root@localhost ~]# ll
total 8
-rw-r-xr--+ 1 tony stu     0 May 29 16:47 acl_test1

上面的实例,我们通过setfacl -m [u:使用者:权限]的方式来设定acl_test1文件的acl权限,设定完成之后,文件的权限描述部分会多出一个+号。如果要查看设定的具体的acl权限,需要用到getfacl命令。

getfacl

用于查询acl权限详情。

这个命令的选项和setfacl相同,这里就免去了选项的说明,只需要通过getfacl filename的方式就能读取文件的acl权限描述

[root@localhost acl_learn]# getfacl acl_test1 
# file: acl_test1
# owner: tony ##文件的拥有者
# group: stu ##文件的所属组群
user::rw- ##第二列表示使用者,如果为空表示对应的是文件所有者,这句整个描述的就是文件所有者的权限
user:temp:r-x ## 针对temp用户设定的用户权限。
group::r-- ## 针对文件组群设置的权限
mask::r-x ## 文件预设的有效mask(这个后面会提到)
other::r-- ## 其他人拥有的权限

mask——最大有效ACL权限

上面在介绍getfacl命令的时候,显示了一个mask,这个其实就是最大有效权限的意思——使用者或者群组所设定的权限必须要存在于mask的权限设定范围之内才会生效。

如果我们给用户赋予了ACL权限,是需要和mask的值"相与"才能得到用户真正的权限。文件的最大用户权限可以通过setfacl命令进行修改。

setfacl -m m:[rwx] 文件名 的方式修改文件的mask值

##修改acl_test1文件的mask值为r
[root@localhost acl_learn]# setfacl -m m:r acl_test1 
[root@localhost acl_learn]# getfacl acl_test1 
# file: acl_test1
# owner: tony
# group: stu
user::rw-
user:temp:r-x			#effective:r-- ##系统已经标出,用户temp生效的权限只有r
group::r--
mask::r-- ##mask的值变成了r
other::r--

默认的ACL权限和递归的ACL权限

默认的ACL权限——如果给父目录设定了默认的ACL权限,那么父目录中所有的新建子文件都会继承父目录的ACL权限(存量文件的ACL权限不会变化)。

通过 setfacl -m d:[u|g]:[user|group]:权限 文件名 来设定文件夹的默认acl权限。

递归的ACL权限——父目录在设定了ACL权限之后,所有的子文件和子目录也会拥有相同的ACL权限(存量文件的ACL权限也会变化)。

通过setfacl -m u:用户名:权限 -R 文件名 类设定文件夹的递归ACL权限。

#创建一个aclpro文件夹
[root@localhost acl_learn]# mkdir aclpro
[root@localhost acl_learn]# cd aclpro/
[root@localhost aclpro]# ll
total 0
#进入aclpro文件夹,创建file1文件
[root@localhost aclpro]# touch file1
## 这个时候的file1不具有acl权限
[root@localhost aclpro]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@localhost aclpro]# cd ..
## 设定文件夹默认的ACL权限
[root@localhost acl_learn]# setfacl -m d:u:temp:rx ./aclpro/
##查看之后,发现aclpro已经有默认的acl权限了,多了default
[root@localhost acl_learn]# getfacl ./aclpro/
# file: aclpro/
# owner: root
# group: root
user::rwx
user:temp:r-x
group::r-x
mask::r-x
other::r-x
default:user::rwx
default:user:temp:r-x
default:group::r-x
default:mask::r-x
default:other::r-x
[root@localhost acl_learn]# cd aclpro/
[root@localhost aclpro]# ll
total 0
-rw-r--r--. 1 root root 0 May 29 17:27 file1
## 这个时候存量的文件ACL权限不受影响
[root@localhost aclpro]# getfacl file1 
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
#新文件的ACL权限与默认的acl权限一致
[root@localhost aclpro]# touch file2
[root@localhost aclpro]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
user:temp:r-x			#effective:r-- 由于mask的设置这里只有r权限有效
group::r-x			#effective:r--
mask::r--
other::r--
##递归设置aclpro文件夹的acl权限
[root@localhost aclpro]# cd ../
[root@localhost acl_learn]# setfacl -m u:temp:rx -R aclpro/
[root@localhost acl_learn]# cd aclpro/
##file1的acl权限产生了变化
[root@localhost aclpro]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:temp:r-x
group::r--
mask::r-x
other::r--

小结

简单梳理了一下ACL权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux基础学习笔记(五)——文件的ACL权限 的相关文章

  • 用另一个文件的标签为图表(ggplot2)中的标题添加下标

    在我的程序中 我有两个主要文件 第一个包含数据 第二个包含标签 或图形标题 文件总数1 数据 3 10000 3 32039232 1 0 0017290351 2 0 0002781092 3 10001 3 32101193 1 0 0
  • 内核驱动程序从用户空间读取正常,但写回始终为 0

    因此 我正在努力完成内核驱动程序编程 目前我正在尝试在应用程序和内核驱动程序之间构建简单的数据传输 我使用简单的字符设备作为这两者之间的链接 并且我已成功将数据传输到驱动程序 但我无法将有意义的数据返回到用户空间 内核驱动程序如下所示 in
  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • PIL 的 Image.show() 带来*两个*不同的查看器

    在 python shell 中处理图像时 我使用 image show 其中 image 是 Image 的实例 很久以前什么也没发生 但在定义了一个名为 xv 的 Mirage 符号链接后 我很高兴 最近几天 show 将显示 Imag
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 如何获取与 shell 中的文件名模式匹配的所有文件的总文件大小?

    我正在尝试仅使用 shell 来计算与文件名模式匹配的所有文件 在目录树中 的总大小 以字节为单位 这是我到目前为止所拥有的 find name undo exec stat c s awk 总计 1 END 打印总计 有没有更简单的方法来
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • 如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

    我正在尝试显示 方框图范围 2500 257F 中的 Unicode 字符 它应该是标准 utf8 Unicode 标准 版本 6 2 我根本做不到 我首先尝试使用旧的 ASCII 字符 但 Linux 终端以 utf8 显示 并且没有显示
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win

随机推荐

  • 一种二维条码图像处理流程

    目前 二维条码主要分两类 1 堆叠式二维条码 PDF417 Code 49 2 矩阵式二维条码 QR Code Maxicode Data Matrix 本条码类似于Maxicode 处理过程大致为 1 图像灰度化 最大值法 平均值法 加权
  • js 定时网页点击_反爬 JS 逆向,扣代码解密分析

    挺久没发爬虫相关的教程啦 今天给大伙分享一下关于网站反爬对请求参数值的加密分析例子 主要还是看看思路 定位加密点 在某网站中进行登录请求 简单抓下包 点击登录按钮之后 可以在浏览器的控制台中看到相关的请求 接着往下拉 可以看到 POST 请
  • C语言char类型的存储

    目录 char是如何存储的 char的类型 char的取值范围 例题 char是如何存储的 字符型 char 用于储存字符 character 如英文字母或标点 但是char类型在内存中并不是以字符的形式储存 而是以ASII码的形式储存 也
  • 为什么组件中的data是一个函数,而不是一个对象?

    1 组件是vue实例的服用 我们希望每个组件都是独立的 我们必须保证各组件里面的数据相互分离 所以组件中的data应该定义为函数形式 并且返回一个对象 2 如果组件中的data是一个对象 每一次调用的组件中使用的数据都是对data中的数据的
  • Linux(centos 7.4)升级openssh编译报错checking whether OpenSSL‘s headers match the library... no

    Linux centos 7 4 升级openssh编译报错checking whether OpenSSL s headers match the library no 解决方案 使用root用户打开文件并编辑 vim etc ld so
  • chatgpt赋能python:Python面向对象编程

    Python面向对象编程 Python是一种支持面向对象编程范式的高级编程语言 在Python中 面向对象编程可以很容易实现 同时也可以让代码更加简洁 可读性更高 什么是面向对象编程 面向对象编程 Object Oriented Progr
  • webpack安装遇到问题 webpack -v得到不是版本号信息

    webpack v得到不是版本号信息且vscode终端打包时报错如下 如图所示 使用npm install webpack webpack cli global 安装完webpack后 运行webpack v却出现如下错误 查阅资料分析原因
  • 清除dell服务器面板告警信息,dell服务器报警信息资料.doc

    沈阳鑫微明信息 技术支持 024沈阳鑫微明信息 技术支持 024DELL服务器LCD信息代码 DELL服务器LCD信息代码的意思 E1114Temp Ambient系统周围环境温度超出允许范围 E1116Temp Memory内存已超过允许
  • element-plus获取表格的所有选中项

    1 在el table中定义 selection change事件
  • 生产redis线程池获取不到资源问题排查

    1 查看错误日志7点报redis clients jedis exceptions JedisExhaustedPoolException Could not get a resource since the pool is exhaust
  • NSGA-II算法实战(附MATLAB源码)

    1 NSGA II算法原理 NSGA II算法全称非支配排序遗传算法II Non dominated Sorting Genetic Algorithm II NSGA II 该算法是由 NSGA 改进而来的 用于解决复杂的 多目标优化问题
  • centos7如何配置静态ip?

    1 切换到root用户 su root 2 获取可用IP地址 dhclient 这一步成功后 用ifconfig命令查看已分配的可用ip 并写到下面网卡配置中 本例中是 192 168 154 132 3 编辑网卡配置 修改标记部分 vim
  • 【前后端分离博客】学习笔记05 --- canal

    一 概述 使用canal rabbitMQ 实现 MySQL 和 Elasticsearch 的数据同步 图解 流程如下 给mysql开启binlog功能 mysql完成增 删 改操作都会记录在binlog中 canal监听binlog变化
  • caffe源码导读(六)layer.hpp头文件解析

    文章目录 一 前篇 二 正文layer hpp头文件解析 三 layer cpp相关的一些理解 四 关于序列化以及第57行为什么要先reset的小例子 本篇为基于 lt 深度学习21天实战caffe gt 所做的学习笔记 如果错误 欢迎指导
  • Ruby on rails 或 Ruby Goliath 利用redis + sidekiq 实现异步处理机制

    使用背景 在平常工作中 出于性能考虑 很多工作或者任务可以放到后台悄悄咪咪地执行 而在接口层或者界面交互的地方 给用户快速返回 利用Redis Sidekiq的组合方式 能够在Ruby on Rails web框架或者Ruby Goliat
  • 帧差法、光流法、背景减除法

    运动目标检测是指在序列图像中检测出变化区域并将运动目标从背景图像中提取出来 通常情况下 目标分类 跟踪和行为理解等后处理过程仅仅考虑图像中对应于运动目标的像素区域 因此运动目标的正确检测与分割对于后期处理非常重要然而 由于场景的动态变化 如
  • Java限制泛型可用类型与泛型通配的方式

    1 限制泛型可用类型概念 1 在定义泛型类别时 默认在实例化泛型类型的时候可以使用任何类型 但是如果想要限制泛型类型时 只能用某个特定的类型或者是其子类型才能实例化该类型时 可以定义类型时 使用extends关键字指定这个类型必须是继承某个
  • Apollo配置参数读取后再做替换

    1 先描述业务场景 在Apollo上做配置 然后读取配置 然后做替换 2 一路坎坷 2 1 在Apollo上配置 但是vlue包含有占位符 获取配置报错 Injection of autowired dependencies failed
  • docker mysql镜像忽略表名大小写

    1 安装mysql镜像 docker pull mysql 2 运行mysql docker run net host restart always privileged true v usr docker dat mysql data v
  • Linux基础学习笔记(五)——文件的ACL权限

    Linux基础学习笔记 五 文件的ACL权限 文章目录 Linux基础学习笔记 五 文件的ACL权限 前言 什么是ACL控制 setfacl getfacl mask 最大有效ACL权限 默认的ACL权限和递归的ACL权限 小结 前言 这一