如何使用setfacl和getfacl管理Linux ACL
Linux命令setfacl允许用户在文件和目录上设置广泛的访问控制列表。
通常,使用chmod命令,我们将能够为所有者/组/其他的权限设置权限。
但是,如果我们可能需要为其他用户提供文件权限,这也无法使用CHMod完成。
SetFacl将摆脱这样的麻烦。
例如,我们无法为同一目录或者文件上的不同用户设置不同的权限集。
因此,实现了访问控制列表(ACL)。
我们可以使用getfacl命令查看文件和目录上的当前ACL。
要在文件/目录上使用setfacl,驻留文件系统应启用ACL支持。
如果文件系统不支持ACL,则会获得"不支持操作"错误。
在这种情况下,我们需要将ACL支持添加到/etc/fstab中的文件系统,如下所示,然后重新安装文件系统。
检查内核是否具有ACL支持
运行以下命令以检查文件系统和posix_acl = y选项的ACL支持(如果有n而不是y,则表示内核不支持ACL,需要重新编译)。
root@theitroad:/home# grep -i acl /boot/config* CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_REISERFS_FS_POSIX_ACL=y CONFIG_JFS_POSIX_ACL=y CONFIG_XFS_POSIX_ACL=y CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_FS_POSIX_ACL=y CONFIG_GENERIC_ACL=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_HFSPLUS_FS_POSIX_ACL=y CONFIG_F2FS_FS_POSIX_ACL=y CONFIG_NFS_V3_ACL=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3_ACL=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_CIFS_ACL=y CONFIG_9P_FS_POSIX_ACL=y
检查文件系统是否支持ACL
你可以尝试这个:
$cat /etc/fstab
在查看FSTAB的某些系统上,如果文件系统支持ACL,则不会向我们展示,而是仅显示"默认值"作为装入选项:
root@theitroad:/home# cat /etc/fstab LABEL=cloudimg-rootfs / ext4 defaults 0 0
在这种情况下,我们可以使用以下命令检查文件系统是否安装了ACL支持:
root@theitroad:/home# tune2fs -l /dev/sda1 tune2fs 1.42.9 (4-Feb-2014) Filesystem volume name: cloudimg-rootfs Last mounted on: / Filesystem UUID: 2e294961-ce03-483e-a53e-ff3fc4514bd4 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: user_xattr acl
如果文件系统未安装"ACL"选项,则可以重新安装它,以提供所需的选项:
# mount -o remount -o acl /dev/sda1
检查是否需要软件包
要使用Linux ACL,请确保安装了所需的软件包。
以下是需要使用yum或者apt-get安装所需的包。
对于基于Redhat的系统:
$sudo yum install nfs4-acl-tools acl libacl
基于Debian:
$sudo apt-get install nfs4-acl-tools acl
现在我们可以通过各种用法"setfacl"命令。
首先,我们应该创建一个名为"test_folder"的文件夹作为root用户。
root@theitroad:/home# mkdir test_folder root@theitroad:/home# getfacl test_folder/ # file: test_folder/ # owner: root # group: root user::rwx group::r-x other::r-x
1.为个人用户提供ACL
假设,我们希望在目录"test_folder"目录上完全访问用户"test"(它可以是任何用户)。
这可以使用setfacl完成如下。
root@theitroad:/home# setfacl -m u:test:rwx test_folder/ root@theitroad:/home# getfacl test_folder/ # file: test_folder/ # owner: root # group: root user::rwx user:test:rwx group::r-x mask::rwx other::r-x
2.为组的所有用户提供ACL
如果我们想为文件夹"test_folder"文件夹"testg"的所有用户提供写访问权限,则可以通过以下方式执行以下操作。
root@theitroad:/home# setfacl -m g:testg:w test_folder/ root@theitroad:/home# getfacl test_folder/ # file: test_folder/ # owner: root # group: root user::rwx user:test:rwx group::r-x group:testg:-w mask::rwx other::r-x
3.撤消用户/组的ACL
如果要撤消为用户测试和组testg提供的权限,则可以使用setfacl命令如下。
root@theitroad:/home# setfacl -x u:test,g:testg test_folder/ root@theitroad:/home# getfacl test_folder/ # file: test_folder/ # owner: root # group: root user::rwx group::r-x mask::rwx other::r-x
4.将一个文件/目录的ACL复制到另一个文件/目录
假设,我们也希望在Test_Folder1上具有相同的ACL Test_Folder集,可以通过按如下方式复制ACL来设置它。
root@theitroad:/home# getfacl test_folder acl.txt root@theitroad:/home# mkdir test_folder1 root@theitroad:/home# setfacl -M acl.txt test_folder1/ root@theitroad:/home# getfacl test_folder1/ # file: test_folder1/ # owner: root # group: root user::rwx user:test:rwx group::r-x group:testg:-w mask::rwx other::r-x