GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Selbstextrahierende Skripte:Tar -xo und Dd?

Ich arbeite mit einem Skript, das ein selbstextrahierendes Skript ist. Es ist ein Skript zum Installieren von Paketen auf einem QNAP NAS.

Es hat einige Skripte am Anfang, die den Rest der Datei extrahieren. Hier geht es weiter:

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

Dies verwendet dd um die Bytes ab Byte 102 nach tar zu kopieren, wo sie extrahiert werden.

Was bedeutet -xO tun? Und warum wird es „zweimal“ extrahiert (zwei Aufrufe von tar mit -x ) ? Ich konnte online nicht viele Diskussionen darüber finden – die Manpage scheint darauf hinzudeuten, dass es etwas mit „Laufwerken“ zu tun hat. (Sieht aus, als hätte ich meine 0 und Os verwechselt!)

Anschließend führt das Skript Folgendes aus:

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

Dies scheint weiter in die Datei zu springen und kopiert die Bytes dort in ein neues gezipptes TAR. Vermutlich sind diese Bytes bereits so strukturiert und kodiert.

Aber haben wir diese Bytes nicht bereits im ersten Befehl über tar gelesen? Ich sehe keine Möglichkeit, wie dd wurde angewiesen, das Lesen der Datei zu beenden.

Akzeptierte Antwort:

Schauen wir uns ein QNAP-Paket an, z. 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
....

Jetzt kopieren wir die Daten mit dd , und schau, was drin ist:

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

Das ist ein rohes TAR-Archiv mit einer einzigen tar.gz-Datei darin:

%file first 
first: POSIX tar archive (GNU)

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

Der nächste Pipeline-Schritt ist /bin/tar -xO , und hier ist, was das TAR-Handbuch darauf sagt:

Um die extrahierten Dateien in die Standardausgabe zu schreiben, anstatt die Dateien im Dateisystem zu erstellen, verwenden Sie --to-stdout' ( -O’) in Verbindung mit --extract' ( –get’, `-x’).

Diese Option ist nützlich, wenn Sie Dateien extrahieren, um sie durch eine Pipe zu senden, und sie nicht im Dateisystem aufbewahren müssen. Wenn Sie mehrere Mitglieder extrahieren, werden sie verkettet in der Standardausgabe angezeigt , in der Reihenfolge, in der sie im Archiv gefunden werden.

Da es nur eine Datei control.tar.gz gibt innerhalb des Archivs wird es nach STDOUT extrahiert, um vom nächsten Pipeline-Schritt verarbeitet zu werden, der TAR erneut aufruft, um den inneren Inhalt daraus zu extrahieren.

Verwandte:.py-Skripte zum Öffnen in Pythons IDLE erhalten?

Im Grunde gibt es also ein „tar.gz“-Archiv innerhalb des „tar“-Archivs, weshalb zwei aufeinanderfolgende tar Befehle sind notwendig, um es zu extrahieren.

Beachten Sie, dass tar ist von Natur aus darauf ausgelegt, mit Stream-Daten zu arbeiten,
sodass es das Ende des Archivs zuverlässig erkennen kann, selbst wenn weitere Daten folgen:

Physisch besteht ein Archiv aus einer Reihe von Dateieinträgen, die durch einen Archivende-Eintrag abgeschlossen werden, der aus zwei 512-Blöcken mit Null-Bytes besteht.

Also tar -xO , stoppt nach der ersten gelesenen Datendatei und verwirft den Rest, was meiner Meinung nach ein Grund für die Verwendung dieses Speicherformats in qpkg war .


Linux
  1. Installation und Konfiguration von vsFTPD

  2. Threads und Dateideskriptoren

  3. Unix - Kopf UND Ende der Datei

  4. Erstellen Sie tar mit mehreren Verzeichnissen und Dateispeicherorten

  5. Extrahieren einer *.tar.bz2-Datei?

So extrahieren (entpacken) Sie die Tar Gz-Datei

So extrahieren (entpacken) Sie die tar.xz-Datei

So erstellen Sie eine Tar-Gz-Datei

Alles über Tar-Dateien und wie man Dateien in Linux mit Terminal tart und enttarnt

Linux-tar-Befehl zum Komprimieren und Extrahieren von Dateien

Extrahieren Sie die tar.gz-Datei unter Linux