我有一个 git (实际上是 git-annex)存储库,我正在尝试共享,其中一部分涉及在几个目录上设置 set-group-id 位。这是在 Debian GNU/Linux Stretch box 上的 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 存储库中设置了一些。
答案1
事实证明,虽然我几天前就创建了该群组并添加了自己,但这是我的想法是一个新的 ssh 连接,但事实并非如此。由于使用 OpenSSH 的连接复用功能(ControlMaster
/ ControlPath
/ 等),我实际上登录的是大约 10 天前的连接,因此我的会话(进程)没有设置新组。我用 确认了这一点id
。
通过 登录后ssh -o ControlPath=none HOST
,id
确认我的会话有该git-books
组并且chmod g+s
有效。
至于为什么没有给出权限被拒绝的错误,似乎标准要求这种行为对于文件并允许实现忽略这些位:
如果调用进程没有适当的权限,并且文件的组 ID 与有效组 ID 或补充组 ID 之一不匹配,并且文件是常规文件,则位 S_ISGID(set-group-ID on从 chmod() 成功返回后,文件模式中的执行)应被清除。
其他实现定义的限制可能会导致模式中的 S_ISUID 和 S_ISGID 位被忽略。
单 Unix 规范 v4 2018 版,chmod。http://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html(可能需要注册)。
也许,返回错误只是理智的,而不是一致的 ☹。