GNU/Linux >> Linux Esercitazione >  >> Linux

Script autoestraenti:Tar -xo e Dd?

Sto lavorando con uno script che è uno script autoestraente. È uno script per installare i pacchetti su un QNAP NAS.

Ha alcuni script all'inizio che estraggono il resto del file. Eccolo:

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

Questo utilizza dd per copiare i byte dal byte 102 in poi in tar, dove viene estratto.

Cosa significa -xO fare? E perché viene estratto "due volte" (due invocazioni di tar con -x ) ? Non sono riuscito a trovare molte discussioni su questo online:la pagina man sembra suggerire che ha qualcosa a che fare con le "unità". (Sembra che io abbia confuso i miei 0 e Os!)

Successivamente, lo script:

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

Questo sembra saltare ulteriormente nel file e copia i byte lì in un nuovo TAR compresso. Presumibilmente quei byte sono già strutturati e codificati in questo modo.

Ma non abbiamo già letto quei byte tramite tar nel primo comando? Non vedo alcun modo in cui dd è stato detto di interrompere la lettura del file.

Risposta accettata:

Diamo un'occhiata a un pacchetto QNAP, ad es. http://www.twonkyforum.com/downloads/8.3/TwonkyServerEU_8.3_arm-x41.qpkg

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

Ora copiamo i dati con dd e guarda cosa c'è dentro:

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

Questo è un archivio TAR grezzo, con un singolo file tar.gz al suo interno:

%file first 
first: POSIX tar archive (GNU)

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

Il passaggio successivo della pipeline è /bin/tar -xO , ed ecco cosa dice il manuale TAR su di esso:

Per scrivere i file estratti nell'output standard, invece di creare i file nel file system, usa --to-stdout' ( -O') insieme a --extract' ( –get', `-x').

Questa opzione è utile se si estraggono file per inviarli tramite una pipe e non è necessario conservarli nel file system. Se estrai più membri, questi appaiono sullo standard output concatenati , nell'ordine in cui si trovano nell'archivio.

Poiché esiste un solo file control.tar.gz all'interno dell'archivio, verrà estratto in STDOUT, per essere elaborato dal passaggio successivo della pipeline, che invocherà nuovamente TAR per estrarre da esso il contenuto interno.

Correlati:ottenere gli script .py da aprire in IDLE di Python?

Quindi, in pratica, c'è un archivio "tar.gz" all'interno dell'archivio "tar", motivo per cui due tar sequenziali i comandi sono necessari per estrarlo.

Nota che tar è intrinsecamente progettato per funzionare sui dati in streaming,
in modo da poter rilevare in modo affidabile la fine dell'archivio, anche se è seguito da più dati:

Fisicamente, un archivio è costituito da una serie di voci di file terminate da una voce di fine archivio, che consiste in due 512 blocchi di zero byte.

Quindi, tar -xO , si fermerà dopo la lettura del primo file di dati ed eliminerà il resto, che suppongo fosse una motivazione per l'utilizzo di questo formato di archiviazione in qpkg .


Linux
  1. Installazione e configurazione di vsFTPD

  2. Come eseguire il tar, decomprimere i file e visualizzare il contenuto del file tar sotto Linux

  3. unix - testa E coda del file

  4. Estrarre un file *.tar.bz2?

  5. tar:lettura breve

Come estrarre (decomprimere) il file Tar Gz

Come estrarre (decomprimere) il file tar.xz

Come creare file Tar Gz

Tutto sui file tar e su come tar, untar file in Linux usando il terminale

Comando tar di Linux per comprimere ed estrarre file

Estrai il file tar.gz in Linux