感谢支持
我们一直在努力

Linux系统中文件权限ACL功能

通过ACL功能配置的权限优先级高于通过chmod命令配置的普通权限,比如某文件的所有者和拥有组是charles,该文件的普通权限是755,也就是说除了charles和root用户以外的用户是没有写入权限的,但是通过通过ACL配置了oliva用户对该文件有写权限,那么oliva用户对该文件是有写权限的。


在使用“ls -l”或“ll”命令浏览文件或目录时,在权限部分多了一个“+”表示该文件或目录已经配置了ACL功能。


[root@srv tmp]# ll


total 8


drwxrwxr-x+ 2 root root 4096 Feb 15 23:25 ada


配置分区支持ACL功能


在RHEL 5.x中只有在安装操作系统时建立的分区才支持ACL功能,其他分区在默认情况下是不支持ACL功能。如果希望让那些在安装操作系统完成后建立的分区支持ACL功能可以使用以下几种方法。


(1)      使用tune2fs命令。tune2fs功能非常多,但这里重点说明与ACL有关的功能。使用tune2fs命令让一个分区永久支持ACL功能,该命令配置分区支持ACL的语法如下。


tune2fs -o acl 分区


在下面的例子中使用tune2fs命令使/dev/sda12永久支持ACL功能,在配置完成后,可通过“tune2fs -l分区”命令查看。


l  使/dev/sda12永久支持ACL功能


[root@srv ~]# tune2fs -o acl /dev/sda12


l  使用-l选项可查看分区的配置情况。


[root@srv ~]# tune2fs -l /dev/sda12   


tune2fs 1.39 (29-May-2006)


Filesystem volume name:   <none>


Last mounted on:          <not available>


Filesystem UUID:          8c54398d-e4c8-4777-9d09-26eed1041049


Filesystem magic number:  0xEF53


Filesystem revision #:    1 (dynamic)


Filesystem features:      has_journal resize_inode dir_index filetype sparse_super


#在“Default mount options:”的值中包括“acl”就说明该分区支持ACL功能。


Default mount options:    acl


Filesystem state:         clean


Errors behavior:          Continue


Filesystem OS type:       Linux


(2)      使用mount命令。使用mount命令让一个分区临时支持ACL功能(在重新启动计算机后ACL会失效),该命令配置分区支持ACL的语法如下。


mount -o remount,acl 分区


mount -o acl 分区 挂载点


使用mount命令让一个分区临时支持ACL功能时,可以使用以上二种方式。第一种使用在分区已经被挂载的情况,也就是说这个分区已经在使用但还不支持ACL功能,在不影响分区使用的情况下重新挂载分区使其支持ACL功能;第二种使用在一开始挂载分区时就使其支持ACL功能。在下面的例子中使用mount命令使分区临时ACL功能,在配置完成后,可通过“mount”命令查看。


l  使用mount命令使一个已经挂载的分区(/dev/sda13)支持ACL功能。


[root@srv ~]# mount -o remount /dev/sda13


l  使用mount命令挂载/dev/sda14分区并支持ACL功能。


[root@srv ~]# mount -o acl /dev/sda14 /media/sda14


[root@srv ~]# mount   #使用mount命令查看。


/dev/sda7 on / type ext3 (rw)


proc on /proc type proc (rw)


sysfs on /sys type sysfs (rw)


devpts on /dev/pts type devpts (rw,gid=5,mode=620)


/dev/sda8 on /tmp type ext3 (rw)


/dev/sda6 on /var type ext3 (rw)


/dev/sda3 on /home type ext3 (rw)


/dev/sda2 on /usr type ext3 (rw)


/dev/sda5 on /usr/local type ext3 (rw)


/dev/sda1 on /boot type ext3 (rw)


tmpfs on /dev/shm type tmpfs (rw)


/dev/sda10 on /media/sda10 type ext3 (rw)


/dev/sda11 on /media/sda11 type ext3 (rw,acl)


none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)


none on /proc/fs/vmblock/mountPoint type vmblock (rw)


sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)


#如果分区支持ACL功能时,在挂载信息中会显示出来。


/dev/sda13 on /media/sda13 type ext3 (rw,acl)


/dev/sda14 on /media/sda14 type ext3 (rw,acl)


