先把当时的情况摆出来。设计组的共享目录 /srv/design 原本属主 design 属组 design 权限 2775,有人执行 chmod -R 755 想把目录放开,之后组员新建的文件属组是各自的私有组,其他人看不到。

把日志和配置对完,能解释这个现象的基本就这几处。chmod 755 把 SGID 位一起清掉了,新建文件只继承创建者的主组。另一种情况是rsync 同步时没带 -g,目标目录的属组被改成登录用户的主组。

少数情况下是协作目录没设 setgid,目录里子目录的属组逐层漂移。不容易想到的是,umask 是 0022,新建文件默认不带组写权限。

动手时先确认目录当前的权限位与属组

ls -ld /srv/design && find /srv/design -maxdepth 1 -printf '%m %u %g %p\n'

然后把 SGID 位加回并统一属组

chmod 2775 /srv/design && chgrp -R design /srv/design

组内统一 umask,保证新文件有组写权限

printf 'umask 0002\n' >> /etc/profile.d/design.sh

等前面都确认过,再把已有子目录的权限位一起纠回来

find /srv/design -type d -exec chmod 2775 {} \;

怎么算真的好了,看的是同一批现象。ls -ld 显示 drwxrwsr-x 且属组为 design,组员新建文件的属组同样是 design,另一个组员无需额外授权即可修改。

提醒一点。chmod -R 会顺手清掉所有特殊位,批量改权限前先把 find -printf 的输出存一份;SGID 只对目录下的新文件生效,老文件要另外修。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189