web-dev-qa-db-ja.com

Zipを7zipに再パックするにはどうすればよいですか?

Zipアーカイブを7Zipアーカイブに安全かつ迅速に再パックするにはどうすればよいですか?

7Zipプログラムのオプションを確認しましたが、再梱包するオプションが表示されません。ディレクトリに抽出してからこのディレクトリをパックできることはわかっていますが、安全ですか? Zipに「../../file.exe」や「/etc/bin/file.exe」などのパスがある場合はどうなりますか?

ファイルをstdoutに解凍しようとしましたが、プログラム7Zipはこれを実行できますが、名前などのないファイルのコンテンツのみを出力するため、この出力を取得してどこかにリダイレクトし、7Zipアーカイブにパックすることはできません。

4
Tom

それらを一時ディレクトリに抽出する必要があります。

unzip (1)によると、

セキュリティ上の理由から、unzipは通常、抽出されたファイルの名前から「親ディレクトリ」パスコンポーネント(「../」)を削除します。この安全機能(バージョン5.50の新機能)は、unzipがアクティブな抽出フォルダーツリーヘッドの外側の「機密」領域に誤ってファイルを書き込むことを防ぎます。

したがって、safeである可能性がありますが、結果の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" .
2
rrauenza

Atoolツールスイートの一部であるarepackツールを使用することもできます。通常はyum install atoolまたはapt-get install atoolインストールします。これが利用可能になったら、これを簡単に行うことができます。

$ arepack -e -F 7z *.Zip

これにより、すべての.Zipファイルが.7zファイルとして変換されます。 * .Zipファイルを削除する必要がありますが、それは次のように簡単に行うことができます。

$ rm -f *.Zip

追加のarepackオプション

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".
0
slm