Je travaille avec un script qui est un script auto-extractible. C'est un script pour installer des packages sur un NAS QNAP.
Il a quelques scripts au début qui extrait le reste du fichier. Voilà :
script_len=102
/bin/dd if="${0}" bs=$script_len skip=1 | /bin/tar -xO | /bin/tar -xzv
Ceci utilise dd
pour copier les octets à partir de l'octet 102 dans tar, où il est extrait.
Que signifie -xO
faire? Et pourquoi est-il extrait "deux fois" (deux invocations de tar avec -x
) ? Je n'ai pas trouvé beaucoup de discussions à ce sujet en ligne - la page de manuel semble suggérer que cela a quelque chose à voir avec les "lecteurs". (On dirait que j'ai mélangé mes 0 et mes O !)
Par la suite, le script fait :
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
Cela semble sauter plus loin dans le fichier et y copier les octets dans un nouveau TAR compressé. Vraisemblablement, ces octets sont déjà structurés et encodés de cette façon.
Mais n'avons-nous pas déjà lu ces octets via tar dans la première commande ? Je ne vois pas comment dd
a reçu l'ordre d'arrêter de lire le fichier.
Réponse acceptée :
Jetons un coup d'œil à un package QNAP, par ex. 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
....
Maintenant, copions les données avec dd
, et regardez ce qu'il y a dedans :
%dd if=TwonkyServerEU_8.3_arm-x41.qpkg bs=2467 skip=1 > first
C'est une archive TAR brute, avec un seul fichier tar.gz à l'intérieur :
%file first
first: POSIX tar archive (GNU)
%tar -tvf first
-rw-r--r-- admin/administrators 7175 2017-01-06 17:49 control.tar.gz
La prochaine étape du pipeline est /bin/tar -xO
, et voici ce que dit le manuel TAR :
Pour écrire les fichiers extraits sur la sortie standard, au lieu de créer les fichiers sur le système de fichiers, utilisez
--to-stdout' (
-O') en conjonction avec--extract' (
–get’, `-x’).Cette option est utile si vous extrayez des fichiers pour les envoyer via un canal et n'avez pas besoin de les conserver dans le système de fichiers. Si vous extrayez plusieurs membres, ils apparaissent concaténés sur la sortie standard , dans l'ordre où ils se trouvent dans l'archive.
Comme il n'y a qu'un seul fichier control.tar.gz
à l'intérieur de l'archive, il sera extrait vers STDOUT, pour être traité par la prochaine étape du pipeline, qui invoquera à nouveau TAR pour en extraire le contenu interne.
Donc, fondamentalement, il y a une archive 'tar.gz' à l'intérieur de l'archive 'tar', c'est pourquoi deux tar
séquentiels commandes sont nécessaires pour l'extraire.
Notez que tar
est intrinsèquement conçu pour fonctionner sur les flux de données,
il peut donc détecter de manière fiable la fin de l'archivage, même s'il est suivi par d'autres données :
Physiquement, une archive consiste en une série d'entrées de fichier terminées par une entrée de fin d'archive, qui consiste en deux blocs de 512 de zéro octet.
Donc, tar -xO
, s'arrêtera après la première lecture du fichier de données et supprimera le reste, ce qui, je suppose, était une justification de l'utilisation de ce format de stockage dans qpkg
.