我有一个要共享的 git(实际上是 git-annex)存储库,其中一部分涉及在多个目录上设置 set-group-id 位。这是在 Debian GNU/Linux Stretch 盒子上,在 ext4 文件系统上。由于某些奇怪的原因,chmod g+s DIRECTORY
被忽略(chmod
为便于阅读,块周围添加了空白行):
$ stat objects
File: objects
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd06h/64774d Inode: 12353692 Links: 260
Access: (0775/drwxrwxr-x) Uid: ( 1000/ anthony) Gid: ( 1025/git-books)
Access: 2018-07-30 14:43:13.831641743 -0400
Modify: 2018-07-28 14:28:14.970667931 -0400
Change: 2018-07-30 14:46:38.179597449 -0400
Birth: -
$ chmod g+s objects
$ echo $?
0
$ stat objects
File: objects
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd06h/64774d Inode: 12353692 Links: 260
Access: (0775/drwxrwxr-x) Uid: ( 1000/ anthony) Gid: ( 1025/git-books)
Access: 2018-07-30 14:43:13.831641743 -0400
Modify: 2018-07-28 14:28:14.970667931 -0400
Change: 2018-07-30 14:50:43.355539381 -0400
Birth: -
到目前为止我检查过的内容:
- 似乎没有任何奇怪的挂载选项(例如,
nosuid
)可能会阻止它工作。我检查了 fstab 和/proc/mounts
,它显示/dev/mapper/slow-srv /srv ext4 rw,relatime,nobarrier,errors=remount-ro,stripe=384,data=ordered 0 0
- 目录上似乎没有任何奇怪的 ACL;可以肯定的是我做到了
setfacl -b objects
。即使这样做了, chmod 仍然无法正常工作。 strace
onchmod
显示系统调用成功,并且设置了 sgid 位:fchmodat(AT_FDCWD, "annex", 02775) = 0
- 同一文件系统上的其他目录设置了 set-group-id 位。事实上,我在同一个会话的前面设置了一些,在不同的 git-annex 存储库中。
事实证明,虽然我在几天前创建了该组并将自己添加到其中,而且我认为这是一个新的 ssh 连接,但事实并非如此。由于使用了 OpenSSH 的连接多路复用功能 (
ControlMaster
/ControlPath
/etc.),我实际上是在一个大约 10 天前的连接上登录的,所以我的会话(进程)没有设置新的组。我用 确认了这一点id
。通过 登录后
ssh -o ControlPath=none HOST
,id
确认我的会话有git-books
组,并且chmod g+s
工作。至于为什么没有给出权限被拒绝错误,似乎标准要求文件具有这种行为并允许实现忽略这些位:
可能,返回错误只是理智的,而不是一致的☹。