Linux 命令 | 每日一学,文件目录特殊权限相关命令集锦

90f50373fedf17c28471259fa1ccd7e5.jpeg

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]


0x00 前言简述

描述:相信各位看友都看了UP主上一篇《Linux运维学习之文件目录属性及权限管理笔记》了吧,此篇将针对文件目录特殊权限等相关命令进行详细讲解,包括文件基本权限与特殊权限。

2a70cbf69e358ad8b848f31fcb8f7daf.png

温馨提示:如果小伙伴们在其他平台看到此文章,一定要关注访问作者首发公众号《全栈工程师修炼指南》,给作者持续创作的动力!

首发地址:Linux 命令 | 每日一学,文件目录特殊权限相关命令集锦此文,主要针对文件所属者和所属组的切换操作,文件及其目录的rwx读写执行权限的赋予,文件特殊权限suid、sgid、sbit(粘着位)的讲解,文件目录特殊属性的设置查看,文件目录ACL访问控制列表来做更精细化的用户权限管控等相关命令的实践。icon-default.png?t=N7T8https://mp.weixin.qq.com/s/bT-5RM4r-lMkp4Bu1bf2mA

知识回顾

  • 文件类型及权限

-rw-r--r-- 
# r = 4 / w = 2 / x = 1

# 对于文件 
# r:read 读取文件内容(cat more tail head)
# w: write 编辑 新增 修改文件内容(vi mvi) 但是不包括删除文件
# x: execute 可执行

# 对于目录
# r: 可以查询目录下文件名 (ls)
# w: 具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切(touch rm mv cp)
# x: 可以进入目录 (cd)

# 文件权限对应对象
-rw-     r--       r--
u所有者   g所属组   o其他人  

# 常见权限
rwx 属性:4 + 2 + 1= 7       (可读可写可执行)
rw- 属性:4 + 2 = 6          (可读可写不可执行)
r-x 属性:4 + 1 = 5         (可读不可写可执行)
d57b3f03be351a8d4ddfe7023e78ffdb.png
weiyigeek.top-文件权限示例
  • 默认建立文件和目录的权限

# 通过 umask 命令设置特殊权限,文件默认权限 022,所以文件默认最大权限为666、目录默认的最大权限为777.
umask 0022 # 其中第一位0表示文件特殊权限

# 默认权限需要换算成八进制再相减, 所有建立文件之后的默认权限,例如,为文件的最大权限666减去umask的值,就是 644
666-022=644 
# 对于文件默认权限 644(rw-r--r--),即不能建立为执行文件,必须手工赋予执行权限
-rw-r--r-- 1 root root    0 Jun 24 21:59 weiyigeek.sh

# 同样的,目录默认最大权限777需换算成数字再相减建立文件之后的默认权限,例如,目录的最大权限777减去umask的值,就是755
# 对于目录默认权限 755(rwx-r-xr-x),目录要有执行权限和访问权限
drwxr-xr-x 2 root root 4096 Jun 24 21:59 weiyigeek

