通过 NFS 进行复制时不遵守 ACL 默认值

通过 NFS 进行复制时不遵守 ACL 默认值

我有一个 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位在共享文件夹中,强制执行文件夹的正确权限以允许组共享。

换句话说,执行相同的配置以按组共享文件夹,就好像没有一样前交叉韧带已生效。

相关内容