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