比如:由于A dir没有w得权限,则不能对B dir进行删除操作,因为B dir有rw权限则,可以对c file进行删除操作 (## 都只对下一级有用)

# 比如:目录默认最大权限为777 umask值022
777 - 022 = 755
-rwxrwxrwx  减去 -----w--w-  ==  -rwxr-xr-x

e2a962bc097c96085512c027602a7ca0.png

weiyigeek.top-权限对于目录的作用

温馨提示:对文件(File)来讲最高权限是x执行,对目录(Dir)来讲最高权限是w写操作,所以在生产环境中应该谨慎。

温馨提示:Linux中权限对文件的作用,特别注意普通用户设置权限对root用户是没用,其是超级管理员。

温馨提示:在运维分配文件基本权限时,核心原则:在最小权限情况下能够实现要求即可,谨慎使用rw-rw-rw- :666rwxrwxrwx :777权限

0x01 文件和组属性配置

chown 命令 - 更改所属用户和组

描述: 此命令用于改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。

温馨提示:用户可以是用户名或者是用户ID,用户组可以是组名或组id,文件名可以使由空格分开的文件列表,在文件名中可以包含通配符,值得注意的是只有文件主和超级用户才可以便用该命令。

语法参数:

chown [选项] 用户名:组名 文件或者目录

# 关键参数
-R :递归处理,将指定目录下的所有文件及子目录一并处理(常用)
--reference=文件或目录:参照目标文件目录文件来设置当前文件目录权限
-c :效果类似-v参数,但仅回报更改的部分;
-f :不显示错误信息;
-h :只对符号连接的文件作修改,而不更改其他任何相关文件;
--dereference:效果和-h参数相同;
-v:显示指令执行过程;

实际案例:

# 1.将文件/tmp/weiyigeek.txt的所属用户、所属组改为 weiyigeek
chown weiyigeek: /tmp/weiyigeek.txt

# 2.将文件/tmp/weiyigeek.txt的所属所属组改为 weiyigeek
chown :weiyigeek /tmp/weiyigeek.txt

# 3.将文件的所属者和所属组分别设置为root和weiyigeek
chown root:weiyigeek test.sh
# drwxr-xr-x  2 root(所有者) weiyigeek (所有组)     21 May  9 16:50 testprivate

# 4. 将目录/data/ 及其下面的所有文件、子目录的文件用户改成 weiyigeek:
chown -R weiyigeek /data/

# 5.将文件的所属者和所属组分别设置为root和nobody
chown -R root.nobody /tmp/rsynctest

# 6.将文件的所属者和所属组设置与/tmp/f1.txt文件相同
chown --reference=/tmp/f1.txt /tmp/f2.txt

ab42db55bce3199168a4574232e283b5.png

weiyigeek.top-chown命令使用示例

chgrp 命令 - 更改所属组

描述: 在 Unix 系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可;

语法参数:

chgrp [option] 组 文件目录

# 常用选项参数与 chown 命令差不多
-R 递归处理,将指定目录下的所有文件及子目录一并处理(常用)
-v 显示指令执行过程
-h 改变符号连接的所属组,只对符号连接文件有效

实际案例:

# 1.让nginx用户对文件及目录拥有一定权限
$ chgrp -v -h nginx /tmp/a.sh
  # changed group of ‘/tmp/a.sh’ from root to nginx
$ ll /tmp/a.sh
  # -rw-r--r-- 1 root nginx 0 Jun 24 21:59 /tmp/a.sh

# 2.修改文件的所属组, 将/data 及其子目录下的所有文件的用户组改为 weiyigeek
chgrp -R weiyigeek /data

# 3.-拥有一个testprivate目录让老师拥有所有的权限,让本课程学员由查看的权限,其他人不许查看这个目录
useradd teacher
useradd student
gpasswd -a student teacher # 或者 usermod -g teacher student    # -g代表更改用户所在的用户组/附属组
mkdir testprivate
chmod +740 testprivate/
chown student:teacher testprivate/

0x02 文件目录权限

chmod 命令 - 更改文件权限

描述:此命令常用于对于文件或者目录进行赋予rwx权限,也可以减去特定的权限(常用且非常有用)。

语法参数:

chmod [选项] [模式:who opt permisson]  文件名

# 主要参数
[ugoa][+-=][rwxXst]   
# u用户 g组 o其他 a 全部
# +添加 -减去 =设置
# 权限:rwx X(目录x权限) s(特殊权限) T(粘滞位)

-R, --recursive: 递归修改权限

# 修改设置一类用户的所有权限
u=rwx ug=rw o=r

# 修改用户的某个权限
u+rwx go-rw o-r

实际案例:

# 1.给当前用户和组以及所有人赋予 weiyigeek.txt 文件 write 权限
chmod u+w weiyigeek.txt
chmod u+rwx,g+w,o+w weiyigeek.txt

# 2.给所有人都赋予可读可写可执行等同于777权限(这样做非常危险)
chmod a=rwx text.txt   

# 3.其中abc分别表示一个数字且<=7,分别表示User,Group,以及Other的权限。
chmod +abc text.sh    #+/-表示赋予和减去
chmod +777 text.sh  #权限777
chmod -755 text.sh   #权限022

# 4.用户、用户组、其他人增加可读减去可执行权限
chmod +r test.txt
chmod -w test.txt

# 5.用户可读可写可执行,组与其它人可读可执行
chmod 644 test.sh
chmod u=rwx,go=wx test.sh

# 6.为目录设置可执行权限,但不会影响目录中存在文件的可执行权限。
chmod -R a+X /dir

umask 命令 - 更改默认权限

描述:用于修改建立文件或者目录的默认权限,前面,我们提到默认情况下用户创建文件与目录的权限如下; 文件:初始权限没有可执行(x)权限即只有r/w这两个选项即-rw-rw-rw-(666); 目录:初始权限均开放即为777分,默认权限如下drwxrwxrwx(777);

而 umask 的分值是为了用在默认权限去掉其分值的所得的权限,例如默认的umask的为022即实际上新建文件或者目录权限如下: 文件 : (-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--) => 666 - 022 = 644目录 : (drwxrwxrwx) - (d----w--w-) = (drwxr-xr-x) => 777 - 022 = 755

语法参数:

usage: umask [-p] [-S] [mode]

# 常用参数
-p 输出umask数值
-S 输出与umask值相减后的rwx权限

实际案例:

# 1.查看 umask 值的几种方式
$ umask
0022

$ umask -p
umask 0022

# 2.查看创建目录默认的权限
$ umask -S  
u=rwx,g=rx,o=rx 

# 3:临时修改umask的值
$ umask 0022

# 4.永久修改umask的值, 全局设置 /etc/bashrc 或者 用户家目录下的 ~/.bashrc
$ vi /etc/profile
umask 022   # 如果需要永久修改需要编辑/etc/profile中的umask值
$ source /etc/profile

0x03 文件特殊权限

描述:在Linux中,除了rwx之外,还有三个特殊权限,分别是SUIDSGIDSBIT,其类似于普通文件权限表示方法。

SetUID 权限 - 文件拥有者权限

描述:SetUID 的功能只有可执行的二进制程序才能设定SUID权限, 用于以非root用户来指向root所属者的可执行文件库,所以在排查服务器安全问题时,可以检查Linux那些不可信的可执行程序具有SUID权限;

简单的说:

  • 命令执行者对该程序拥有x执行权限

  • 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件属主)

  • 当可执行文件具有SetUID权限时,以普通用户身份执行命令时才会切换到文件所有者的身份(普通用户灵魂附体)