(3)      修改/etc/fstab文件,使分区永久支持ACL功能。在/etc/fstab文件中在需要支持ACL功能分区的挂载选项列中加上“,acl”即可使分区永久支持ACL功能。在下面/etc/fstab文件的例子中/dev/sda10就支持ACL功能。在修改/etc/fstab文件后,为了让配置生效需要重新启动计算机或使用“mount -o remount 分区”命令。





















































































[root@srv ~]# cat /etc/fstab


LABEL=/


/


ext3


defaults       


1 1


LABEL=/tmp


/tmp


ext3   


defaults       


1 2


LABEL=/var


/var


ext3   


defaults       


1 2


LABEL=/home


/home


ext3   


defaults       


1 2


LABEL=/usr


/usr


ext3   


defaults       


1 2


LABEL=/usr/local


/usr/local


ext3   


defaults       


1 2


LABEL=/boot


/boot


ext3   


defaults       


1 2


tmpfs


/dev/shm


tmpfs  


defaults       


0 0


devpts


/dev/pts


devpts 


gid=5,mode=620 


0 0


sysfs


/sys


sysfs  


defaults       


0 0


proc


/proc


proc   


defaults       


0 0


LABEL=SWAP-sda9


swap                   


swap                   


defaults       


0 0


/dev/sda10


/media/sda10


ext3   


defaults,acl


0 0


提示:通过tune2fs命令使分区支持ACL功能后,通过mount命令是无法查看到的,通过修改/etc/fstab使分区支持ACL功能后,通过mount命令可以查看到分区支持ACL功能。


setfacl:配置文件或目录的ACL


在配置了分区支持ACL功能后,就可以使用setfacl命令让文件或目录使用ACL功能配置更精细的权限。在Linux中对文件或目录的权限是可读、可写入、可执行,ACL功能可对不用户的用户配置这些权限,该命令语法如下。


setfacl [-bkdR] [{-m|-x} <ACL规则>] 文件|目录…


常用选项:


l  文件|目录…:需要配置ACL的文件或目录。


l  -m:更改文件或目录的ACL规则。


l  -x:删除文件或目录指定的ACL规则。


l  -b:删除文件或目录所有ACL规则。


l  -k:删除文件或目录默认的ACL规则。


l  -d:指定文件或目录默认的ACL规则。


l  –test:测试模式,不会改变任何文件或目录的ACL规则,操作后的ACL规格将被显示。


l  -R:递归处理,将指定目录下的所有文件及子目录一并处理。


在该命令中指定ACL规则可以使用以下几种方式。


(1)      [d:]u:<UID|用户>:权限:指定用户的ACL,[d:]表示配置用户对文件或目录的默认的ACL,权限可以使用字符或数字。


(2)      [d:]g:<GID|用户组>:权限:指定用户的ACL,[d:]表示配置用户对文件或目录的默认的ACL,权限可以使用字符或数字。


(3)      [d:]o:权限:相关于普通权限中其他用户的权限,[d:]表示配置用户对文件或目录的默认的ACL,权限可以使用字符或数字。


(4)      [d:] m:权限:指定有效权限,[d:]表示配置的默认的权限,权限可以使用字符或数字。

在文件或目录配置了ACL后,如果使用cp命令复制时要保留ACL必须使用“-p”选项,如果使用mv命令移动时默认就会保留ACL。当然前题是目标目录所有分区支持ACL功能。下面看几个setfacl命令的例子。


(1)      配置用户ACL。


l  目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。


[root@srv ~]# cd /tmp   


l  当前目录目前情况。


[root@srv tmp]# ll


total 8


drwxr-xr-x 2 root root 4096 Feb 16 17:15 fringe


drwxr-xr-x 2 root root 4096 Feb 16 17:14 ada


l  配置用户charles对目录fringe有可读、可写权限。


[root@srv tmp]# setfacl -m u:charles:rw fringe/


l  配置用户charles对目录ada有可读、可写、可执行权限。


[root@srv tmp]# setfacl -m u:charles:7 ada/


l  浏览目录时,在权限最后一位是一个“+”表示这二个目录配置了ACL。


[root@srv tmp]# ll


total 16


drwxrwxr-x+ 2 root root 4096 Feb 16 17:15 fringe


drwxrwxr-x+ 2 root root 4096 Feb 16 17:14 ada


l  切换到用户charles。


[root@srv tmp]# su – charles  


[charles@srv ~]$ cd /tmp/ada/


l  在目录ada有写权限了。


[charles@srv ada]$ touch Andy   


(2)      配置用户默认ACL。


l  目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。


[root@srv ~]# cd /tmp   


