如何将 zip 重新打包为 7zip?

如何将 zip 重新打包为 7zip?

如何安全快速地将 zip 存档重新打包为 7zip 存档?

我检查了 7zip 程序的选项,但没有看到任何重新打包的选项。我知道我可以解压到目录然后打包这个目录,但是安全吗?如果 ZIP 具有“../../file.exe”或“/etc/bin/file.exe”等路径怎么办?

我尝试将文件解压到标准输出,虽然程序 7zip 可以做到这一点,但它只输出文件的内容,而不输出名称等。所以我不能只获取此输出并重定向到某个地方以打包到 7zip 存档中。

答案1

您还可以简单地使用arepackatool 工具套件中的该工具。通常是通过yum install atoolapt-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" .

相关内容