温馨提示:SetUID 权限只在该程序执行过程中有效,即执行身份改变只在程序执行过程中有效。

语法示例

# 设置 SetUID
chmod 4755 文件名
chmod u+s 文件名

# 取消 SetUID
chmod 0755 文件名
chmod u-s 文件名

实际案例

# 1.shadow只有超级用户才能更改,但为什么自己能改自己的密码呢?
ll /etc/shadow  #保存密码文件
  ---------- 1 root root 867 6月  25 16:22 /etc/shadow
ll /usr/bin/passwd
  -rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd  # 注意这里s权限
# 这个指令有SetUID权限执行的时候 ,自己的身份就会这个文件所有者身份,所以就能改密码了

# 2.为geek设置SetUID权限
chmod u+s /bin/geek

温馨提示:危险的SUID权限危险目录应严格控制写权限, 比如"/","/usr"等

温馨提示:对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限,下面脚本使用find命令针对SUIDSGID权限查找:

#!/bin/bash
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
# 搜索系统系统中所有有SUID和SGID的文件,并保存到临时目录中
for i in $(cat /tmp/setuid.check)
# 循环去除文件中的文件名
do
  grep $i /root/suid.log > /dev/null
  #比对这个文件名是否在模板文件中
  if[ "$?" != "0" ]
  #检测上一个命令的返回值,如果不成功,上面报错
  then
    echo "$i isn't in listfile!" >> /root/suid_log_$(data+%F)
    #如果文件名在模板文件中,则输出错误信息,并把错误写到日志中
  fi
done
rm -rf /tmp/setuid.check


# 执行结果(默认存在SUID和SGID权限的文件)
/run/log/journal
/run/log/journal/985306ae4b484b90bba97f8d2c2b0b7f
/usr/bin/fusermount
/usr/bin/wall
/usr/bin/mount
/usr/bin/su
/usr/bin/chfn
/usr/bin/write
/usr/bin/chsh
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/umount
/usr/bin/pkexec
/usr/bin/crontab
/usr/bin/ssh-agent
/usr/bin/passwd
/usr/bin/Xorg
/usr/bin/at
/usr/bin/sudo
/usr/bin/locate
/usr/bin/staprun
/usr/sbin/pam_timestamp_check
/usr/sbin/unix_chkpwd
/usr/sbin/lockdev
/usr/sbin/netreport
/usr/sbin/usernetctl
/usr/sbin/userhelper
/usr/sbin/postdrop
/usr/sbin/mount.nfs
/usr/sbin/postqueue
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/lib64/dbus-1/dbus-daemon-launch-helper
/usr/lib64/vte-2.90/gnome-pty-helper
/usr/libexec/utempter/utempter
/usr/libexec/openssh/ssh-keysign
/usr/libexec/pulse/proximity-helper
/usr/libexec/qemu-bridge-helper
/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
/usr/libexec/spice-gtk-x86_64/spice-client-glib-usb-acl-helper

