Scripts utiles pour Linux

De knowledge
Révision datée du 26 février 2025 à 18:01 par Jpinon (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

Il y a des commandes qui manquent sous linux ou des scripts utiles que l'on devrait avoir sous la main.

Un cat agnostique

La commande cat permet (entre autre) de voir le contenu d'un fichier alors que zcat fait la même chose avec un fichier compressé.

Quand on tente de consulter les logs dans /var/log on voit que le système est intelligent, il tronçonne les fichiers pour que ceux-ci ne soient pas de taille démesurée mais aussi les compresse (gzip) quand ils sont un peu vieux.

Exemple pour le fichier d'audit des connexions:

ls -1t /var/log/auth.log*
/var/log/auth.log
/var/log/auth.log.1
/var/log/auth.log.2.gz
/var/log/auth.log.3.gz
/var/log/auth.log.4.gz

Le premier est le fichier actif /var/log/auth.log. Le second le fichier des évènements d'audit un peu plus anciens. Qand aux 3 autres ce sont des logs plus anciennes qui on étés "zippées". En général on s'occupe du fichier en cours, voire du précédent. L'usage des autres est plus rare.

Cependant si on désire faire des recherches plus approfondie on aimerait pouvoir traiter l'ensembles des fichiers dans la même commande du style : azcat fichier qui ferait un cat si le fichier est un fichier texte et zcat si il est compressé.

On pourrait se fier à l'extension du fichier mais... on n'est pas sous Windows on est sur un "vrai" OS. La commande file est là pour nous aider.

Le code de azcal est le suivant:

#!/bin/bash
if [ $# -ne 1 ];
    then >&2 echo "illegal number of parameters"; exit
fi
export FORMAT=`file -b $1 | cut -d " " -f 1`
case $FORMAT in
        ASCII)
                cat $1
                ;;
        gzip)
                zcat $1
                ;;
        *)
                >&2 echo "Error: Not supported format $FORMAT"
                ;;
esac
  • Lignes 2 à 4 on vérifie le nombre de paramètres (on n'en veut qu'un)
  • Ligne 5 on demande à file quel est le format du fichier (on prends le premier mot car dans certains cas c'est très "bavard"). Essayez sur un fichier gzipp par exemple!
  • ligne 6 on fait un switch sur le type de fichier
  • lignes 7 à 9 on gère le cas où c'est un fichier ASCII
  • lignes 10 à 12 le cas ou c'est un fichier gzip
  • lignes 13 à 15 on imprime une erreur en cas de format non pris en charge.

On pourra gérer d'autres formats quand ce sera nécessaire.

Remarque : pour écrire simplement sur stderr j'ai utilisé une syntaxe un peu exotique, faite précéder le echo par >&2. Parfois la syntaxe de bash est étrange.

Le programme n'est pas aussi souple que cat ou zcat cat on ne peut donner qu'un seul argument.

un cat * est possible quand un azcat * nous donnera une erreur pour peut que le "*" renvoie a plusieurs fichiers.

azcat *
illegal number of parameters

Un exemple d'utilisation est de rechercher le nombre de "Failed passord" dans /var/log/auth.log*.

for f in `ls -1tr /var/log/auth.log*`; do  ./azcat $f | grep "Failed password for" | sed "s/sshd.*from//" | awk '{print $1,$2}' | uniq -c; done

Oui c'est déja une ligne de commande compliquée alors imaginez si il fallait faire la différence entre cat et zcat dedans! Pour info ca donne une liste :

   3596 Jan 27
   6400 Jan 28
   7823 Jan 29
   9534 Jan 30
   8879 Jan 31
   8828 Feb 1
     44 Feb 2
   8253 Feb 2
   9456 Feb 3
   8923 Feb 4
   7477 Feb 5
  10970 Feb 6
  10274 Feb 7
   7904 Feb 8
     55 Feb 9
   9677 Feb 9
   8596 Feb 10
   7629 Feb 11
   7359 Feb 12
   8585 Feb 13
  17587 Feb 14
   8750 Feb 15
     24 Feb 16
   9241 Feb 16
   9410 Feb 17
  10094 Feb 18
   8293 Feb 19
   7819 Feb 20
   7474 Feb 21
   6606 Feb 22
     13 Feb 23
   8621 Feb 23
   8839 Feb 24
   7100 Feb 25
  11402 Feb 26

On remarque que, le dimanche, les pirates se reposent mais que pour la saint valentin ils mettent les bouchées doubles et que, oui, il est urgent d'installer fail2ban!