Como eu posso reempacotar o zip no 7zip?

3

Como posso, com segurança e rapidez, empacotar um arquivo zip em um arquivo 7zip?

Eu verifiquei as opções do programa 7zip, mas não vejo nenhuma opção para reembalar. Eu sei que posso extrair para o diretório e, em seguida, empacotar este diretório, mas é seguro? E se o ZIP tiver caminhos como "../../file.exe" ou "/etc/bin/file.exe"?

Eu tentei descompactar os arquivos para o stdout e enquanto o programa 7zip pode fazer isso, ele apenas mostra o conteúdo dos arquivos sem seus nomes, etc. Eu não posso simplesmente pegar essa saída e redirecionar para algum arquivo 7zip.

    
por Tom 16.05.2017 / 20:28

2 respostas

2

Você precisará extraí-los em um diretório temporário.

De acordo com unzip (1) ,

For security reasons, unzip normally removes "parent dir" path components ("../") from the names of extracted file. This safety feature (new for version 5.50) prevents unzip from accidentally writing files to "sensitive" areas outside the active extraction folder tree head.

Portanto, embora seja seguro , o 7z resultante pode ter os arquivos organizados de forma diferente ou até mesmo ausentes se os nomes dos arquivos forem duplicados.

Veja um script de exemplo, mas ele ignora os problemas de .. e caminho absoluto:

#!/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" .
    
por 16.05.2017 / 22:02
0

Você também pode simplesmente usar a ferramenta arepack que faz parte do conjunto de ferramentas atool. Geralmente é um yum install atool ou apt-get install atool para instalá-lo. Quando isso estiver disponível, você pode simplesmente fazer isso:

$ arepack -e -F 7z *.zip

Isso converterá todos os arquivos .zip como arquivos .7z. Você ainda precisará excluir os arquivos * .zip, mas isso pode ser feito da seguinte forma:

$ rm -f *.zip

Opções adicionais de pacotes

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".
    
por 27.05.2018 / 18:59