SetGID 命令 - 文件组权限

描述: SetGID 可以设置文件或目录的sgid权限,其中针对文件的作用,只有可执行的二进制程序才能设置SGID权限:

  • 命令执行者对该程序有x执行权限

  • 命令执行在执行过程的时候,组身份升级为该程序文件的属主(在执行程序的过程中灵魂附体为文件属主)

  • SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变在程序执行过程中有效

SetGID 针对目录的作用:

  • 普通用户必须对此目录有r和x权限才能进入此目录 (目录最大权限w、文件最大权限x)

  • 普通用户在此目录中的有效组会变成此目录的属组 (组灵魂附体)

  • 若普通用户对此目录有w权限时,新建的文件的默认属组是这个目录的属组,通常用于创建一个协作目录。

操作案例:

# 设定 SetGID
chmod 2755 文件名
chmod g+s 文件名

# 取消 SetGID
chmod 0755 文件名
chmod g-s 文件名

操作实例:

# 1.比如ubuntu系统中mlocate.db是可执行二进制程序,可以赋予SGID权限
-rwx--s--x 1 root slocate 35612 8月 24 2010 /usr/bin/locate
ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1838850 1月 20 04:29 /var/lib/mlocate/mlocate.db

# 2. 比如:执行用户lamp对/usr/bin/locate命令拥有执行权限
# 当执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db数据库有r权限,所以普通用户可以使用locate
# 命令查询mlocate.db数据库
# 命令结束,lamp用户的组身份返回lamp组

Sticky BIT 权限

描述:SBIT 也叫粘着位权限目前只对目录有效, 用于防止非目录所有者删除或移动目录下的文件,只有root用户或目录所有者才能删除或移动目录下的文件。

简单的说,我们不能删除别人的文件,那我们可以修改别人文件内容啊!就算你是root都不能直接删除,而是必须要把sbit权限关闭后才行。

  • 如果没有sbit粘着位权限,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。

  • 如果赋予了sbit粘着位,除了root可以删除所有文件,普通用户就算有w权限也只能删除自己建立的文件,但是不能删除其他用户建立的文件,例如 /tmp 目录的权限drwxrwxrwt

操作案例:

#设置粘着位
chmod 1755 目录名
chmod o+t 目录名

#取消粘着位
chmod 0777 目录名
chmod o-t 目录名

实际案例:

# 1.普通用户无法删除自己创建的文件
$ mkdir -p test/www    # 此时test可以删除www目录下的文件(但必须给test赋予w权限)
$ chmod -R 1777 test/
$ ls -ld test/
  # drwxr-xr-x 2 1777 root 4096 Mar 20 03:11 test/
$ rm -rf test.jsp      # 即使有w权限也不能删除test/www下的文件,但可以修改文件里面的内容
  # rm: 无法删除"test.jsp": 不允许的操作

0x04 文件特殊属性设置

chattr 命令 - 配置文件隐藏权限

描述:设置SBIT粘着位权限后用户可以对其进行删除操作, 但假如我们不想他更改里面的信息得话就需用此命令,以及防止 root 用户误删除或修改文件。

语法参数:

# 语法:
chattr [+-=][ASaxdistu]文件或目录名
chattr [ -RVf ] [ -v version ] [ -p project ] [ mode ] files
+ - =  增加  删除  等于 某权限

# 选项
A # 访问文件或者目录时候atime将不会被修改;
S # 进行任何文件的修改该改动会同步写入到磁盘之中;
d # 在dump执行时该文件或者目录将不会被dump备份

i # 如果对文件设置i属性,那么 不允许对文件进行删除/改名也不能添加和修改数据;   (不能对文件做任何修改)
  # 如果对目录设置i属性,那么 只能修改目录下文件的数据,但不允许建立和删除、重命名文件; (修改文件)

