IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Décoder des données base64 d'un ensemble de fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut Décoder des données base64 d'un ensemble de fichier
    bonjour,

    je dois décodé des données d'un fichier

    j'ai des lignes codés en base 64

    j'ai écrit le code suivant:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
    for f in `ls *.csv`;do
    	cat $f | 
    	while read ligne
    	do
    		if test "${#ligne}" -gt 40 -o test $ligne="expressionregulier" 
    			then echo `echo $ligne|openssl enc -base64 -d`
    			else echo $ligne
    		fi
    	done
    done>res.txt
    le problème c'est que ça prend beaucoup de temps est ce qu'il existe une autre manière? est ce qu'on peut utiliser des commandes dans sed ou awk?
    je voudrais savoir également comment utiliser une expression reguliere dans un test cf (code en rouge).??
    merci d'avance.

  2. #2
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    je ne vois pas comment tu pourrais améliorer cet algo. Pas d'optimisation possisble pour moi. A par supprimer l'option "debug" de openssl.

    Pour les expressions régulière faudrait nous expliquer ce que tu veux faire.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    ok ça marche

    sinon pour les expressions reguliere

    voila le test que je veux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if test $ligne = "^*=$"
    à savoir chercher les lignes qui se termine par le signe '='

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    ON N'UTILISE PAS ls DANS UN SCRIPT
    + UUOC
    et toujours mettre les variables entre guillemets
    !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/sh
     
    for f in *.csv
    do
       while read ligne
       do
          if test "${#ligne}" -gt 40 -o echo "$ligne" | grep -q "=$"
          then echo "$ligne" | openssl enc -base64 -d
          else echo "$ligne"
          fi
       done <"$f"
    done >res.txt
    bash permettrait de se passer de grep, avec [[.

    EDIT: if echo "$ligne" | grep -q '.\{40,\}\|=$'
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          if test "${#ligne}" -gt 40 -o echo "$ligne" | grep -q "=$"
    dsl cette ligne de commande ne fonctionne pas

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser la commande base64 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ base64 --help
    Usage: base64 [OPTION]... [FILE]
    Base64 encode or decode FILE, or standard input, to standard output.
     
      -d, --decode          decode data
      -i, --ignore-garbage  when decoding, ignore non-alphabet characters
      -w, --wrap=COLS       wrap encoded lines after COLS character (default 76).
                              Use 0 to disable line wrapping
     
          --help     display this help and exit
          --version  output version information and exit
     
    With no FILE, or when FILE is -, read standard input.
    ...

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    je n'ai pas acces à cette commande

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    pour cet exemple


    GROUPE1 ; uid=JJKSUHD
    GROUPE2 ; uid=JDHYDE
    U0lHEGDGHEFDQVJUQUfDiVKDHCGDU9O ; uid=XDSEF //à décoder
    U0lSSF9QRlJDUGHCGYDQVJUQUfDiVNfRk9STUFUSU9O ; uid=XFDEEF à décoder

    je dois décoder les code base64
    U0lSSF9QRlJDUGHCGYDQVJUQUfDiVNfRk9STUFUSU9O
    U0lHEGDGHEFDQVJUQUfDiVKDHCGDU9O

    et conserver la structure du fichier

    j'ai utilisé le code suivant je ne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	cat res6.txt | 
    	 while read ligne
    	do
    		if echo "$ligne" | egrep -q "^\ [A-Z]*"
    			then echo `echo $ligne|cut -d; -f1|openssl enc -base64 -d`_"$ligne"
    			else echo $ligne
    		fi
    	done > res7.txt
    et ensuite je retravaille les ligne obtenu avec un cut

    mais le code ne fonctionne pas

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    forcément que ça marche pas : les lignes «à décoder» ne se terminent pas par = !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    non ça marche aussi sans le égale

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Tes chaînes base64 ne semblent pas conformes. Essaye avec cet exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cat fichier
    GROUPE1 ; uid=JJKSUHD
    GROUPE2 ; uid=JDHYDE
    SGVsbG8gV29ybGQ= ; uid=XDSEF
    TGludXggcm9ja3Mh ; uid=XFDEEF
     
    $ awk -F" ; " 'length($1)>10{"echo "$1"| openssl enc -base64 -d" | getline d; $1=d}1' OFS=" ; " fichier
    GROUPE1 ; uid=JJKSUHD
    GROUPE2 ; uid=JDHYDE
    Hello World ; uid=XDSEF
    Linux rocks! ; uid=XFDEEF
    Pour cet exemple, la condition est basée sur la longueur de la chaîne $1, comme demandé dans ton premier post, mais tu peux y mettre ce que tu veux, y compris des regex.

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    j'obtiens un message d'erreur à partir du code que tu as publié
    syntax error: got |, expecting Newline mais c'est normal j'ai rajouté un flag je vais retester je te tiendrais au courant

    merci

  13. #13
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    j'ai testé ton code ça ne decrypte pas toutes les lignes


    ca marche si les lignes ont des codes différents

    par exemple celle ci
    SGVsbG8gV29ybGQ= ; uid=XDSEF
    TGludXggcm9ja3Mh ; uid=XFDEEF


    mais si les lignes ont des codes à decrypter identique comme ci dessous

    TGludXggcm9ja3Mh ; uid=XFDEEF
    TGludXggcm9ja3Mh ; uid=HJDGHYC

    je vais avoir

    Linux rocks! ; uid=XFDEEF
    ; uid=HJDGHYC


    soit dit en passant

    j'ai rajouté un flag au debut de chaque ligne pour reperer les lignes à décoder et j'ai tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F";" '/^ADECODER.*/{"echo "$1"|sed -e 's/^ADECODER//'|openssl enc -base64 -d" | getline d; $1=d}1' OFS=";" fichier.txt
    est ce que tu pourrais m'expliquer


  14. #14
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    j'ai testé ton code ça ne decrypte pas toutes les lignes


    ca marche si les lignes ont des codes différents

    par exemple celle ci
    SGVsbG8gV29ybGQ= ; uid=XDSEF
    TGludXggcm9ja3Mh ; uid=XFDEEF


    mais si les lignes ont des codes à decrypter identique comme ci dessous

    TGludXggcm9ja3Mh ; uid=XFDEEF
    TGludXggcm9ja3Mh ; uid=HJDGHYC

    je vais avoir

    Linux rocks! ; uid=XFDEEF
    ; uid=HJDGHYC


    soit dit en passant

    j'ai rajouté un flag au debut de chaque ligne pour reperer les lignes à décoder et j'ai tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F";" '/^ADECODER.*/{"echo "$1"|sed -e 's/^ADECODER//'|openssl enc -base64 -d" | getline d; $1=d}1' OFS=";" fichier.txt
    est ce que tu pourrais m'expliquer cette ligne?


  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,

    Voici une version en perl (qui me semble plus adapter):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat fic.enc 
    ADECODERTGludXggcm9ja3Mh ; uid=XFDEEF
    ADECODERTGludXggcm9ja3Mh ; uid=HJDGHYC
    GROUPE1 ; uid=JJKSUHD
    GROUPE2 ; uid=JDHYDE
    ADECODERSGVsbG8gV29ybGQ= ; uid=XDSEF
    ADECODERTGludXggcm9ja3Mh ; uid=XFDEEF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ perl -MMIME::Base64 -F\; -ane 'if (/^ADECODER/){$F[0]=decode_base64(substr($F[0],8));print join(" ;", @F)} else {print $_}' fic.enc 
    Linux rocks! ; uid=XFDEEF
    Linux rocks! ; uid=HJDGHYC
    GROUPE1 ; uid=JJKSUHD
    GROUPE2 ; uid=JDHYDE
    Hello World ; uid=XDSEF
    Linux rocks! ; uid=XFDEEF

  16. #16
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    ca marche merci

    mais je n'ai pas compris ta commande surtout que je ne connais pas le perl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -MMIME::Base64 -F\; -ane 'if (/^ADECODER/){$F[0]=decode_base64(substr($F[0],8));print join(" ;", @F)} else {print $_}' fic.enc
    est ce que tu pourrais me l'expliquer stp?

  17. #17
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Ici, je me suis pourtant arrangé pour que cela soit facilement lisible mais j'admet qu'il y a quelque subtililés lié à perl:
    Pour dire à perl que l'on va utiliser ce module (mais bon, je pense que tu avais déjà deviné)
    Alors, -n c'est le connecteur pour lui dire d'écrire sur la sortie standart (c'est un peu l'inverse du -n de sed)
    -e comme en sed, on dit à perl d'executer ce qui suit.
    -a est ce que l'on pourrait dire une des subtilités qui est fortement lié à -F\; :
    le -F pour indiquer un séparateur (ici ';' )
    le -a pour dire à perl de créé le tableau F avec les données en entrée en tenant compte du séparateur (si pas d'option -F, le séparateur par défaut est l'espace)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (/^ADECODER/){
     $F[0]=decode_base64(substr($F[0],8));
     print join(" ;", @F)} 
    else {
     print $_}
    ici, c'est un if else comme on en rencontre en awk par exemple.
    ici, on récupère la sous chaine à partir du 9ème caractère (comme dans tous les tableaux, l'indice commence à 0) de F[0] (pour retirer ADECODER qui fait 8 lettres)
    On prend tous les éléments du tableau F et on les joint ensemble avec ici " ;"
    est pour simplifer, la ligne en entrée

  18. #18
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Citation Envoyé par huître Voir le message
    mais si les lignes ont des codes à decrypter identique comme ci dessous

    TGludXggcm9ja3Mh ; uid=XFDEEF
    TGludXggcm9ja3Mh ; uid=HJDGHYC

    je vais avoir

    Linux rocks! ; uid=XFDEEF
    ; uid=HJDGHYC
    Aucune raison que ça ne fonctionne pas. Tu dois avoir un autre problème avec ton fichier.

    Edit: Je viens de relire ta modification avec l'introduction d'un sed dans la commande shell. Ce n'est ni très élégant ni très efficace et ça pourrait être la raison de tes lignes blanches. Donne-nous un exemple *concret* de ton fichier de départ. L'introduction d'une balise ADECODER ne me semble pas la solution la plus efficace non plus car elle implique un passage supplémentaire à la moulinette. Une fois encore, donne-nous un extrait du fichier réel sinon on risque de tourner en rond.

    Citation Envoyé par huître Voir le message
    est ce que tu pourrais m'expliquer cette ligne?

    L'utilisation de getline depuis un pipe awk est une des manières de récupérer le résultat d'une commande du shell dans une variable awk
    http://www.gnu.org/software/gawk/man...iable_002fPipe

  19. #19
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Pour ceux qui comme moi, cela dérange de passer par du perl (j'entends par là du perl one-line) pour juste une portion du script, voici une version awk qui se charge de faire le décodage du base64 (inspiré d'une source internet avec correction d'un bug sur le caractère complément "=" ) et adapté au besoin d'ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ cat decB64.awk
    BEGIN {  b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
      OFS=FS
    }
    /^ADECODER/ {$1=substr($1,9)
     sub(/=/,"A",$1)
     st=""
     for(i=1;i<=length($1);i++) {
        c=index(b64,substr($1,i,1));
        if(c--) {
          for(b=0;b<6;b++) {
            o=o*2+int(c/32); c=(c*2)%64;
            if(++obc==8) { st= st sprintf( "%c",o); obc=0; o=0; }
          }
        }
      }
     $1=st" "
    }
    {print}
    ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ cat enc.txt
    ADECODERTGludXggcm9ja3Mh ; uid=XFDEEF ; tutu
    ADECODERTGludXggcm9ja3Mh ; uid=HJDGHYC ; tutu
    GROUPE1 ; uid=JJKSUHD ; tutu
    GROUPE2 ; uid=JDHYDE ; tutu
    ADECODERSGVsbG8gV29ybGQ= ; uid=XDSEF
    ADECODERTGludXggcm9ja3Mh ; uid=XFDEEF ; tutu
     
    $ cat enc.txt | awk -F\; -f ./decB64.awk
    Linux rocks! ; uid=XFDEEF ; tutu
    Linux rocks! ; uid=HJDGHYC ; tutu
    GROUPE1 ; uid=JJKSUHD ; tutu
    GROUPE2 ; uid=JDHYDE ; tutu
    Hello World ; uid=XDSEF
    Linux rocks! ; uid=XFDEEF ; tutu

  20. #20
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    merci beaucoup pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Ecriture des données d'une table dans un fichier
    Par jeunot0108 dans le forum Forms
    Réponses: 3
    Dernier message: 13/08/2007, 12h49
  2. Réponses: 1
    Dernier message: 29/01/2007, 19h22
  3. Réponses: 2
    Dernier message: 25/01/2007, 13h20
  4. Insérer des données dans une BD depuis un fichier .bat
    Par kurkaine dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/11/2006, 08h31
  5. [FTP] ftp_put avec des données base64
    Par brazilpalace dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2006, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo