Scripts Bash sur mon Raspberry Pi 5
Premier problème... L'ajout de films et de séries
Lorsque j’ajoute un film ou un épisode de série sur mon NAS via FileBrowser, comme vous pouvez le voir sur l’image, un problème se pose : le fichier ajouté n’a pas les bons droits. Résultat, lorsque j’actualise mes bibliothèques dans Jellyfin, celui-ci ne détecte pas les nouveaux contenus, ce qui m’empêche évidemment de les regarder.
Au lieu donc d'aller dans le répertoire et de changer les permissions sur le bon fichier j'ai décidé de faire un script qui le fait pour moi.
#!/bin/bash
menu () {
clear
echo "==============================="
echo "Bibliothèque à mettre à jour"
echo "==============================="
echo ""
echo "1 - Films"
echo "2 - Séries"
echo "3 - Saga"
echo "4 - Quitter le menu"
echo ""
read -rp "Choisir une option : " choix
echo ""
}
while true; do
menu
case $choix in
1)
echo "================================="
echo "Mise à jour des droits sur Films"
echo "================================="
sudo chmod 775 -R /mnt/StoragePool/Media/Films/
ls -lt /mnt/StoragePool/Media/Films | head -n 5
echo ""
;;
2)
echo "==================================="
echo "Mise à jour des droits sur Séries"
echo "==================================="
sudo chmod 775 -R /mnt/StoragePool/Media/'S'$'\303\251''ries - Saga'/'S'$'\303\251''ries'/
ls -lt /mnt/StoragePool/Media/'S'$'\303\251''ries - Saga'/'S'$'\303\251''ries'/ | head -n 5
echo ""
;;
3)
echo "==================================="
echo "Mise à jour des droits sur Saga"
echo "==================================="
sudo chmod 775 -R /mnt/StoragePool/Media/'S'$'\303\251''ries - Saga'/
ls -lt /mnt/StoragePool/Media/'S'$'\303\251''ries - Saga'/ | head -n 5
echo ""
;;
4)
echo "============="
echo "Fin du script"
echo "============="
exit 0
;;
*)
echo "================"
echo "Erreur de saisie"
echo "================"
exit 0
;;
esac
read -rp "Appuyer sur Entrée pour quitter le menu..."
done
Ce script crée un petit menu qui me permet de choisir
la bibliothèque que je souhaite modifier. Une fois mon
choix effectué grâce à un switch case, il applique les
bons droits de manière récursive sur le dossier, ses sous-dossiers
et tous les fichiers. Ensuite, il m’affiche les cinq derniers fichiers
modifiés à l’aide de la commande : ls -lt <chemin> | head -n 5.
Deuxième problème... Les mises à jour WGDashboard
Pour gérer mes configurations VPN, j’utilise WGDashboard comme interface graphique. C’est un excellent outil, à la fois simple et moderne. Cependant, sa mise à jour est une tâche répétitive qui méritait d’être automatisée avec un script.
#!/bin/bash
#Script pour update et restart WGDashboard
chemin_wgd="/etc/wireguard/WGDashboard/src/wgd.sh"
if [ ! -f "$chemin_wgd" ]; then #vérifie si le fichier existe ! est pour marquer le contraire et -f pour savoir si le fichier existe et est régulier
echo "Erreur : le fichier n'existe pas"
exit 1
fi #fin de la condition
#fonction pour afficher le menu avec les options
menu() {
clear
echo "================================"
echo "Menu de Gestion pour WGDashboard"
echo "================================"
echo ""
echo "1 - Mettre à jour WGDashboard"
echo "2 - Redémarrer WGDashboard"
echo "3 - Quitter le menu"
echo ""
#prend le numéro que l'on a choisi et le met dans la variable choix
read -rp "Choisir une option : " choix
echo ""
}
#Boucle
while true; do
menu #appel de la fonction
case $choix in #prend le numéro dans la variable choix pour le comparer au cas possibles
1)
echo "============================="
echo "Mise à jour de WGDashboard..."
echo "============================="
cd /etc/wireguard/WGDashboard/src
./wgd.sh update
;; #termine la branche du case
2)
echo "============================="
echo "Redémarrage de WGDashboard..."
echo "============================="
cd /etc/wireguard/WGDashboard/src
./wgd.sh restart
;;
3)
echo "============="
echo "Fin du script"
echo "============="
exit 0
;;
*)
echo "================"
echo "Erreur de saisie"
echo "================"
exit 0
;;
esac #fin du case
echo ""
read -rp "Appuie sur Entrée pour continuer..." #retour au menu de départ
done #fin de la boucle while
Comme le premier, ce script affiche un menu et utilise un
switch case pour sélectionner différentes options. Les choix
proposés sont la mise à jour de WGDashboard ou son redémarrage. L’option
de mise à jour récupère le script de démarrage de WGDashboard et y ajoute
l’argument update, tandis que l’option de redémarrage applique le même
principe avec l’argument restart.
Troisième problème... Vérifier les IP bannies sur fail2ban
Fail2ban, un outil incontournable en matière de cybersécurité, me sert à protéger mon NAS. J’ai configuré deux prisons (jails) : l’une avec la 2FA activée et l’autre sans 2FA, pour permettre un accès en SFTP et via VSCode, afin de coder mon portfolio directement sur mon NAS avant de l’envoyer sur mon serveur d’hébergement. Cependant, il m’arrive parfois de me tromper de mot de passe ou de code 2FA, ce qui entraîne le bannissement du client utilisé. J’aimerais donc pouvoir identifier dans quelle jail le client est banni et savoir si je peux le débannir.
#!/bin/bash
#Script pour deban une IP d'une jail fail2ban
#fonction du menu
menu(){
clear
echo ""
echo "============================="
echo "Menu de gestion pour fail2ban"
echo "============================="
echo ""
echo "1 - Jail SSHD"
echo "2 - Jail SSHD-VSCODE"
echo "3 - Quitter le menu"
echo ""
read -rp "Quelle jail voulez vous voir ? " choix
echo ""
}
#boucle while pour afficher le menu et les choix
while true; do
menu
case $choix in #intégration de la valeur 1,2,3 dans $choix
1)
echo "========="
echo "Jail SSHD"
echo "========="
sudo fail2ban-client status sshd
ip_ban=$(sudo fail2ban-client status sshd | grep "Banned IP list:" | cut -d':' -f2 | xargs) #affectation de la variable ip_ban qui prend la valeur de Banned IP list
if [[ -n $ip_ban ]]; then #-n signifie la chaine n'est pas vide donc la condition est si la chaine $ip_ban n'est pas vide alors...
echo ""
echo "Adresse(s) IP bannie(s) :"
echo "$ip_ban"
echo ""
read -rp "Entrez l'adresse IP à deban : " ip
sudo fail2ban-client set sshd unbanip "$ip"
echo "L'adresse $ip a été deban avec succès."
fi
;;
2)
echo "================"
echo "Jail SSHD-VSCODE"
echo "================"
sudo fail2ban-client status sshd-vscode
ip_ban=$(sudo fail2ban-client status sshd-vscode | grep "Banned IP list:" | cut -d':' -f2 | xargs)
if [[ -n $ip_ban ]]; then
echo ""
echo "Adresse(s) IP bannie(s) :"
echo "$ip_ban"
echo ""
read -rp "Entrez l'adresse IP à deban : " ip
sudo fail2ban-client set sshd-vscode unbanip "$ip"
echo "L'adresse $ip a été deban avec succès."
fi
;;
3)
echo "============="
echo "Fin du script"
echo "============="
exit 0
;;
*)
echo "================"
echo "Erreur de saisie"
echo "================"
exit 0
;;
esac
echo ""
read -rp "Appuie sur Entrée pour continuer..."
done
Ce script génère un menu, comme les deux précédents, et me demande de quelle jail je souhaite consulter le statut. Une fois mon choix effectué, s’il y a des IP bannies, le script me permet de les débannir. En revanche, s’il n’y a aucune adresse bannie, il poursuit simplement son exécution jusqu’à sa condition de fin.
Exemple sans IP bannie
Et exemple avec une IP bannie