a # 如果对文件设置a属性,那么 只能在文件中增加数据,但是不能删除也不能修改数据; (对文件增加数据)
  # 如果对目录设置a属性,那么 只允许在目录中建立和修改文件,但是不允许删除;    (建立修改文件)

s # 文件删除时其将被完全从这个硬盘空间中删除;
u # 与s相反当使用u来配置文件时,如果该文件被删除了它,从这个硬盘空间中任然可以将其找回;
c # 默认将文件或目录进行压缩
x # 可以直接访问压缩文件的内容

实际案例:

# 1.为目录设置特殊属性,使得目录www不能删除和创建文件。
chattr +i www/
cd www/ && touch www
  # touch: 无法创建"www": 权限不够

# 2.添加文件i权限不能删除与修改,以及添加内容。
chattr +i weiyieek.txt
echo 全栈工程师修炼指南 > weiyigeek.txt
  -bash: weiyigeek.txt: Operation not permitted

# 3.不需要修改文件但是可以创建文件(只能追加)
chattr +a /var/log/.backups
chattr -R +a /var/log/.history 

# 4.设置文件不可修改删除和修改数据,但是可以追加数据
chattr +a /var/log/.backups
echo 全栈工程师修炼指南 > weiyigeek.txt

温馨提示:此命令有的参数只能在Ext2/Ext3/Ext4的文件系统上执行,其他文件系统可能无法支持该命令,可能会报chattr: Inappropriate ioctl for device while reading flags on hello.txt错误;

$df -Th | grep "ext4"
/dev/mapper/ubuntu--vg-lv--0                                                                     ext4       97G   54G   39G  58% /
/dev/sda2                                                                                        ext4      974M  307M  600M  34% /boot

lsattr 命令 - 文件隐藏权限查看

描述:此命令主要用于查看针对文件或者目录设置 chattr 的权限信息;

语法参数:

lsattr [-adR]  文件名

# 选项:
-a 显示所有文件和目录
-d 若目标是目录仅列出目录本身的属性,而不是子文件的属性
-D 显示属性的名称、默认值
-E 显示从用户设备数据库中获得属性的当前值
-R 连同子目录的数据也一并列出来

实际案例

# 1.查看指定目录的的隐藏权限属性
chattr +i ww/
lsattr -d ww/ #目录
  ----i----------- ww/

chattr +a ww/
lsattr -a ww/  #文件
  -----a---------- ww/.   # 关键点 a
  ---------------- ww/..
  
# 2.设置文件隐藏属性与查看
# The 'j' option is only useful for ext3 and ext4 file systems.
chattr +aij weiyigeek.txt
lsattr weiyigeek.txt
  ----ia---j--- weiyigeek.txt

# 3.查找设置了文件隐藏特殊权限的文件目录
find . | xargs -I file lsattr -a file 2>/dev/null | grep "^----i"
  ----i----------- ./ww
  ----i----------- ./ww/

0x05 文件访问控制列表

描述:ACL(Access Control List)是由一系列的Access Entry所组成的,每一条Access Entry定义了特定的类别可以对文件拥有的操作权限。

从上面文件和目录的权限我们就能看出大概就三种权限所有者权限/组权限/其他权限,但是有时候不够用的时候就需要ACL权限,来解决用户身份不够的问题。

自动创建的规则: 文件目录仅包含3个基本的acl规则, 为了使规则能正常执行,需要满足以下规则。

Access Entry 有三个组成部分:

  • Entry tag type

  • qualifier (optional:username、groupname)

  • permission (RWX 0777)

# Access Entry 都是由三个被:号分隔开的字段所组成,第一个就是 Entry tag type。
# 例如 u:用户名:权限,g:组名:权限,o:其他用户:权限。mask:其他用户:权限。
- user 对应了ACL_USER_OBJ和ACL_USER 
- group 对应了ACL_GROUP_OBJ和ACL_GROUP
- mask 对应了ACL_MASK
- other 对应了ACL_OTHER
 
