Scripts auto-extraíveis: tar -xO e dd

3

Estou trabalhando com um script que é um script de extração automática. É um script para instalar pacotes em um QNAP NAS.

Ele possui alguns scripts no início que extraem o restante do arquivo. Aqui vai:

script_len=102
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv

Isso usa dd para copiar os bytes do byte 102 em diante para o tar, onde é extraído.

O que -xO faz? E por que é extraído "duas vezes" (duas invocações de tar com -x )? Eu não consegui encontrar muita discussão sobre isso online - a página man parece sugerir que é algo a ver com "drives" ". (Parece que eu tenho meus 0s e Os misturados!)

Posteriormente, o script faz:

offset=$(/usr/bin/expr $script_len + 2042)
/bin/dd if="${0}" bs=$offset skip=1 | /bin/cat | /bin/dd bs=1024 count=7 of=$_EXTRACT_DIR/data.tar.gz

Isso parece pular mais para o arquivo e copia os bytes de lá para um novo TAR zipado. Presumivelmente, esses bytes já estão estruturados e codificados dessa maneira.

Mas nós já não lemos esses bytes através do tar no primeiro comando? Não vejo nenhuma maneira em que dd tenha sido instruído a parar de ler o arquivo.

    
por Dan Gravell 31.08.2017 / 16:41

1 resposta

4

Vamos dar uma olhada em um pacote da QNAP, por exemplo link

....
script_len=2467
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv -C $_EXTRACT_DIR script_len=2467
....

Agora vamos copiar os dados com dd e ver o que está dentro:

%dd if=TwonkyServerEU_8.3_arm-x41.qpkg bs=2467 skip=1 > first

É um arquivo TAR bruto, com um único arquivo tar.gz dentro dele:

%file first 
first: POSIX tar archive (GNU)

%tar -tvf first 
-rw-r--r-- admin/administrators 7175 2017-01-06 17:49 control.tar.gz

A próxima etapa do pipeline é /bin/tar -xO , e aqui está o que o manual do TAR diz sobre isso:

To write the extracted files to the standard output, instead of creating the files on the file system, use --to-stdout' (-O') in conjunction with --extract' (--get', '-x').

This option is useful if you are extracting files to send them through a pipe, and do not need to preserve them in the file system. If you extract multiple members, they appear on standard output concatenated, in the order they are found in the archive.

Como há apenas um arquivo control.tar.gz dentro do arquivo, ele será extraído para STDOUT, para ser processado pela próxima etapa do pipeline, que invocará o TAR novamente para extrair o conteúdo interno dele.

Então, basicamente, existe um arquivo 'tar.gz' dentro do arquivo 'tar', e é por isso que dois comandos seqüenciais de tar são necessários para extraí-lo.

Observe que tar é inerentemente projetado para operar em dados de fluxo, para que possa detectar com segurança o final do arquivo, mesmo que seja seguido por mais dados:

Physically, an archive consists of a series of file entries terminated by an end-of-archive entry, which consists of two 512 blocks of zero bytes.

Então, tar -xO , irá parar após o primeiro arquivo de dados ser lido e descartar o resto, o que eu acho que foi uma justificativa para usar este formato de armazenamento em qpkg .

    
por 31.08.2017 / 17:06