GNU/Linux >> Tutoriels Linux >  >> Linux

Scripts auto-extractibles :Tar -xo et Dd ?

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.

Connexe :Obtenir des scripts .py à ouvrir dans IDLE de Python ?

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 .


Linux
  1. Installation et configuration de vsFTPD

  2. Mise à jour d'un seul fichier dans un tar compressé

  3. Threads et descripteurs de fichiers

  4. unix - début ET fin du fichier

  5. créer tar avec plusieurs répertoires et emplacements de fichiers

Comment extraire (décompresser) le fichier Tar Gz

Comment extraire (décompresser) le fichier tar.xz

Comment créer un fichier Tar Gz

Tout sur les fichiers tar et comment tar, décompresser des fichiers sous Linux à l'aide du terminal

Commande Linux tar pour compresser et extraire des fichiers

Extraire le fichier tar.gz sous Linux