l  当前目录目前情况。


[root@srv tmp]# ll


total 4


drwxr-xrwx 2 root root 4096 Feb 16 19:53 ada


l  配置用户andy对目录ada的默认ACL是有可读、可写、可执行,当用户andy在目录ada中建立子目录或文件时,会自动继承这个ACL。


[root@srv tmp]# setfacl -m d:u:andy:rwx ada/


l  浏览目录在权限最后一位是一个“+”表示这二个目录配置了ACL。


[root@srv tmp]# ll     


total 8


drwxr-xrwx+ 2 root root 4096 Feb 16 19:53 ada


l  切换到用户andy。


[root@srv tmp]# su – Andy    


[andy@srv ~]$ cd /tmp/ada/


[andy@srv ada]$ mkdir season6


l  建立的子目录自动继承了ACL。


[andy@srv ada]$ ll         


total 8


drwxrwxrwx+ 2 andy andy 4096 Feb 16 20:03 season6


(3)      配置用户组ACL。


l  目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。


[root@srv ~]# cd /tmp   


l  当前目录目前情况。


[root@srv tmp]# ll


total 8


drwxr-xr-x 2 root root 4096 Feb 16 17:24 24


drwxr-xr-x 2 root root 4096 Feb 16 17:24 csi


l  配置用户组ctu对目录24有可读、可写、可执行权限。


[root@srv tmp]# setfacl -m g:ctu:rwx 24


l  配置用户组ctu对目录csi没有任何权限。


[root@srv tmp]# setfacl -m g:ctu:— csi  


l  浏览目录时,在权限最后一位是一个“+”表示这二个目录配置了ACL。


[root@srv tmp]# ll


total 16


drwxrwxr-x+ 2 root root 4096 Feb 16 17:24 24


drwxr-xr-x+ 2 root root 4096 Feb 16 17:24 csi


l  切换到用户tony。


[root@srv tmp]# su – tony     


[tony@srv ~]$ id


l  用户tony属于用户组ctu。


uid=509(tony) gid=509(tony) groups=503(user3),504(user4),509(tony),513(ctu)


l  对目录没有执行权限,所以用户tony无法进入目录csi。


[tony@srv ~]$ cd /tmp/csi  


-bash: cd: /tmp/csi: Permission denied


(4)      配置用户组默认ACL。


l  目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。


[root@srv ~]# cd /tmp   


l  当前目录目前情况。


[root@srv tmp]# ll


total 4


drwxr-xrwx 2 root root 4096 Feb 16 20:12 24


l  配置用户组ctu对目录24的默认ACL是有可执行,当属于用户组ctu的用户在目录24中建立子目录或文件时,会自动继承这个ACL。


[root@srv tmp]# setfacl -m d:g:ctu:x 24


l  浏览目录时,在权限最后一位是一个“+”表示这二个目录配置了ACL。


[root@srv tmp]# ll   


total 8


drwxr-xrwx+ 2 root root 4096 Feb 16 20:12 24


l  切换到用户tony。


[root@srv tmp]# su – tony    


l  用户tony属于用户组ctu。


[tony@srv ~]$ id            


uid=509(tony) gid=509(tony) groups=503(user3),504(user4),509(tony),513(ctu)


[tony@srv ~]$ cd /tmp/24


[tony@srv 24]$ mkdir season8


l  建立的子目录自动继承了ACL。


[tony@srv 24]$ ll            


total 8


drwxr-xr-x+ 2 tony tony 4096 Feb 16 20:15 season8


(5)      删除指定ACL。


l  目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。


[root@srv ~]# cd /tmp  


l  使用getfacl命令查看ada目录的ACL,可以发现用户andy对该目录有可读、可写、可执行权限。


[root@srv tmp]# getfacl ada


# file: ada


# owner: root


# group: root


user::rwx


user:tony:—


user:andy:rwx


group::r-x


mask::rwx


other::r-x


l  取消用户andy在目录ada上的ACL。


[root@srv tmp]# setfacl -x u:andy ada


l  再次查看目录ada的ACL时,已经没有用户andy。


[root@srv tmp]# getfacl ada/  


# file: ada


# owner: root


# group: root


user::rwx


user:tony:—


group::r-x


mask::r-x


other::r-x


(6)      删除所有ACL。


l  目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。


[root@srv ~]# cd /tmp 


l  使用getfacl命令查看ada目录的ACL,可以发现用户andy对该目录有可读、可写、可执行权限;用户tony对该目录没有任何权限。


