ls -l 最后的+就是ACL,是chmod的增强功能。有时候明明ls-l看着两个文件的权限完全相同,但是就是访问不了,可能就是ACL的原因了。尤其是从其他机器上scp传输的文件使用了-p保留了文件的属性的情况下,就更容易出现这样的情况了。
查看文件的acl权限
$ getfacl filename
设置文件的acl权限
$ setfacl -m u:username:rwx filename
设置新建文件的默认权限(-d 要写在-m前面,我也不知道为什么)
$ setfacl -d -m u:username:rwx filename
移除文件的ACL控制
$ setfacl -b filename
上面是针对单个文件的情况,如果是目录需要递归需要加上-R(-R要放在-d和-m的前面)
$ setfacl -R -m u:username:rwx filename
$ setfacl -R -d -m u:username:rwx filename
上面这些还不算完,如果你使用chmod更改了文件权限,比如改成了700,那么恭喜你,你的acl坏了。
如果你getacl,你会看到下面的样子(片段)
user:username:rwx #effective:—
group::rwx #effective:—
mask::—
因为你的chmod导致你的mask变成了—,后面的#effective注释是在告诉你实际起作用的权限,也就是设置的权限和mask与之后的结果。由于mask是000,那与之后肯定也是000,那当然就是没有权限了。
这个时候你要么重新设置一下权限,要么修改一下mask。
所以一定要记住,chmod之后要修改acl权限。
拷贝文件夹的ACL的权限
getfacl dir1 | setfacl -b -n -M - dir2
-b :清除dir2的ACL;-n不重新计算权限掩码;-从stdin读入
拷贝文件的ACL权限
getfacl file1 | setfacl --set-file=- file2
拷贝文件夹的ACL权限作为默认权限
getfacl -a /path/to/dir | setfacl -d -M- /path/to/dir
https://wiki.archlinux.org/index.php/Access_Control_Lists