# Entry tag type 类型:
类型  说明
ACL_USER_OBJ:  相当于Linux里file_owner的permission(原本所有者)
ACL_USER:  定义了额外的用户可以对此文件拥有的permission
ACL_GROUP_OBJ:  相当于Linux里group的permission (原本所属组)
ACL_GROUP:  定义了额外的组可以对此文件拥有的permission
ACL_MASK:  定义了ACL_USER,ACL_GROUP_OBJ和ACL_GROUP的最大权限
ACL_OTHER:  相当于Linux里other的permission

查看分区是否开启ACL权限

步骤1.查看分区ACL权限是否开启

dumpe2fs -h /dev/sda5   #当分区类型为ext* 才有效
#-h  仅显示超级块中信息,而不显示磁盘块的详细信息
Default mount options:    user_xattr acl  #注意这里的ACL说明分区是支持acl的

步骤2.临时开启分区ACL权限

mount -o remount,acl /      #重新挂载根分区,并挂载加入acl权限

步骤3.永久开启分区ACL权限

$vi /etc/fstab
UUID=c2ca6f57-b15c-43ea=bca0-f239083d8bd2 / ext4 defaults,acl 1(#启动是否需要检测) 1(#启动是否需要备份)   #加入acl
$mount -o remount / #然后重写挂载

特别注意:xfs文件系统似乎已经默认/强制开启了acl, 不用在mount时增加acl参数,fstab里加acl参数也被认为是无效的(会报错说acl是不识别选项mount会失败)。

温馨提示:CentOS7 默认文件系统为xfs或者ext文件系统具有ACL功能,但是在 CentOS7 之前使用ext4文件系统的若无ACL,则需mount时增加acl参数。

tune2fs -o acl /dev/sda5   # 临时开启分区ACL权限
mount -o remount,acl /dev/sda5 /mnt/test   # 重新挂载根分区,并挂载加入acl权限

getfacl 命令 - 查看文件访问控制权限

描述:Linux中ACL权限查看与设定,此命令主要是查看文件目录的文件访问控制列表权限;

语法参数

getfacl 文件名|目录

# 参数
--omit-header #不显示文件头部信息

实际案例

# 1.查看文件的acl权限
getfacl test.jsp

# 2.查看目录的acl权限
getfacl rpmbuild/
# file: rpmbuild/
# owner: root
# group: root
# user::rwx
# group::r-x
# other::r-x

d65804df82c8a9c61fbf7685c15ae155.png

weiyigeek.top-getfacl命令示例

setfacl 命令 - 设置文件访问控制权限

描述:此命令主要是给文件或者目录设置acl权限。

语法参数:

setfacl 选项 文件名

# 主要参数
--test:|测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出。

-m|设定ACL权限
-M|从一个文件读入ACL设置信息并以此为模版修改当前文件或目录的ACL规则
-x|删除指定的ACL权限
-X|从一个文件读入ACL设置信息并以此为模版删除当前文件或目录的ACL规则

-d: |设定默认ACL权限
-R:|递归的对所有文件及目录进行操作。 (只能对目录设置不能对文件)
-L:|跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。
-P:|跳过所有符号链接,包括符号链接文件。

-b 删除所有的ACL权限,基本的acl规则(所有者,群组,其他)将被保留。
-k 删除默认ACL权限,如果没有缺省规则,将不提示。

--set=acl| 设置当前文件的ACL规则,注意一定要写全包含UGO设置
--set-file=file| 从文件读入ACL规则来设置当前文件或目录的ACL规则

-n:|不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。
--mask:|重新计算有效权限,即使ACL mask被明确指定。
--restore=file:|从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除--test以外的任何参数一同执行。

# ACL规则格式:
[d[efault]:] [u[ser]:]uid [:perms] 指定用户的权限,文件所有者的权限(如果uid没有指定)。
[d[efault]:] g[roup]:gid [:perms] 指定群组的权限,文件所有群组的权限(如果gid未指定)
[d[efault]:] m[ask][:] [:perms] 有效权限掩码 
[d[efault]:] o[ther] [:perms] 其他的权限 

# 比如:
setfacl -x u:用户名 文件名
setfacl -x g:组名 文件名

其他说明:

# 提示数据
- 选项-m和-x后边跟以acl规则。多条acl规则以逗号(,)隔开。选项-M和-X用来从文件或标准输入读取acl规则。
- 选项--set和--set-file用来设置文件或目录的acl规则,先前的设定将被覆盖。
- 选项-m(--modify)和-M(--modify-file)选项修改文件或目录的acl规则。
- 选项-x(--remove)和-X(--remove-file)选项删除acl规则。
- Perms域是一个代表各种权限的字母的组合:读-r写-w执行-x(也可设置为八进制格式),执行只适合目录和一些可执行的文件。

实际案例:

# 1.给其他指定用户weiyigeek设置rw权限
$ setfacl -m u:weiyigeek:rx /home/test.jsp
$ getfacl test.jsp
# file: test.jsp
# owner: root
# group: root
# user::rw-
# user:weiyigeek:rw-
# group::r--
# mask::rw-  #mask是用来指定最大有效权限的。user1:rwx & mask:rw- 与得到:rw-
# other::r--

# 设置后您ll进行查看权限发现权限上会多了个+号
# 当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我们就可以称它为ACL文件,这个+号就是用来提示我们的。
  -rw-rw-r--+ 1 root root 1057 6月  20 09:13 test.jsp
  
# 2.给组tgroup2设定和#先让用户weiyigeek拥有对test.txt文件的读写权限:
$ setfacl -m g:tgroup2:rwx test.jsp
$ setfacl -m user:weiyigeek:rw- ./test.txt
$ getfacl --omit-header ./test.txt
 user::rw-
 user:weiyigeek:rw-
 group::rw-
 mask::rw-
 other::r--

# 3.让用户weiyigeek也对test.sh具有和root一样的permission。(ACL_MASK重点)
-rwxrw-r-- 1 root admin 0 Jul 3 23:10 test.sh   # 原本权限
$ getfacl -m user:weiyigeek:rwx ./test.sh 
$ getfacl --omit-header ./test.sh 
user::rwx user:weiyigeek:rwx   # weiyigeek已经拥有了rwx的permission,mask值也被设定为rwx,那是因为它规定了ACL_USER,ACL_GROUP和ACL_GROUP_OBJ的最大值
group::rw-
mask::rwx
other::r--
-rwxrwxr--+ 1 root admin 0 Jul 3 23:10 test.sh 

# 4.Linux中ACL最大权限与删除,删除这个文件会文件夹的所有ACL权限
setfacl -m u:user1:rwx test.jsp
setfacl -x u:user1:rwx test.jsp
setfacl -b test.jsp    #删除这个文件的所有的ACL权限
-rw-r--r-- 1 root root 1057 6月  20 09:13 test.jsp  #没有加号了


# 5.递归ACL权限示例
#Default ACL 是指对于一个目录进行Default ACL设置,这就需要递归递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限
setfacl -m u:weiyigeek:rwx -R ./test/    #-R 选项、递归只能对目录设置不能对文件
#对目录使用递归权限  本来不想给权限 结果给了出现权限溢出,不是默认的ACL权限 命令执行之后新建的目录不会有ACL权限
# 重新对./test/ -R进行设置ACL权限

93c31c98b1e0de4646d8d539495f2fea.png

weiyigeek.top-ACL权限示例5

Q: 那么如果现在admin组的用户想要执行test.sh的程序会发生什么情况呢?

它会被permission deny,原因在于实际上admin组的用户只有read and write permission,这里当中显示的rwx是ACL_MASK的值而不是group的permission。

Q: 假如现在我们设置test.sh的mask为read only,那么admin组的用户还会有write permission吗?

# ACL_mask重要性
setfacl -m mask::r-- ./test.sh
getfacl --omit-header ./test.sh
# user::rwx
# user:weiyigeek:rwx   #effective:r--
# group::rw-      #effective:r--
# mask::r--
# other::r--
#ACL_MASK的定义规定了ACL_USER,ACL_GROUP_OBJ和ACL_GROUP的最大权限。
#那么在我们这个例子中他们的最大权限也就是read only。虽然我们这里给ACL_USER和ACL_GROUP_OBJ设置了其他权限,但是他们真正有效果的只有read权限。
-rwxr--r--+ 1 root admin 0 Jul 3 23:10 test.sh #的group permission也会显示其mask的值

# 6.默认ACL权限的作用时如果给父目录设定了默认的ACL权限,那么父目录中所有新建的文件都会继承父目录的ACL权限
setfacl -m d:u:weiyigeek:rw -R /home/test   #d表示 default  默认  
# 由于test的group::r-x没有写权限,我们拿weiyigeek用户测试不能建立文件和directory,或是使用root用户进行新建

# 所有在此目录下建立的文件都可以被weiyigeek用户所访问
$setfacl -d -m user:weiyigeek:rw ./dir
$getfacl --omit-header ./dir
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:weiyigeek:rwx
default:group::rwx
default:mask::rwx
default: other::r-x

# 现在root用户在dir下建立一个test.txt文件。
$ touch ./dir/test.txt
$ ls -l ./dir/test.txt
  -rw-rw-r--+ 1 root root 0 Jul 3 23:46 ./dir/test.txt
$ getfacl --omit-header ./dir/test.txt
user::rw-
user:weiyigeek:rw- # weiyigeek用户自动就有了read and write permission,
group::rwx # effective:rw-  
mask::rw-
other::r--

# 7.将f1.txt的acl权限赋值给f2.txt
getfacl f1.txt | setfacl --set-file=- f2.txt

# 8.单独为f1.txt设置umask权限
setfacl -m mask::rx f1.txt

# 9.使用--set参数来设用户和组ACL权限,并且替代原有的ACL权限,所以ugo必须设置完整
setfacl --set u::rw,u:weiyigeek:rw,g::r,o::- f1.txt

注意事项:

  • 如果我给用户赋予了ACL权限,是需要和mask的权限“与”才能得到用户的真正权限,(同则同)

  • 当在不支持ACLs的文件系统上使用setfacl命令时,setfacl将修改文件权限位

  • 如果acl规则并不完全匹配文件权限位,setfacl将会修改文件权限位使其尽可能的反应acl规则,并会向standard error发送错误消息,以大于0的状态返回。

  • 如果用chmod命令改变Linux file permission的时候相应的ACL值也会改变,反之改变ACL的值,相应的file permission也会改变。

  • mv命令将会默认地移动文件的ACL属性,同样如果操作不允许的情况下会给出警告。

chacl 命令

描述:chacl是一个与IRIX兼容的命令,它是为那些熟悉XFS或IRIX使用它的用户维护的,可用来改变文件和目录的Access ACL and Default ACL,它的具体参数大家可以去看man page,一般情况下不会使用到。

语法参数:

# Usage:
  chacl acl pathname...
  chacl -b acl dacl pathname...
  chacl -d dacl pathname...
  chacl -R pathname...
  chacl -D pathname...
  chacl -B pathname...
  chacl -l pathname...    [not IRIX compatible]
  chacl -r pathname...    [not IRIX compatible]

# Option
-b 表示有两个ACL要更改,第一个是文件访问ACL,第二个是目录默认ACL
-d 用于仅设置目录的默认ACL
-R 仅删除文件访问ACL
-D 仅删除目录默认ACL
-B 彻底删除所有ACL
-l 列出访问ACL,可能还有与指定文件或目录相关联的默认ACL。此选项是在XFS的Linux端口期间添加的,与IRIX不兼容
-r 为根位于路径名的每个子树递归地设置访问ACL。此选项也是在XFS的Linux端口期间添加的,与IRIX不兼容

使用示例:

# 1.最小 ACL 权限
chacl u::rwx,g::r-x,o::r-- file.txt

# 2.文件ACL的设置使文件的所有者具有“rwx”,文件的组具有读取和执行权限,其他人具有对文件的只读访问权限。
chacl u::rwx,g::r-x,o::r--,u:bob:r--,m::r-x f1.txt f2.txt

# 3.要将newdir上的默认ACL和访问ACL设置为与olddir上的相同,可以键入:
chacl -b `chacl -l olddir | sed -e 's/.*\[//' -e 's#/# #' -e 's/]$//'` newdir

如果此篇文章对你有帮助,请你将它分享给更多的人! 

温馨提示:作者最近10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者账号[WeiyiGeeker],当前价格¥199,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!

8516f03edfaef92bf7483dd17efc9ea2.png


 学习推荐 往期文章

关注回复【加群】加入学习交流群,目前已经有许多志同道合的IT行业的朋友!

ae31aabd45cf585644516acfbec87ae4.gif

此文,若对看友您有帮助请帮忙转发,点👍、在看,若有疑问的小伙伴,可在文末留言说说你想法哟!

原文地址:Linux 命令 | 每日一学,文件目录特殊权限相关命令集锦

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈工程师修炼指南

原创不易,赞赏鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值