Bash loop descompactar script de arquivo com senha

6

Eu estou tentando fazer um script que irá descompactar um arquivo protegido por senha, sendo a senha o nome do arquivo que irei obter ao descompactar

Por exemplo.

file1.zip contains file2.zip and it's password is file2.

file2.zip contains file3.zip and it's password is file3

Como faço para descompactar file1.zip e ler o nome de file2.zip para que ele possa ser inserido no script?

Aqui está uma captura de tela do que eu quis dizer , só preciso de bash para ler essa saída para saber a nova senha (Neste caso, a senha é 13811).

Aqui está o que eu fiz até agora

    #!/bin/bash

    echo First zip name:
    read firstfile


    pw=$(zipinfo -1 $firstfile | cut -d. -f1)
    nextfile=$(zipinfo -1 $firstfile)
    unzip -P $pw $firstfile

    rm $firstfile
    nextfile=$firstfile

Agora, como posso fazer o loop?

    
por molinskeh 08.08.2018 / 14:18

2 respostas

8

Se você não tiver e não puder instalar zipinfo por qualquer motivo, poderá imitá-lo usando a opção unzip with -Z . Para listar o conteúdo do zip use unzip -Z1 :

pw="$(unzip -Z1 file1.zip | cut -f1 -d'.')" 
unzip -P "$pw" file1.zip

Coloque em um loop:

zipfile="file1.zip"
while unzip -Z1 "$zipfile" | head -n1 | grep "\.zip$"; do
    next_zipfile="$(unzip -Z1 "$zipfile" | head -n1)"
    unzip -P "${next_zipfile%.*}" "$zipfile"
    zipfile="$next_zipfile"
done

ou uma função recursiva:

unzip_all() {
    zipfile="$1"
    next_zipfile="$(unzip -Z1 "$zipfile" | head -n1)"
    if echo "$next_zipfile" | grep "\.zip$"; then
        unzip -P "${next_zipfile%%.*}" "$zipfile"
        unzip_all "$next_zipfile"
    fi
}
unzip_all "file1.zip"

-Z zipinfo(1) mode. If the first option on the command line is -Z, the remaining options are taken to be zipinfo(1) options. See the appropriate manual page for a description of these options.

-1 : list filenames only, one per line. This option excludes all others; headers, trailers and zipfile comments are never printed. It is intended for use in Unix shell scripts.

    
por 08.08.2018 / 14:53
8

Solicite zipinfo o nome do arquivo listado no arquivo zip e capture-o para a senha. Use essa senha para descompactar o arquivo:

pw=$(zipinfo -1 file1.zip | cut -d. -f1)
unzip -P "$pw" file1.zip

Note que o sinalizador para zipinfo é um um não um ell .

Tomando emprestado liberalmente da resposta de Gilles a uma pergunta semelhante , aqui está um loop bash que irá extrair uma senha arquivo zip aninhado protegido até que não haja mais arquivos zip:

shopt -s nullglob
while set -- *.zip; [ $# -eq 1 ]
do 
  unzippw "$1" && rm -- "$1"
done

Onde defini a função unzippw como um wrapper para os comandos zipinfo e unzip acima:

unzippw ()
{
    local pw=$(zipinfo -1 "$1" | cut -d. -f1)
    unzip -P "$pw" "$1"
}
    
por 08.08.2018 / 14:56