我在提取 tar 文件时遇到错误,创建的目录是使用 chmod 666 而不是 777 创建的。因此它不会提取到该文件夹内。
这是我的命令:
$umask 000 && tar -xvzf compress.tgz
tar: dist/assets: Cannot mkdir: Permission denied
tar: dist/assets/favicon.ico: Cannot open: Permission denied
$ls -ll
drw-rw-rw- 2 user grp 4096 Mar 14 16:43 assets
我在本地使用这个模块来压缩文件:
https://www.npmjs.com/package/tar
当我使用 mkdir 创建目录时,它给出 777 模式,我错过了什么?
按照要求:
-bash-4.2$ tar tzvf compress.tgz
drw-rw-rw- 0/0 0 2018-03-15 12:17 dist/
-rw-rw-rw- 0/0 13117 2018-03-15 12:17 dist/3rdpartylicenses.txt
drw-rw-rw- 0/0 0 2018-03-15 12:17 dist/assets/
我用来--strip 1
提取。
答案1
正如您从输出中看到的,tar tv
存档本身的权限已被破坏。如果您对创建此存档的工具有任何控制权,我强烈建议您修复它,或报告错误。
我假设您仍然需要从损坏的存档中提取文件。尝试这个:
tar xzvf compress.tgz --delay-directory-restore
find dist -type d -exec chmod a+x {} \;
+
(在这种情况下我们不能使用尾随,因为chmod
必须一次应用于一个目录,以便find
可以下降到固定的子目录。分号以反斜杠为前缀,这样 shell 就不会将其视为特殊字符,但是相反,它find... -exec
作为文字传递给 the 。)
答案2
使用star
(from schily-tools
),您可以使用以下命令提取它:
star xf file.tgz -no-p -find -type d -chmod a+x
将执行权限(对于每个人)添加到提取的目录中,以修复存档中的那些虚假权限。
对于-no-p
,umask
即使以 root 身份运行,也会应用 ,假设您umask
至少是 002 也会修复那些太宽的写入权限(请注意, 优先umask
于-chmod
)。
tar
请注意,在我的测试中,GNUbsdtar
和star
的实现都没有tar
在使用此类损坏的权限提取存档时出现任何问题。最有可能的是,您正在尝试在存在时提取它已经没有搜索权限的目录dist
(因为例如您提取了具有类似损坏权限的类似存档)。
在提取存档之前,您需要先修复这些权限。