我有一个具有以下权限的文件夹:
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
我们可以看到,所有者组www-data
与父文件夹project-folder
相同,但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
获取相同的行为?
答案 0 :(得分:1)
用户root
是www-data
群组的成员吗?如果是这样,那就可以解释为什么root
的提取具有正确的提取组所有者。
同样,如果myuser
组中不包含www-data
,则文件将被提取为myuser:myuser
请参阅man chmod
:
SETUID和SETGID BITS
如果文件的组ID与用户的有效组ID或用户的补充组ID 不匹配,则chmod清除常规文件的set-group-ID位,除非用户有适当的特权。其他限制可能导致忽略MODE或RFILE的set-user-ID和set-group-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
...