非root用户解压文件时能否保留setgid位?
好问题!先直接给你结论:非root用户默认用unzip解压时,没法让解压出的文件夹自动继承父目录的setgid位,但有两种简单的方法可以实现你想要的效果。下面详细拆解:
为什么解压后setgid位没保留?
当你用unzip处理压缩包时,它会严格按照压缩包内部存储的文件/目录权限来设置解压后的权限。如果你的archive.zip里的folder-from-archive原本就没设置setgid位(也就是没有g+s权限),那解压出来的目录自然也不会有。
另外,虽然父目录project-folder的setgid位会让手动新建的文件夹自动继承这个属性,但unzip是从压缩包中提取已有的目录结构,它不会遵循系统默认的权限继承规则,而是完全照搬压缩包里的权限元数据。
非root用户如何让解压后的文件夹带上setgid位?
这里有两种靠谱的方案:
1. 解压后手动添加setgid位
从你的权限信息来看,你是myuser,且属于www-data组(你拥有该目录的组操作权限),所以可以直接执行这条命令为解压后的目录补上setgid位:
chmod g+s folder-from-archive
设置完成后,这个子目录就会和父目录一样,后续在里面创建的文件/文件夹都会自动继承www-data组权限,而且它的子文件夹也会带上setgid位。
2. 用unzip参数保留原始权限(如果压缩包内有)
如果你的archive.zip里的目录原本就带有setgid位,你可以用unzip的-X参数来完整保留压缩包内的权限信息(包括setgid):
unzip -X archive.zip
但要注意,如果压缩包里的目录本身就没setgid位,这个参数就起不到作用,还是得用第一种方法手动添加。
补充提醒
非root用户只能给自己有权限的文件/目录设置setgid位,而且目标文件/目录的所属组必须是你所在的组(你的情况刚好满足这两个条件)。如果你不在目标组里,就没法修改组权限相关的设置。
内容的提问来源于stack exchange,提问作者koninka

