为什么目录上的 chmod g+s 被忽略?

为什么目录上的 chmod g+s 被忽略?

我有一个 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 仍然不起作用。
  • straceonchmod显示系统调用成功,并且设置了 sgid 位:
    fchmodat(AT_FDCWD, "annex", 02775) = 0
  • 同一文件系统上的其他目录设置了 set-group-id 位。事实上,我早些时候在同一会话中的不同 git-annex 存储库中设置了一些。

答案1

事实证明,虽然我几天前就创建了该群组并添加了自己,但这是我的想法是一个新的 ssh 连接,但事实并非如此。由于使用 OpenSSH 的连接复用功能(ControlMaster/ ControlPath/ 等),我实际上登录的是大约 10 天前的连接,因此我的会话(进程)没有设置新组。我用 确认了这一点id

通过 登录后ssh -o ControlPath=none HOSTid确认我的会话有该git-books组并且chmod g+s有效。

至于为什么没有给出权限被拒绝的错误,似乎标准要求这种行为对于文件并允许实现忽略这些位:

如果调用进程没有适当的权限,并且文件的组 ID 与有效组 ID 或补充组 ID 之一不匹配,并且文件是常规文件,则位 S_ISGID(set-group-ID on从 chmod() 成功返回后,文件模式中的执行)应被清除。

其他实现定义的限制可能会导致模式中的 S_ISUID 和 S_ISGID 位被忽略。

单 Unix 规范 v4 2018 版,chmodhttp://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html(可能需要注册)。

也许,返回错误只是理智的,而不是一致的 ☹。

相关内容