Zipアーカイブを7Zipアーカイブに安全かつ迅速に再パックするにはどうすればよいですか?
7Zipプログラムのオプションを確認しましたが、再梱包するオプションが表示されません。ディレクトリに抽出してからこのディレクトリをパックできることはわかっていますが、安全ですか? Zipに「../../file.exe」や「/etc/bin/file.exe」などのパスがある場合はどうなりますか?
ファイルをstdoutに解凍しようとしましたが、プログラム7Zipはこれを実行できますが、名前などのないファイルのコンテンツのみを出力するため、この出力を取得してどこかにリダイレクトし、7Zipアーカイブにパックすることはできません。
それらを一時ディレクトリに抽出する必要があります。
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" .
Atoolツールスイートの一部であるarepack
ツールを使用することもできます。通常は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".