Forum Programmation.shell Script recherche caractère avec condition

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
25
mar.
2016

Bonjour à tous,

je cherche à faire un script et je me prends la tête depuis 2h, ne connaissant pas trop le langage.

Alors alors, voici ce que je voudrais faire:

dans mail.log je voudrais récupérer les IP qui ont eu le message d'erreur LOGIN authentication failed plus de 10 fois d'affilé, si l'ip n'est pas 123.456.789.123 ou 123.456.789.456

Cet IP, j'ai besoin du coup d'envoyer un rapport avec celle-ci à user@domaine.fr

Voilà voilà j'espère que c'est clair n'hésitez pas à me demander plus de précisions

Merci beaucoup d'avance

Solène

  • # Début ?

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

    Si ça fait 2h que tu cherches, tu dois déjà avoir fait quelque chose, sur quelle partie tu bloques ?

    Comment tu veux qu'on t'aide sans faire ton travail ?
    (Sinon, je suis freelance, je peux te le faire pour 100€)

    • [^] # Re: Début ?

      Posté par  . Évalué à 0. Dernière modification le 26 mars 2016 à 10:10.

      Alors j'ai:

      #!/bin/sh
      
      cat test.log | grep "chaine de caractère " | wc -l

      ce qui me permet de compter le nombre de ligne avec ma chaine de caractère dedans

      C'est dans les conditions que j'ai du mal. En php et sql pas de soucis mais je connais pas du tout le shell donc j'ai la logique mais juste me dire quelle fonction utiliser qui pourrait être l'équivalent du if blabla

      Oh non je ne veux surtout pas que tu me le fasses juste m'orienter en global, je veux réussir de moi-même !

      • [^] # Re: Début ?

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

        euh pour enlever les IP, tu peux utiliser |grep -vE "123.456.789.123|123.456.789.456" 'fin bon, si c'était des IP… dépasser 255 devrait t'inciter à revoir quelques cours de réseau :-)

        Voilà voilà j'espère que c'est clair n'hésitez pas à me demander plus de précisions

        bin avoir les lignes pourra permettre de te proposer la regexp qui va bien, savoir si la commande sort -k [n° champ] serait utilisable et piper le tout vers awk au besoin voire perl si c'est vraiment trop sioux…

        • [^] # Re: Début ?

          Posté par  . Évalué à 1.

          ahah en effet j'ai juste fait une suite de chiffre pour l'exemple de l'ip ^
          Bon par exemple

          /var/log/mail.log:May 13 19:59:36 monserveur postfix/smtpd[17538]: warning: unknown[151.232.189.104]: SASL LOGI authentication failed: authentication failure
          /var/log/mail.log:May 13 19:59:36 monserveur postfix/smtpd[17538]: warning: unknown[151.232.189.104]: SASL LOGIN authentication failed: authentication failure
          /var/log/mail.log:May 13 19:59:36 monserveur postfix/smtpd[17538]: warning: unknown[151.232.189.104]: SASL LOGIN authentication failed: authentication failure
          /var/log/mail.log:May 13 19:59:36 monserveur postfix/smtpd[17538]: warning: unknown[151.232.189.104]: SASL LOGIN authentication failed: authentication failure

          /var/log/mail.log:May 13 19:59:36 monserveur postfix/smtpd[17538]: warning: unknown[151.232.103.219]: SASL LOGIN authentication failed: authentication failure

          /var/log/mail.log:May 13 19:59:36 monserveur postfix/smtpd[17538]: warning: unknown[151.232.215.94]: SASL LOGIN authentication failed: authentication failure
          /var/log/mail.log:May 13 19:59:36 monserveur postfix/smtpd[17538]: warning: unknown[151.232.215.94]: SASL LOGIN authentication failed: authentication failure
          /var/log/mail.log:May 13 19:59:36 monserveur postfix/smtpd[17538]: warning: unknown[151.232.215.94]: SASL LOGIN authentication failed: authentication failure

          /var/log/mail.log:May 13 19:59:37 monserveur postfix/smtpd[17538]: warning: unknown[151.232.103.204]: SASL LOGIN authentication failed: authentication failure

          Voilà par exemple mon fichier mail.log ressemble à ça,

          concrètement je voudrais que mon script me dise: si dans le fichier mail.log, il y a une adresse ip différente de 151.232.103.XX (faisant partie de ce subnet), qui a eu plus de 2 LOGIN authentification failed, tu m'envoies par mail un rapport et tu ajoutes l'adresse ip dans le fichier ip.txt

          Et du coup, non seulement j'arrive pas à récupérer l'ip, mais j'arrive pas à lui if != 151.232.103 et si en moins de 5 minutes y a eu 2 login authentification failed….

          • [^] # Re: Début ?

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

            bin tu peux :

            grep -v "151.232.103" /var/log/mail.log | sort -k 7 # enlève le subnet dont tu ne veux pas, trie par ordre d'IP
            
            grep -v "151.232.103" /var/log/mail.log | sort -k 7 | awk -F " " 'BEGIN { vIP = "vide" ; nbIP=0 } \
            $7 == vIP { nbIP++ ; if ( nbIP == 2 ) { print vIP ; } }\
            $7 != vIP { nbIP = 0 ; vIP = $7 }' # devrait te sortir chacune des IP avec un peu de garbage autour qu'un sed saura enlever relativement facilement (pas testé), restera à `| while read IP_a_prevenir` pour envoyer des mails

            voilà voilà, tu as les grandes lignes. Si tu ne sais pas lire le awk, ça va être un peu plus dur :-) les pages de man sont un peu plus lisibles qu'elles ne l'étaient quand j'ai commencé :-)

            • [^] # Re: Début ?

              Posté par  . Évalué à 0.

              Ouais ça ressemble moi à du php ou autre que je ne le pensais…
              ton 7 c'est quoi? il ressemble en variable plus tard…
              Bon le reste je comprends ça va reste à le peaufiner maintenant.

              Merci infiniment en tout cas au moins j'ai une piste pour faire ce que je veux ça m'orient déjà énormément.
              Merci merci

              • [^] # Re: Début ?

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

                man sort : le -k correspond au champ sur lequel trier, l'IP est dans le champ 7 (il faut compter les espaces, le séparateur par défaut).

                bon, ça affiche unknown[151.232.189.104]: mais un sed bien fait pourra virer le unknown[ et le ]: au besoin

  • # Fail2Ban

    Posté par  . Évalué à 2.

    Pourquoi ne pas utiliser Fail2ban qui fera ce que tu cherches à faire mais en mieux ???

    • [^] # Re: Fail2Ban

      Posté par  . Évalué à 1.

      Parce qu'avant d'utiliser de tels logiciels je veux comprendre comment ça fonctionne :-) même si oui au final fail2ban est plu recommandé dans un milieu professionnel

      • [^] # Re: Fail2Ban

        Posté par  . Évalué à 3.

        pourtant tu utilises linux et postfix,
        est-ce que tu sais comment le noyau linux fonctionne ?
        ou comment circulent un email sur internet dns, mx, mta, mda, etc ?

Suivre le flux des commentaires

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