Directives de base pour le scripting Shell
Avant de commencer l'écriture de scripts complexes, il est essentiel de respecter certaines bonnes pratiques pour garantir la maintenabilité et la robustesse du code :
- Utilisez toujours le shebang approprié en début de fichier :
#!/bin/bash. - Commentez votre code et utilisez une indentation de 4 espaces pour la clarté.
- Définissez les variables globales en MAJUSCULES et les variables locales en minuscules.
- Utilisez le mot-clé
localdans les fonctions pour éviter les conflits de portée. - Pour le débogage, utilisez
set -e(arrêt en cas d'erreur) etset -x(affichage de l'exécution).
1. Génération de chaînes et nombres aléatoires
Voici plusieurs approches pour générer des identifiants ou des mots de passe temporaires :
# Chaîne de 10 caractères alphanumériques
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 10 ; echo
# Utilisation de openssl pour une chaîne aléatoire
openssl rand -hex 5
# Nombre aléatoire entre 1 et 1000 via la variable système
echo $((RANDOM % 1000 + 1))
2. Fonction d'affichage avec couleurs
Pour améliorer la lisibilité des logs dans le terminal :
log_message() {
local color_code=$1
local message=$2
case $color_code in
"success") echo -e "\e[32m[OK] $message\e[0m" ;;
"error") echo -e "\e[31m[ERREUR] $message\e[0m" ;;
"warn") echo -e "\e[33m[ALERTE] $message\e[0m" ;;
*) echo "$message" ;;
esac
}
log_message "success" "Traitement terminé avec succès"
3. Création automatisée d'utilisateurs
Ce script lit une liste de noms et crée les comptes avec des mots de passe aléatoires.
#!/bin/bash
USER_LIST="user_alpha user_beta user_gamma"
LOG_FILE="creations_log.txt"
for username in $USER_LIST; do
if id "$username" &>/dev/null; then
echo "L'utilisateur $username existe déjà."
else
temp_pass=$(openssl rand -base64 12)
useradd "$username"
echo "$temp_pass" | passwd --stdin "$username" &>/dev/null
echo "Compte : $username | Password : $temp_pass" >> $LOG_FILE
echo "Utilisateur $username créé."
fi
done
4. Vérification de la présence d'un paquet
#!/bin/bash
package_name="htop"
if command -v $package_name &>/dev/null; then
echo "Le paquet $package_name est installé."
else
echo "Le paquet $package_name est manquant."
fi
5. Monitoring des services critiques
Vérifier si un processus (ex: nginx) tourne, sinon envoyer une alerte.
#!/bin/bash
SERVICE="nginx"
if ! pgrep -x "$SERVICE" > /dev/null; then
echo "Le service $SERVICE est arrêté sur $(hostname)" | mail -s "Alerte Service" admin@domain.com
fi
6. Test de connectivité (Ping) sur plusieurs hôtes
#!/bin/bash
HOSTS="1.1.1.1 8.8.8.8 192.168.1.1"
for target in $HOSTS; do
count=0
max_retries=3
while [ $count -lt $max_retries ]; do
if ping -c 1 -W 1 "$target" > /dev/null; then
echo "Hôte $target : Joignable"
break
fi
((count++))
done
[ $count -eq $max_retries ] && echo "Hôte $target : Indisponible après 3 essais"
done
7. Surveillance des ressources système
Surveiller l'usage CPU et RAM avec des seuils d'alerte.
#!/bin/bash
# Seuil de 85%
LIMIT=85
current_cpu=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d. -f1)
current_mem=$(free | grep Mem | awk '{print $3/$2 * 100.0}' | cut -d. -f1)
if [ "$current_cpu" -gt "$LIMIT" ]; then
echo "Alerte : Charge CPU élevée ($current_cpu%)"
fi
if [ "$current_mem" -gt "$LIMIT" ]; then
echo "Alerte : Utilisation mémoire critique ($current_mem%)"
fi
8. Surveillance de l'espace disque à distance
Utilise SSH pour vérifier l'espace disque sur un serveur distant.
#!/bin/bash
REMOTE_SERVER="192.168.1.50"
THRESHOLD=90
ssh root@$REMOTE_SERVER "df -h" | grep '^/dev/' | while read -r line; do
usage=$(echo $line | awk '{print $5}' | sed 's/%//')
partition=$(echo $line | awk '{print $1}')
if [ "$usage" -ge "$THRESHOLD" ]; then
echo "Partition $partition sur $REMOTE_SERVER est presque pleine : $usage%"
fi
done
9. Validation de l'accessibilité d'une URL
#!/bin/bash
check_endpoint() {
local url=$1
local status=$(curl -L -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "$url")
if [ "$status" -eq 200 ]; then
echo "Site $url : Fonctionnel"
else
echo "Site $url : Erreur (Code: $status)"
fi
}
check_endpoint "https://www.google.com"
10. Vérification du statut de réplication MySQL
#!/bin/bash
status_slave=$(mysql -u root -p'password' -e "SHOW SLAVE STATUS\G" | grep "_Running:" | awk '{print $2}')
for state in $status_slave; do
if [ "$state" != "Yes" ]; then
echo "Erreur : La réplication MySQL est interrompue !"
exit 1
fi
done
echo "Réplication MySQL OK."
11. Bannissement automatique des IP suspectes
Analyse des logs pour bloquer les IP effectunat trop de requêtes.
#!/bin/bash
LOG_PATH="/var/log/nginx/access.log"
LIMIT=200
BAD_IPS=$(tail -n 1000 "$LOG_PATH" | awk '{print $1}' | sort | uniq -c | awk -v limit="$LIMIT" '$1 > limit {print $2}')
for ip in $BAD_IPS; do
if ! iptables -C INPUT -s "$ip" -j DROP &>/dev/null; then
iptables -A INPUT -s "$ip" -j DROP
echo "IP bloquée : $ip"
fi
done
12. Validation d'une adresse IP par RegEx
#!/bin/bash
is_valid_ip() {
local target_ip=$1
local regex='^([0-9]{1,3}\.){3}[0-9]{1,3}$'
if [[ $target_ip =~ $regex ]]; then
IFS='.' read -r -a octets <<< "$target_ip"
for o in "${octets[@]}"; do
if ((o < 0 || o > 255)); then
return 1
fi
done
return 0
fi
return 1
}
is_valid_ip "192.168.1.256" || echo "Format IP invalide"
13. Détection de fichiers contenant un mot-clé
#!/bin/bash
search_dir="/var/log"
keyword="ERROR"
find "$search_dir" -type f -name "*.log" | while read -r file; do
if grep -q "$keyword" "$file"; then
echo "Occurence trouvée dans : $file"
fi
done
14. Surveillance d'un répertoire en temps réel
Nécessite inotify-tools.
#!/bin/bash
TARGET_DIR="/tmp/monitor"
inotifywait -m -e create,modify "$TARGET_DIR" | while read -r path event file; do
echo "[$(date)] Action $event sur $file" >> /var/log/dir_monitor.log
done
15. Sélection dynamique de l'interface réseau
#!/bin/bash
interfaces=$(ls /sys/class/net | grep -v "lo")
echo "Sélectionnez une interface :"
select net_int in $interfaces; do
if [ -n "$net_int" ]; then
ip_addr=$(ip addr show "$net_int" | grep "inet " | awk '{print $2}')
echo "Interface : $net_int | IP : $ip_addr"
break
else
echo "Choix invalide."
fi
done
16. Visualisation du débit réseau
#!/bin/bash
IFACE="eth0"
while true; do
RX1=$(cat /sys/class/net/$IFACE/statistics/rx_bytes)
TX1=$(cat /sys/class/net/$IFACE/statistics/tx_bytes)
sleep 1
RX2=$(cat /sys/class/net/$IFACE/statistics/rx_bytes)
TX2=$(cat /sys/class/net/$IFACE/statistics/tx_bytes)
echo "IN: $(((RX2-RX1)/1024)) KB/s | OUT: $(((TX2-TX1)/1024)) KB/s"
done
17. Sauvegarde automatisée de base de données
#!/bin/bash
DEST="/backup/db"
DB_NAME="production"
DATE=$(date +%Y%m%d_%H%M)
mysqldump -u root -p'password' "$DB_NAME" | gzip > "$DEST/${DB_NAME}_$DATE.sql.gz"
find "$DEST" -mtime +30 -type f -delete
18. Script de contrôle pour Nginx
#!/bin/bash
case "$1" in
start) /usr/sbin/nginx ;;
stop) /usr/sbin/nginx -s stop ;;
reload) /usr/sbin/nginx -s reload ;;
status) pgrep -x nginx >/dev/null && echo "En cours" || echo "Arrêté" ;;
*) echo "Usage: $0 {start|stop|reload|status}" ;;
esac
19. Menu de connexion SSH simplifié
#!/bin/bash
# Fichier hosts : Nom IP Port
PS3="Se connecter à : "
select server in $(awk '{print $1}' servers.conf); do
ip=$(grep "$server" servers.conf | awk '{print $2}')
port=$(grep "$server" servers.conf | awk '{print $3}')
ssh -p "$port" "root@$ip"
break
done
20. Calcul de la somme d'une série de nombres
#!/bin/bash
total=0
for val in "$@"; do
if [[ $val =~ ^[0-9]+$ ]]; then
((total += val))
fi
done
echo "Somme totale : $total"
21. Renommage en masse de fichiers
#!/bin/bash
# Remplace les espaces par des underscores
for file in *\ *; do
mv "$file" "${file// /_}"
done
22. Calcul de la taille totale d'une extension spécifique
#!/bin/bash
find . -name "*.jpg" -ls | awk '{sum+=$7} END {printf "Taille totale : %.2f MB\n", sum/1024/1024}'
23. Scanner de ports basique
#!/bin/bash
TARGET="127.0.0.1"
for port in {20..80}; do
(echo >/dev/tcp/$TARGET/$port) &>/dev/null && echo "Port $port ouvert"
done
24. Automatisation avec Expect (SSH)
#!/usr/bin/expect
set timeout 10
spawn ssh root@192.168.1.100
expect "password:"
send "mon_password\r"
expect "#"
send "df -h\r"
send "exit\r"
expect eof
25. Changement de mot de passe à distance
#!/bin/bash
while read ip user old_pass; do
new_pass=$(openssl rand -base64 8)
sshpass -p "$old_pass" ssh "$user@$ip" "echo '$new_pass' | passwd --stdin $user"
echo "$ip $new_pass" >> nouvelles_cles.log
done < liste_serveurs.txt
26. Table de multiplication en Bash
#!/bin/bash
for i in {1..9}; do
for j in $(seq 1 $i); do
echo -n "$j*$i=$((i*j)) "
done
echo ""
done
27. Gestion d'arguments avec getopts
#!/bin/bash
while getopts "f:v" opt; do
case $opt in
f) file=$OPTARG ;;
v) verbose=1 ;;
*) echo "Invalide" ;;
esac
done
echo "Fichier : $file, Mode verbeux : $verbose"
28. Rotation simple de fichiers de logs
#!/bin/bash
MAX_SIZE=1048576 # 1MB
LOG="/var/log/app.log"
if [ $(stat -c%s "$LOG") -gt $MAX_SIZE ]; then
mv "$LOG" "$LOG.$(date +%s).bak"
touch "$LOG"
fi
29. Extraction d'informations système
#!/bin/bash
echo "Système d'exploitation : $(uname -o)"
echo "Version Noyau : $(uname -r)"
echo "Architecture : $(uname -m)"
30. Test de latence réseau moyen
#!/bin/bash
host="google.com"
ping -c 5 $host | tail -1 | awk -F '/' '{print "Latence moyenne : " $5 " ms"}'