描述:相信各位看友都看了UP主上一篇《Linux运维学习之文件目录属性及权限管理笔记》了吧,此篇将针对文件目录特殊权限等相关命令进行详细讲解,包括文件基本权限与特殊权限。
温馨提示:如果小伙伴们在其他平台看到此文章,一定要关注访问作者首发公众号《全栈工程师修炼指南》,给作者持续创作的动力!
知识回顾
-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 (可读不可写可执行)
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
weiyigeek.top-权限对于目录的作用
温馨提示:对文件(File)来讲最高权限是x
执行,对目录(Dir)来讲最高权限是w
写操作,所以在生产环境中应该谨慎。
温馨提示:Linux中权限对文件的作用,特别注意普通用户设置权限对root用户是没用,其是超级管理员。
温馨提示:在运维分配文件基本权限时,核心原则:在最小权限情况下能够实现要求即可,谨慎使用rw-rw-rw- :666
和rwxrwxrwx :777
权限
描述: 此命令用于改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。
温馨提示:用户可以是用户名或者是用户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
weiyigeek.top-chown命令使用示例
描述: 在 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/
描述:此命令常用于对于文件或者目录进行赋予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
描述:用于修改建立文件或者目录的默认权限,前面,我们提到默认情况下用户创建文件与目录的权限如下; 文件:初始权限没有可执行(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
描述:在Linux中,除了rwx之外,还有三个特殊权限,分别是SUID
、SGID
和SBIT
,其类似于普通文件权限表示方法。
描述:SetUID 的功能只有可执行的二进制程序才能设定SUID权限, 用于以非root用户来指向root所属者的可执行文件库,所以在排查服务器安全问题时,可以检查Linux那些不可信的可执行程序具有SUID权限;
简单的说:
温馨提示: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命令针对SUID
和SGID
权限查找:
#!/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 可以设置文件或目录的sgid权限,其中针对文件的作用,只有可执行的二进制程序才能设置SGID权限:
SetGID 针对目录的作用:
操作案例:
# 设定 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组
描述:SBIT 也叫粘着位权限目前只对目录有效, 用于防止非目录所有者删除或移动目录下的文件,只有root用户或目录所有者才能删除或移动目录下的文件。
简单的说,我们不能删除别人的文件,那我们可以修改别人文件内容啊!就算你是root都不能直接删除,而是必须要把sbit权限关闭后才行。
/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": 不允许的操作
描述:设置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
描述:此命令主要用于查看针对文件或者目录设置 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/
描述:ACL(Access Control List
)是由一系列的Access Entry
所组成的,每一条Access Entry定义了特定的类别可以对文件拥有的操作权限。
从上面文件和目录的权限我们就能看出大概就三种权限所有者权限/组权限/其他权限,但是有时候不够用的时候就需要ACL权限,来解决用户身份不够的问题。
自动创建的规则: 文件目录仅包含3个基本的acl规则, 为了使规则能正常执行,需要满足以下规则。
Access Entry 有三个组成部分:
# 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权限
描述: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
weiyigeek.top-getfacl命令示例
描述:此命令主要是给文件或者目录设置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权限
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
注意事项:
描述: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
如果此篇文章对你有帮助,请你将它分享给更多的人!