[root@srv tmp]# getfacl ada


# file: ada


# owner: root


# group: root


user::rwx


user:tony:—


user:andy:rwx


group::r-x


mask::rwx


other::r-x


l  删除目录ada上的所有权限。


[root@srv tmp]# setfacl -b ada  


l  再次查看目录ada的ACL时,已经没有任何ACL。


[root@srv tmp]# getfacl ada/    


# file: ada


# owner: root


# group: root


user::rwx


group::r-x


other::r-x

(1)      配置ACL有效权限。


l  目前还没有学习如何建立分区,所以利用现有分区中的tmp目录。


[root@srv ~]# cd /tmp 


l  用户tony对目录24的权限是可读、可写、可执行。


[root@srv tmp]# getfacl 24   


# file: 24


# owner: root


# group: root


user::rwx


user:tony:rwx


group::r-x


mask::rwx


other::r-x


l  切换到用户tony后,可进入目录24,也可以浏览和写入。


[root@srv tmp]# su – tony   


[tony@srv ~]$ cd /tmp/24


[tony@srv 24]$ mkdir Season8


[tony@srv 24]$ ll


total 4


drwxrwxr-x 2 tony tony 4096 Feb 16 20:30 Season8


l  回到root用户。


[tony@srv 24]$ exit         


l  指定目录24有效权限为可读、可执行。


[root@srv tmp]# setfacl -m m:rx 24   


l  切换到用户tony后,可进入目录24,也可以浏览。


[root@srv tmp]# su – tony            


[tony@srv ~]$ cd /tmp/24


[tony@srv 24]$ ll


total 4


drwxrwxr-x 2 tony tony 4096 Feb 16 20:30 Season8


l  但是已经没有了写入权限。


[tony@srv 24]$ mkdir Season7   


mkdir: cannot create directory `Season7′: Permission denied


明明配置了用户tony的ACL中有写入权限,为什么这里没有权限写了呢?这是因为目录24上配置的有效ACL为可读、可权限,Linux会将有效权限于用户或用户组的ACL进行“AND”运行,也就是说只有在有效ACL中有的权限用户或用户组才可能得到。目录24的有效权限是可读、可执行,所以对该目录配置ACL时,最多可以得到这二个权限。即使tony有写权限也是没有意义的。


getfacl:查看文件或目录的ACL


通过“ls -l”或“ll”命令浏览文件或目录时,只能知道文件或目录是否已配置了ACL功能,但具体配置的内容必须使用getfacl命令查看,该命令语法如下。


getfacl [-dR] [–omit-header] [–no-effective] 文件|目录…


常用选项:


l  文件|目录…:需要显示ACL的文件或目录。


l  -d:显示默认的ACL。


l  -R:显示目录及其子目录和文件的ACL。


l  –omit-header:不显示文件或目录的基本信息。


l  –no-effective:不显示有效权限。


getfacl命令可以显示配置了ACL的文件或目录的准确权限,下面看几个getfacl命令的例子。


l  目录fringe权限部分以“+”结尾,说明该目录配置了ACL。


[root@srv tmp]# ll


total 15


drwxr-xr-x+ 2 root root  1024 Feb 16 15:05 fringe


drwx——  2 root root 12288 Feb 16 12:47 lost+found


drwxr-xr-x  2 root root  1024 Feb 16 15:09 weeds


l  显示目录fringe的默认权限。


[root@srv tmp]# getfacl fringe/     


# file: fringe                 #文件或目录的名称。


# owner: root                #文件或目录的的所有者。


# group: root                 #文件或目录的拥有组。


user::rwx                    #文件或目录的所有者权限。


l  用户charles的权限,后面的“#effective”显示的是该用户有效权限。root用户为charles配置的该目录权限是rwx,但由于该目录的有效权限是rx,所以最后该用户实际的权限只有rx。


user:charles:rwx              #effective:r-x


group::r-x        #文件或目录的拥有组权限。


mask::r-x        #文件或目录的最大权限。


other::r-x        #其他用户权限。


提示:在为文件和目录配置了ACL功能后,通过“ls -l”或“ll”命令浏览文件或目录时,拥有组权限位显示的不再是该文件或目录拥有组权限,而是ACL的最大权限,所以要查看文件的准确权限应该使用getfacl命令。

赞(0) 打赏
转载请注明出处:服务器评测 » Linux系统中文件权限ACL功能
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