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