我有一个具有以下权限的文件夹:
drwxrws--x+ 13 myuser www-data 4096 Mar 20 09:57 project-folder
在此文件夹中,我有一个具有以下权限的存档archive.zip
:
-rw-rw----+ 1 myuser www-data 10260 Mar 20 09:56 archive.zip
当我通过调用unzip archive.zip
解压缩存档时,我得到了以下文件列表:
drwxrwx--x+ 3 myuser www-data 4096 May 5 2017 folder-from-archive
如我们所见,所有者组与父文件夹project-folder
www-data
相同,但folder-from-archive
没有setgid位(权限的"s"部分),并且该文件夹的内容不归组www-data
所有:
-rw-rw----+ 1 myuser myuser 1083 May 5 2017 LICENSE
-rw-rw----+ 1 myuser myuser 2197 May 5 2017 README.md
-rw-rw----+ 1 myuser myuser 720 May 5 2017 autoload.php
-rw-rw----+ 1 myuser myuser 786 May 5 2017 composer.json
drwxrwx--x+ 3 myuser myuser 4096 May 5 2017 source
但是当我尝试以 root 用户身份解压缩此存档时,权限和组所有者(以及文件夹中的文件)是正确的:
drwxr-s--x+ 3 root www-data 4096 May 5 2017 folder-from-archive
文件夹folder-from-archive
中的文件:
-rw-r-----+ 1 root www-data 1083 May 5 2017 LICENSE
-rw-r-----+ 1 root www-data 2197 May 5 2017 README.md
-rw-r-----+ 1 root www-data 720 May 5 2017 autoload.php
-rw-r-----+ 1 root www-data 786 May 5 2017 composer.json
drwxr-s--x+ 3 root www-data 4096 May 5 2017 source
正如我们在root用户解压缩后所看到的,文件夹继承了粘滞位,并为自己和所有包含的文件设置了正确的组www-data
。
如何为用户myuser
获得相同的行为?
用户root
www-data
组的成员吗?如果是这样,这将解释为什么root
提取具有正确的提取组所有者。
同样,如果myuser
不在www-data
组中,则文件将提取为myuser:myuser
请参阅man chmod
:
SETUID 和 SETID 位
如果常规文件的组 ID 与用户的有效组 ID 或用户的补充组 ID 之一不匹配,chmod将清除常规文件的设置组 ID 位,除非用户具有适当的权限。其他限制可能会导致忽略 MODE 或 RFILE 的设置用户 ID 和设置组 ID 位。 此行为取决于基础 chmod 系统调用的策略和功能。 如有疑问,请检查基础系统行为。
原始注释
我有一个用户报告,对于某些文件,setgid 路径下的文件具有 $user:$user,而不是预期的 $user:$group。我怀疑这可能是由于存档提取,因为 setgid 位在提取的目录之前是正确的,在该目录中,该组是正确的,但 setgid 丢失。
我的谷歌搜索只发现了这个帖子。鉴于我决定对其进行测试,但是我无法使用unzip
tar.gz 文件并使用tar
提取运行了类似的测试:
创建测试存档
$ cd ~ && mkdir testdata
$ ls -ld testdata
drwxrwxr-x 12 flakrat flakrat 512 May 16 11:43 testdata
$ cd testdata
$ for n in {1..10}; do mkdir $n; for m in {1..10}; do touch $n/$m; done; done
$ cd ..
$ zip -r -q testdata.zip testdata
创建/project/mygroup
,使用setgid组工作区
$ cd /project
$ mkdir mygroup && chgrp mygroup mygroup && chmod g+rwxs mygroup
$ ls -ld mygroup
drwxrwsr-x 2 flakrat mygroup 512 May 16 11:46 mygroup
提取存档
$ cd /project/mygroup
$ unzip -q ~/testdata.zip
查看结果,该组在整个提取树中完好无损
$ ls -ld testdata
drwxrwsr-x 12 flakrat mygroup 512 May 16 11:43 testdata
$ ls -l testdata
total 0
drwxrwsr-x 2 flakrat mygroup 512 May 16 11:43 1
drwxrwsr-x 2 flakrat mygroup 512 May 16 11:43 10
...
$ ls -l testdata/1/
total 0
-rw-rw-r-- 1 flakrat mygroup 0 May 16 11:43 1
-rw-rw-r-- 1 flakrat mygroup 0 May 16 11:43 10
...