Récap accès ssh

Un script pour récapituler les connexions ssh réussies

#!/usr/bin/awk -f
 
# Ce script est prévu pour s'appliquer sur le auth.log (ou syslog, suivant la conf) et récapituler les accès ssh.
# Quand la connexion est close immédiatemment on efface simplement (robots qui lancent des commandes à distance, ici un accès toutes les minutes).
# Sinon, on efface les lignes mais on restitue un résumé à la fin.
 
BEGIN {
  nb=0;
  only_ssh_by_key=0; # Si on ne veut pas le reste
  del_short_conn=0; # en fait, supprime les fermetures qui suivent immédiatement l'ouverture
}
 
/Accepted p[^ ]+ for/ {
  var=1; nb++; 
  case[nb]=$7; user[nb]=$9; pidssh[nb]=$5; ip[nb]=$11; debut[nb]=$1 " " $2 " " $3;
  next;
}
 
{
  if (var==1) {
    # on oublie toujours la ligne 'session opened for user' qui suit 'Accepted publickey'
    var++;
    next;
  }
  if (var==2){
    # mais ici, on a pas toujours le close sur la ligne qui suit, on vérifie
    if (pidssh[nb]=$5 && del_short_conn==1) {
      # OK on efface nos variables et on oublie la ligne
      delete case[nb]
      delete user[nb]
      delete pidssh[nb];
      delete ip[nb];   
      delete debut[nb];
      var=0;
      next;
    }
    var=0;
  }
  for (i in pidssh) {
    if (pidssh[i]=$5) {
      # on est sur le close ssh, on vire la ligne mais on mémorise l'heure
      delete pidssh[i];
      fin[i]=$1 " " $2 " " $3;
      next;
    }
  }
  # fin des traitements, on affiche si on ne voulait pas que le recap
  if (only_ssh_by_key == 0) { print $0 }
}
END {
  print "Les connexions ssh réussies :";
  for (i in ip) { print user[i] "(" ip[i] ") s'est connecté de *" debut[i] "* à *" fin[i] "* (" case[i] ")";}
}