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

Langage Perl Discussion :

Extraire ip d'un fichier .txt


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 9
    Points
    9
    Par défaut Extraire ip d'un fichier .txt
    Bonjour le forum;

    Je me permets de vous exposer mon problème :

    Je voudrais extraire les adresses ip contenues dans un fichier log.

    La démarche que j'effectue :

    1- Ouverture en lecture du fichier de log : OK
    2- Ouverture en écriture d'un fichier texte pour insérer le contenu du fichier log : OK
    3- Insertion du contenu du fichier log vers fichier texte : OK

    4- Tentative d'extraction des ip contenues dans le fichier texte fraîchement créé : Bloqué à cette étape.
    (Alors j'imagine que l'idéal est d'extraire les ip lors de l'écriture des données du fichier log vers dans le fichier texte, mais je bloque quoi qu'il arrive)

    J'ai consulté ce fil qui me semble se rapprocher de ce que je souhaite faire : http://www.developpez.net/forums/d99...d-fichier-txt/

    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
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use autodie;
     
     
    open (my $Source,'<','/var/log/authlog');
    open (my $Cible,'>','reportlog.txt');
     
            while (my $donnee = <$Source>) {
     
                    print $Cible $donnee;
            }
     
    close ($Cible);
    close ($Source);
    Je pense avoir une expression rationnelle qui pourrait fonctionner, mais je vois pas comment l'adapter à mon besoin :

    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
     
     
    #!/usr/bin/perl
     
    use strict;
    use warning;
     
    my $ip = "45.114.11.41";
     
    if ($ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {
     
            print ("Expression trouvee\n");
       }
    else {
            print ("Pas de correspondance\n");
    }
    Un extrait de la structure du fichier :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    Jul 23 15:33:50 serveurBSD sshd[17490]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:33:50 serveurBSD sshd[17490]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:33:52 serveurBSD sshd[6699]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:33:52 serveurBSD sshd[6699]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:33:55 serveurBSD sshd[31212]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:33:55 serveurBSD sshd[31212]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:33:57 serveurBSD sshd[5357]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:33:57 serveurBSD sshd[5357]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:34:00 serveurBSD sshd[19922]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:34:00 serveurBSD sshd[19922]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:34:02 serveurBSD sshd[16503]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:34:02 serveurBSD sshd[16503]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:34:04 serveurBSD sshd[1161]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:34:04 serveurBSD sshd[1161]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:34:07 serveurBSD sshd[21849]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:34:07 serveurBSD sshd[21849]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:34:09 serveurBSD sshd[28054]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:34:09 serveurBSD sshd[28054]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:34:11 serveurBSD sshd[18638]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:34:11 serveurBSD sshd[18638]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:34:14 serveurBSD sshd[6985]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:34:14 serveurBSD sshd[6985]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:34:16 serveurBSD sshd[9618]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:34:16 serveurBSD sshd[9618]: Disconnected from 45.114.11.41 [preauth]
    Jul 23 15:34:18 serveurBSD sshd[27040]: Received disconnect from 45.114.11.41: 11:  [preauth]
    Jul 23 15:34:18 serveurBSD sshd[27040]: Disconnected from 45.114.11.41 [preauth]
     
    Jul 25 00:04:43 serveurBSD sshd[823]: Received disconnect from 218.87.111.117: 11:  [preauth]
    Jul 25 00:04:43 serveurBSD sshd[823]: Disconnected from 218.87.111.117 [preauth]
    Jul 25 00:04:46 serveurBSD sshd[15115]: Received disconnect from 218.87.111.117: 11:  [preauth]
    Jul 25 00:04:46 serveurBSD sshd[15115]: Disconnected from 218.87.111.117 [preauth]
    Jul 25 00:04:49 serveurBSD sshd[30059]: Received disconnect from 218.87.111.117: 11:  [preauth]
    Jul 25 00:04:49 serveurBSD sshd[30059]: Disconnected from 218.87.111.117 [preauth]
    Jul 25 00:04:52 serveurBSD sshd[19220]: Received disconnect from 218.87.111.117: 11:  [preauth]
    Jul 25 00:04:52 serveurBSD sshd[19220]: Disconnected from 218.87.111.117 [preauth]
    Jul 25 00:04:55 serveurBSD sshd[23319]: Received disconnect from 218.87.111.117: 11:  [preauth]
    Jul 25 00:04:55 serveurBSD sshd[23319]: Disconnected from 218.87.111.117 [preauth]
    Jul 25 00:04:58 serveurBSD sshd[2404]: Received disconnect from 218.87.111.117: 11:  [preauth]
    Jul 25 00:04:58 serveurBSD sshd[2404]: Disconnected from 218.87.111.117 [preauth]
    Jul 25 00:05:01 serveurBSD sshd[11843]: Received disconnect from 218.87.111.117: 11:  [preauth]
    Jul 25 00:05:01 serveurBSD sshd[11843]: Disconnected from 218.87.111.117 [preauth]
    Jul 25 00:05:04 serveurBSD sshd[27758]: Received disconnect from 218.87.111.117: 11:  [preauth]

    Petite précision, l'accès ne se fait que par clef (donc j'imagine que ces tentatives sont vaines),et je sais qu'il existe des outils prêts à l'emploi (type ssh guard mesemble t-il).

    Etant dans une démarche d'essayer d'apprendre Perl par l'exemple (aucune contrainte de temps, de productivité,etc..... c'est par pur plaisir !) et ce cas mesemble être une bonne opportunité de mettre en application le peu de connaissances que j'ai pour le moment.


    J’espère avoir été clair et concis dans mes explications.

    Merci par avance.
    Cordialement.
    Autodidacte.

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    ton expression est correcte, il suffit de l'appliquer sur chaque ligne lorsque tu la recopies dans le nouveau fichier

    pour la capture des matchs, cf FAQ
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Il suffit d'ajouter des parenthèses à ta regex pour qu'elle capture l'adresse IP reconnue. Cette adresse est alors capturée dans la variable $1, qu'il suffit d'utiliser.

    Exemple sous le debugger Perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      DB<1> $string = "Jul 23 15:33:50 serveurBSD sshd[17490]: Received disconnect from 45.114.11.41: 11:  [preauth]"
     
      DB<2> $ip = $1 if $string =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
     
      DB<3> print $ip
    45.114.11.41

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 9
    Points
    9
    Par défaut
    Merci infiniment à vous deux !

    Malgré une erreur qui s'affiche dans le terminal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value $ip in concatenation (.) or string at ./7-Redirection.pl line 15, <$_[...]> line 1.
    Le résultat est bien celui attendu : les ip sont extraites dans le bon fichier !!!!


    Je laisse le code après modification, si cela peut aider quelqu'un d'autre, un jour ...
    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
    20
    21
    22
    23
     
      GNU nano 2.2.6                                   File: 7-Redirection.pl                                                                             
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use autodie;
     
     
     
    open (my $Fich1,'<',"/var/log/authlog");
    open (my $Fich2,'>','report.txt');
     
            while (my $donnee = <$Fich1>) {
     
                    my $ip = $1 if $donnee =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
                    print $Fich2 "$ip\n";
     
                    }
     
    close ($Fich2);
    close ($Fich1);
    MERCI encore.

    Cordialement.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 9
    Points
    9
    Par défaut
    Concernant le message d'erreur qui apparaissait dans le terminal, j'ai modifié le comme suit , il semblerait que les lignes vides posaient un soucis .

    Le fait de récupérer les valeurs sous forme d'array plutôt que sous forme de scalaire a visiblement modifié quelque chose, mais je ne comprends pas quoi ?

    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
    20
    21
    22
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use autodie;
     
     
     
    open (my $Fich1,'<',"/var/log/authlog");
    open (my $Fich2,'>','report.txt');
     
            while (my $donnee = <$Fich1>) {
     
                    my @ip = $1 if  $donnee =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
     
                    print $Fich2 "@ip\n";
     
                    }
     
    close ($Fich2);
    close ($Fich1);

    Merci encore à vous.
    Cordialement.

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Ton warning apparaît quand la ligne lue ne contient pas d'adresse IP. Du coup, dans ce cas, tu essaie d'imprimer dans le fichier une variable non définie. Il suffit de modifier comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use autodie;
     
    open (my $Fich1,'<',"/var/log/authlog");
    open (my $Fich2,'>','report.txt');
     
    while (my $donnee = <$Fich1>) {
                     print $Fich2 "$1\n" if $donnee =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
    }
    Là, le code n'essaie plus d'imprimer quand $1 n'est pas défini et tu ne devrais plus avoir de warnings pour les lignes n'ayant pas d'adresse IP.


    close ($Fich2);
    close ($Fich1);

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 9
    Points
    9
    Par défaut
    Bonsoir le forum, Lolo 78 :

    Merci beaucoup pour ces précisions supplémentaires !!!

    Perl semble vraiment être un super langage , j'écume la section tuto/FAQ et je devrais avoir d'autres questions d'ici peu

    Merci encore pour votre aide.


    Longue vie à Developpez.com !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/02/2015, 10h18
  2. Extraire des données dans fichier txt
    Par islande dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 28/03/2013, 14h42
  3. [Débutant] Extraire mots d'un fichier txt
    Par fendry dans le forum MATLAB
    Réponses: 6
    Dernier message: 19/02/2012, 19h09
  4. VBS: extraire données d'un fichier txt
    Par silvermanu dans le forum VBScript
    Réponses: 3
    Dernier message: 12/04/2010, 15h00
  5. Extraire bloc d'un fichier txt
    Par jujusous3 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 09/12/2009, 17h09

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