Scripts Unix

Introduction

Les scripts Unix sont des outils puissants pour l'automatisation des tâches système sous Linux et Unix. Ils permettent de combiner des commandes shell, des outils système et des langages de script comme Bash, Python ou Perl.

Bases des Scripts Unix

Structure d'un script Bash


#!/bin/bash

# Commentaire sur une ligne
: '
Commentaire sur plusieurs lignes
'

# Déclaration de variables
NOM_VARIABLE="valeur"
TABLEAU=("élément1" "élément2" "élément3")

# Fonction simple
function salutation() {
    local nom=$1
    echo "Bonjour $nom"
}
                            

Gestion des fichiers


# Créer un fichier
touch /tmp/test.txt

# Lire un fichier
cat /tmp/test.txt

# Écrire dans un fichier
echo "Contenu du fichier" > /tmp/test.txt

# Copier un fichier
cp /tmp/test.txt /tmp/backup/
                            

Exemples Pratiques

Surveillance Système

#!/bin/bash

# Surveillance des ressources système
function monitor_system() {
    # CPU
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
    
    # Mémoire
    MEM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
    MEM_USED=$(free -m | awk '/Mem:/ {print $3}')
    MEM_FREE=$(free -m | awk '/Mem:/ {print $4}')
    
    # Disque
    DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
    
    # Envoi à Zabbix
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k cpu.usage -o "$CPU_USAGE"
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k mem.total -o "$MEM_TOTAL"
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k mem.used -o "$MEM_USED"
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k mem.free -o "$MEM_FREE"
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k disk.usage -o "$DISK_USAGE"
}
                            
Surveillance des Services

#!/bin/bash

# Liste des services à surveiller
SERVICES=("apache2" "mysql" "nginx" "postgresql")

function check_services() {
    for service in "${SERVICES[@]}"; do
        if systemctl is-active --quiet $service; then
            status="running"
        else
            status="stopped"
        fi
        
        # Envoi à Zabbix
        zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "service.$service" -o "$status"
    done
}
                            
Surveillance des Logs

#!/bin/bash

# Surveillance des logs système
function monitor_logs() {
    # Vérification des erreurs dans syslog
    ERROR_COUNT=$(grep -i "error" /var/log/syslog | wc -l)
    WARNING_COUNT=$(grep -i "warning" /var/log/syslog | wc -l)
    
    # Vérification des erreurs dans les logs Apache
    APACHE_ERRORS=$(grep -i "error" /var/log/apache2/error.log | wc -l)
    
    # Envoi à Zabbix
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "log.syslog.errors" -o "$ERROR_COUNT"
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "log.syslog.warnings" -o "$WARNING_COUNT"
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "log.apache.errors" -o "$APACHE_ERRORS"
}
                            
Nettoyage Automatique

#!/bin/bash

# Script de nettoyage automatique
function system_cleanup() {
    # Nettoyage des fichiers temporaires
    find /tmp -type f -atime +7 -delete
    find /var/tmp -type f -atime +7 -delete
    
    # Nettoyage des logs
    find /var/log -type f -name "*.gz" -delete
    find /var/log -type f -name "*.old" -delete
    
    # Rotation des logs
    logrotate -f /etc/logrotate.conf
    
    # Nettoyage du cache apt
    apt-get clean
    apt-get autoremove -y
    
    # Envoi du statut à Zabbix
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "maintenance.last_run" -o "$(date +%Y-%m-%d\ %H:%M:%S)"
}
                            
Surveillance des Processus

#!/bin/bash

# Surveillance des processus critiques
function monitor_processes() {
    # Liste des processus à surveiller
    PROCESSES=("apache2" "mysql" "nginx")
    
    for process in "${PROCESSES[@]}"; do
        # Vérification du nombre d'instances
        COUNT=$(pgrep -c $process)
        
        # Vérification de l'utilisation CPU
        CPU_USAGE=$(ps aux | grep $process | grep -v grep | awk '{print $3}')
        
        # Vérification de l'utilisation mémoire
        MEM_USAGE=$(ps aux | grep $process | grep -v grep | awk '{print $4}')
        
        # Envoi à Zabbix
        zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "process.$process.count" -o "$COUNT"
        zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "process.$process.cpu" -o "$CPU_USAGE"
        zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "process.$process.mem" -o "$MEM_USAGE"
    done
}
                            
Surveillance Réseau

#!/bin/bash

# Surveillance des connexions réseau
function monitor_network() {
    # Nombre de connexions établies
    ESTABLISHED=$(netstat -an | grep ESTABLISHED | wc -l)
    
    # Nombre de connexions en attente
    LISTENING=$(netstat -an | grep LISTEN | wc -l)
    
    # Bande passante utilisée
    RX_BYTES=$(cat /sys/class/net/eth0/statistics/rx_bytes)
    TX_BYTES=$(cat /sys/class/net/eth0/statistics/tx_bytes)
    
    # Envoi à Zabbix
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "net.established" -o "$ESTABLISHED"
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "net.listening" -o "$LISTENING"
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "net.rx_bytes" -o "$RX_BYTES"
    zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "net.tx_bytes" -o "$TX_BYTES"
}
                            

Bonnes Pratiques

  • Toujours utiliser le shebang approprié (#!/bin/bash)
  • Utiliser des variables en majuscules pour les constantes
  • Commenter le code de manière claire et concise
  • Gérer les erreurs avec trap
  • Utiliser des fonctions pour modulariser le code
  • Tester les scripts dans un environnement de test
  • Implémenter la journalisation
  • Utiliser des chemins absolus pour les fichiers système