Como descompactar com segurança, sem poluir o diretório atual no caso de um tarbomb?

33

Projetos respeitáveis lançam arquivos tar que contêm um único diretório, por exemplo, zyrgus-3.18.tar.gz contém uma pasta zyrgus-3.18 que, por sua vez, contém src , build , dist , etc.

Mas alguns projetos punks colocam tudo na raiz: '- (Isso resulta em um total de bagunça quando desarquivamento. Criar uma pasta manualmente toda vez é uma dor, e desnecessário na maioria das vezes.

  • Existe uma maneira super rápida de saber se um arquivo .tar ou .tar.gz contém mais de um diretório na sua raiz? Mesmo para um grande arquivo.
  • Ou melhor ainda, existe uma ferramenta que nesses casos criaria um diretório (nome do arquivo sem a extensão) e colocaria tudo dentro?
por Nicolas Raoul 11.11.2015 / 09:24

5 respostas

30

O patool lida com diferentes tipos de arquivos e cria um subdiretório para o caso de o arquivo conter vários os arquivos extraídos.

Extrair arquivo

patool extract archive.tar

Para obter uma lista dos formatos suportados, use patool formats .

    
por 11.11.2015 / 09:48
12

Você poderia fazer algo como

tar tf thefile.tar | cut -d/ -f1 | sort -u

para ver quais entradas de nível superior um tar possui; canalize para wc -l para verificar se há mais de um. Observe que há alguns casos em que isso falharia, por exemplo, se o tar contiver caminhos de arquivo no formato somedir/whatever e também ./somedir/whatever (ou algo mais louco); isso deve ser incomum, no entanto.

Isso lerá todo o arquivo tar antes de produzir qualquer coisa, por causa do sort , embora deva ser mais rápido do que realmente extrair, porque é apenas uma leitura sequencial e pode pular arquivos grandes.

Se você estiver fazendo isso interativamente e o arquivo puder ser grande, você pode alterar sort -u para uniq e Controlar + C se ele imprimir mais de uma coisa.

    
por 11.11.2015 / 09:39
7

você pode fazer:

pax <some.tar

... para listar o conteúdo de um arquivo tar .

Se você quiser saber quantos níveis de profundidade, você pode fazer:

pax <some.tar | tr -dc /\n | sort -r | head -n1

você pode proibir explicitamente uma explosão na extração com:

mkdir some.tar
pax -'rs|^|some.tar/|' <some.tar
    
por 11.11.2015 / 09:43
2

Isso deve fazer o que você quiser. Tenho certeza que alguém pode melhorar isso. Nestes exemplos, eu assumo um arquivo compactado gzip comprimido, já que este é o mais comum.

Você deseja um arquivo no qual não haja nós irmãos na árvore de diretórios do nível raiz.

Cada entrada na lista de conteúdo tar deve começar com o mesmo padrão. Esse padrão é o caminho do diretório base que todas as entradas no archive devem compartilhar. Se quaisquer duas entradas não começarem com o mesmo padrão, elas são irmãos.

A primeira linha na lista de conteúdo tar lhe dará o padrão mínimo que você precisa verificar. Este é o BASEPATH.

BASEPATH=$(tar ztf example.tar.gz | (read line; echo $line))

Em seguida, para testar para tarballs explosivos, você precisa verificar se qualquer linha da lista de conteúdo tar não começa com o BASEPATH

tar ztf example.tar.gz | grep -qv "^${BASEPATH}"

Transforme isso em uma função de shell:

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

A partir daqui você pode escrever uma função segura de extração de arquivos tar.

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

safe_tar_x() {
    TARBALL_NAME=$1
    if is_explosive ${TARBALL_NAME}; then
        SUBDIR=${TARBALL_NAME%.tar.gz}
        SUBDIR=${SUBDIR##*/}
        mkdir "${SUBDIR}"
        echo "WARNING: This tarball is explosive. Opening in subdirectory, ${SUBDIR}, for safety." >&2
    else
        SUBDIR="."
    fi
    # Tar quirks: "--directory" must be last, and using more than
    #     one option group requires that all groups start with a dash.
    tar -zxf "${TARBALL_NAME}" --directory "${SUBDIR}"
    return $?
}
    
por 12.11.2015 / 23:09
0

aunpack archive.tar é o que eu uso.

Parte do bom e velho pacote atool . Manpage: link

    
por 28.04.2017 / 10:49

Tags