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.
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 .