如何安全快速地将 zip 存档重新打包为 7zip 存档?
我检查了 7zip 程序的选项,但没有看到任何重新打包的选项。我知道我可以解压到目录然后打包这个目录,但是安全吗?如果 ZIP 具有“../../file.exe”或“/etc/bin/file.exe”等路径怎么办?
我尝试将文件解压到标准输出,虽然程序 7zip 可以做到这一点,但它只输出文件的内容,而不输出名称等。所以我不能只获取此输出并重定向到某个地方以打包到 7zip 存档中。
答案1
您还可以简单地使用arepack
atool 工具套件中的该工具。通常是通过yum install atool
或apt-get install atool
来安装它。一旦可用,您可以简单地执行以下操作:
$ arepack -e -F 7z *.zip
这会将所有 .zip 文件转换为 .7z 文件。您仍然需要删除 *.zip 文件,但可以像这样简单地完成:
$ rm -f *.zip
额外的压缩包选项
Options:
-e, --each execute command above for each file specified
-F, --format=EXT override archive format (see below)
-O, --format-option=OPT give specific options to the archiver
-D, --subdir always create subdirectory when extracting
-f, --force allow overwriting of local files
-q, --quiet decrease verbosity level by one
-v, --verbose increase verbosity level by one
-V, --verbosity=LEVEL specify verbosity (0, 1 or 2)
-p, --page send output through pager
-0, --null filenames from standard in are null-byte separated
-E, --explain explain what is being done by atool
-S, --simulate simulation mode - no filesystem changes are made
-o, --option=KEY=VALUE override a configuration option
--config=FILE load configuration defaults from file
Archive format (for --format) may be specified either as a
file extension ("tar.gz") or as "tar+gzip".
答案2
您需要将它们解压缩到临时目录。
根据unzip (1)
,
出于安全原因,解压缩通常会从提取的文件名称中删除“父目录”路径组件(“../”)。此安全功能(5.50 版的新增功能)可防止 unzip 意外将文件写入活动提取文件夹树头之外的“敏感”区域。
所以虽然有可能安全的,您的结果7z
可能会以不同的方式排列文件,如果文件名重复,甚至会丢失。
这是一个示例脚本,但它忽略了..
绝对路径问题:
#!/bin/sh
set -e
if [ "$1" == "" -o "$2" == "" ]
then
echo Usage: $0 archive.zip archive.7z
exit 1
fi
scratch=`mktemp -d`
trap "rm -rf $scratch" EXIT
in=`readlink -f $1`
out=`readlink -f $2`
if [ -f $out ]
then
echo $out exists.
exit 2
fi
unzip -d"$scratch" "$in"
cd "$scratch"
7z a "$out" .