我有一个 Arch Linux 盒子,里面有一个通过 NFS 安装的 Ubuntu 服务器上的文件夹。我已经在服务器上的文件夹上设置了访问控制列表,以便任何新文件都应该设置其权限-rwx-r-x---
。
user1@ubuntu:~$ getfacl home/user2/shared/
# file: home/user2/shared/
# owner: user2
# group: remoteusers
user::rwx
group::r-x
other::---
default:user::rwx
default:user:user2:rwx
default:group::r-x
default:group:remoteusers:r-x
default:mask::rwx
default:other::---
如果我创建一个文件,权限设置得很好:
userA@arch:~$ touch ubuntuNFS/test.txt
userA@arch:~$ ls -la ubuntuNFS
-rw-r----- 1 ########## ########## 0 Nov 13 2013 test.txt
但如果我复制文件,该组不会被授予任何权限:
userA@arch:~$ cp Videos/video.mp4 ubuntuNFS/
userA@arch:~$ ls -la ubuntuNFS
-rw------- 1 ########## ########## 0 Nov 13 2013 video.mp4
-rw-r----- 1 ########## ########## 0 Nov 13 2013 test.txt
为什么不cp
遵守 ACL 默认值?
答案1
我认为 NFS 中以各种方式偶尔支持 ACL。请参阅 NFS 项目网站上的这篇文章。
如果这不是问题,那么我会非常怀疑cp
。我似乎记得有关命令cp
不完全复制 ACL 的问答,无论目标安装类型如何。
我相信这是 U&L Q&A 的标题:使用 setfacl 允许组成员写入目录中的任何文件这让我想到了这个 SF 问答,标题为:为什么 cp 不尊重 ACL?。
讽刺的是,我们自己的 @Gilles 在 SF Q&A 上写了一个答案,解释了为什么cp
不支持 ACL 的传播。我相信现在的情况还是这样!
摘自@吉尔斯回答
如果 cp 创建目标文件,它将复制源文件的权限,但 umask 中设置的位除外。这是标准行为(参见例如步骤 3.b)单一 Unix v3 (POSIX 2001) 规范。
为什么cp要这样设计呢?因为在很多情况下这种行为是可取的,例如,当原始权限受到限制时保留文件的隐私,并且保留可执行性几乎总是正确的做法。然而不幸的是,甚至 GNU cp 也没有选项来关闭此行为。
大多数复制工具(例如 pax、rsync)的行为方式相同。您可以通过将源与目标解耦(例如使用 cat foo/baz)来确保使用默认权限创建文件。
例子
我设置了以下文件,afile
并向其中添加了 ACL。
$ touch afile
$ setfacl -m user:sam:rwx,group:users:rwx afile
我们现在有:
$ getfacl afile
# file: afile
# owner: root
# group: root
user::rw-
user:sam:rwx
group::r--
group:users:rwx
mask::rwx
other::r--
当我将这些文件复制到 NFSv3 共享时:
$ cp afile ~sam/
$ getfacl ~sam/afile
getfacl: Removing leading '/' from absolute path names
# file: home/sam/afile
# owner: root
# group: root
user::rw-
group::rwx
other::r--
ACL 丢失。尝试使用--preserve
开关来cp
:
$ cp --preserve afile ~sam/
cp: preserving permissions for `/home/sam/afile': Operation not supported
cp: preserving ACL for `/home/sam/afile': Operation not supported
在 NFS 上启用 ACL
在 NFS 挂载上启用 ACL 似乎也没有效果:
mulder:/export/r1/home/sam on /home/sam type nfs (rw,intr,tcp,nfsvers=3,acl,rsize=16384,wsize=16384,addr=192.168.1.1)
$ cp --preserve afile ~sam/
cp: preserving permissions for `/home/sam/afile': Operation not supported
cp: preserving ACL for `/home/sam/afile': Operation not supported
相同的硬盘工作正常
--preserve
有趣的是,当在同一个 EXT4 安装驱动器上本地复制文件时,该开关确实起作用。
$ cp --preserve afile afile2
$ getfacl afile2
# file: afile2
# owner: root
# group: root
user::rw-
user:sam:rwx
group::r--
group:users:rwx
mask::rwx
other::r--
前进的道路?
在我的研究和实验中,NFSv4 以下的任何内容似乎都不支持 ACL。cp
只要底层文件系统支持 ACL,该命令似乎就能够保留 ACL。
我找到了这篇文章:项目:NFS 版本 4 开源参考实现,其中讨论了 NFSv4 中 ACL 的使用。因此,我希望将 ACL 复制到 NFSv4 共享是可能的,但我不认为使用 NFSv2 或 NFSv3 是可能的。
参考
答案2
一个可能的解决方案是强制掩码以保存前交叉韧带。
赋予必须共享相同组和所有者权限的用户,并设置SGID位在共享文件夹中,强制执行文件夹的正确权限以允许组共享。
换句话说,执行相同的配置以按组共享文件夹,就好像没有一样前交叉韧带已生效。