Forum Programmation.shell tar et md5

Posté par  .
Étiquettes : aucune
3
10
sept.
2010
Bonjour,

j'ai besoin de vérifier l'intégrité d'un fichier dans un tar en utilisant la md5sum contenue dans un autre fichier de ce tar, et ce à la volée (je ne veux pas copier le fichier à vérifier sur le disque)

Y'a-t-il un moyen simple de faire ça ?

A la limite je peux générer le md5 de mon fichier a vérifier et la comparer avec celle contenue dans l'autre fichier en utilisant sed, awk ou je ne sais quoi, mais ça serait dommage.

Merci d'avance.
  • # Première idée

    Posté par  . Évalué à 2.


    johan:MegaBook /tmp $ tar tf toto.tar.gz
    toto/
    toto/winrg.swf.md5
    toto/winrg.swf

    johan:MegaBook /tmp $ tar xzf toto.tar.gz toto/winrg.swf.md5 -O
    7f4570b06987fb9baf8f05169198f224 winrg.swf

    johan:MegaBook /tmp $ tar xzf toto.tar.gz toto/winrg.swf -O | md5sum
    7f4570b06987fb9baf8f05169198f224 -


    Mais si tu cherches à faire md5sum -c directement, c'est une autre histoire.
    • [^] # Re: Première idée

      Posté par  . Évalué à 0.

      Avec md5sum -c c'est plus classe, mais étant donné que la commande a besoin d'accéder aux fichiers listés dans le .md5 je vois pas comment faire.
  • # Une solution possible...

    Posté par  (site web personnel) . Évalué à 5.

    $ tar tf plop.tar.gz
    plop/
    plop/truc
    plop/truc.md5
    $ tar xzf plop.tar.gz plop/truc -O | md5sum | grep -q `tar xzf plop.tar.gz plop/truc.md5 -O|cut -d" " -f1` && echo OK || echo FAIL


    Ça sort OK si le md5 correspond, FAIL sinon.
  • # Il faut plusieurs lignes

    Posté par  . Évalué à 2.

    Si ton archive n'est pas grosse, cette solution suffit probablement:
    (
    MD5_PRECALCULE=$(tar --extract --to-stdout --file archive.tar rep/toto.md5 | cut --delimiter=' ' --fields=1)
    MD5_ACTUEL=$(tar --extract --to-stdout --file archive.tar rep/toto.txt | md5sum | cut --delimiter=' ' --fields=1)
    if [[ "$MD5_PRECALCULE" == "$MD5_ACTUEL" ]];
    then echo ouiiii
    else
    echo nooooon
    fi
    )

    Inconvénient: l'archive est lue deux fois. Donc si elle est grosse et que tes fichiers sont situés à la fin, c'est un problème.

    Si tu veux optimiser, tu peux utiliser quelque chose du genre:
    tar --extract --to-stdout --verbose --file archive.tar 'rep/toto.txt' 'rep/toto.md5'

    Il faut alors envoyer la sortie vers tee afin afin de lire le contenu de chaque fichier et de le traiter correctement avec sed ou awk.
    • [^] # Re: Il faut plusieurs lignes

      Posté par  . Évalué à 2.

      À vrai dire, toutes les solutions présentées jusqu'à présent lisent 2 fois l'archive.

      Et puis la lecture préliminaire du fichier contenant le hash permet éventuellement d'obtenir le chemin/nom du fichier à vérifier.

      C'est plus générique.

      # On récupère les paramètres
      ARCHIVE="${1}"
      SUMFILE="${2}"

      # On lit le hash et le nom de fichier
      MD5SUM=$(tar --extract --to-stdout --file ${ARCHIVE} ${SUMFILE})
      MD5=$(expr "$MD5SUM" : "\([0-9a-fA-F]*\) .")
      FNAME=$(expr "$MD5SUM" : "${MD5} .\(.*\)$")

      # On vérifie
      tar --extract --to-stdout --file ${ARCHIVE} "${FNAME}" | md5sum -c "${MD5} -" # Attention, 2 espaces entre MD5 et -


      On lit toujours 2 fois l'archive mais c'est réutilisable.
      Bien sûr, il est nécessaire que le chemin indiqué dans le md5 corresponde à celui de l'archive sinon on modifie le chemin à la volée...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.