Aller au contenu

Administration Unix - TP séance 16

À la fin de la séance, déposez votre fichier de réponses sur la page Ametice en suivant bien les instructions, même si vous n'avez pas fini la planche ; lorsque vous aurez terminé, vous pourrez re-déposer la version finale.

Important : pour travailler ce TP, faites tous les essais dans une VM, afin de ne pas risquer "d'abîmer" votre système hôte.

Exercice 1 : Tâches différées avec at

a) Recopiez le code ci-dessous dans le fichier compresse-gif.sh :

#! /bin/bash
echo "Compression des images GIF..."
find ~ -name "*.gif" -type f -print -exec gzip -9 {} \;

Repérez des fichiers GIF en tapant : locate .gif
puis recopiez quelques images GIF dans votre répertoire principal.

Testez le script, puis décompressez les images avec gunzip.

b) À l'aide d'une commande at, provoquez le lancement de ce script dans par exemple 2 minutes. Vérifiez à l'aide de atq que le job est programmé. Attendez 2 minutes puis vérifiez à l'aide de atq que la queue est vide. Vérifiez enfin que vos images GIF ont été compressées.

c) Installez mailutils (configuration : envoi local uniquement). Attention : pour la configuration utilisez les flêches, Tab et Enter.

Décompressez vos images GIF avec gunzip, puis refaites le b). Vérifiez avec la commande mail que vous avez reçu un message avec la sortie du job.

Exercice 2 : Tâches différées avec cron

a) Recopiez le code ci-dessous dans le fichier nettoyage.sh :

#! /bin/bash
exec >> /tmp/bilan-nettoyage.txt 2>/dev/null
echo
date
echo "Place avant nettoyage :"
df -t ext4
apt clean
apt -y autoremove
echo "Place après nettoyage :"
df -t ext4

Exécutez le script avec sudo ; où sont affichés les résultats ?

Remarque : si vous avez testé le script sans sudo, puis que vous le relancez avec sudo, le script peut éventuellement échouer en écriture sur le fichier dans \tmp ; en effet, \tmp possède le sticky bit et les droits peuvent être régis par des paramètres spécifiques du noyau Linux. La solution ici serait de supprimer le fichier dans /tmp.

b) Faites un crontab en temps que root de manière à exécuter ce script toutes les 3 minutes (donner le chemin absolu du script).

Installez un package quelconque, par exemple gedit, puis désintallez-le.

Vérifiez la sortie au bout du délai, ainsi que la boîte mail de root. (Remarque : on ne reçoit un mail que s'il y a un affichage ou une erreur ; comme ici le script se redirige avec exec, il n'y aura pas de mail).

Enfin, désactivez la tâche en la commentant dans le crontab.

Exercice 3 : Création d'un service systemd

a) Voici un petit serveur TCP/IP en bash, qui fonctionne grâce à la commande netcat du paquet netcat-openbsd.

Recopiez le code ci-dessous dans le fichier serveur-rot13.sh :

#! /bin/bash

port=13000

dialoguer()
{
    echo "Service de traduction ROT13 ; entrez une ligne :"
    read -r ligne
    tr a-zA-Z n-za-mN-ZA-M <<< "$ligne"
}

tmpfifo=$(mktemp -u)
mkfifo "$tmpfifo"
trap 'echo "Terminé." ; rm -f "$tmpfifo"' EXIT

echo "Serveur en écoute sur le port $port..."
while true ; do
    netcat -l4 "$port" < "$tmpfifo" | dialoguer > "$tmpfifo"
done

Exécutez le script dans un terminal et laissez-le tourner.

b) Dans un autre terminal, lancez un client :

$ netcat localhost 13000

puis tapez quelques mots, puis Enter 2 fois ; vous verrez la réponse du serveur avec le texte crypté en ROT13. Renouvelez l'opération en tapant le texte crypté pour voir le texte original.

c) Le but est maintenant que ce serveur fonctionne tout le temps, même si on tue le processus ou reboote la machine. Nous allons donc utiliser systemd pour le transformer en service.

  • Recopiez serveur-rot13.sh dans /usr/local/bin, donnez son propriétaire et groupe à root.

  • Créez le fichier /lib/systemd/system/myrot13.service :

[Unit]
Description=My ROT13 service
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
ExecStart=/bin/bash /usr/local/bin/serveur-rot13.sh

[Install]
WantedBy=multi-user.target

d) Activez puis démarrez le service avec systemctl.

Vérifiez le status avec systemctl : si vous voyez un message d'erreur tel que netcat: Address already in use, c'est que vous avez oublié d'arrêter le script que vous aviez lancé question a) ; la solution est d'arrêter le script et relancer le service (restart).

Testez le service avec le client netcat comme à la question b).

e) Repérez le PID du serveur (ou de ses composants) avec ps ou systemctl status et tuez-le ; vérifiez que le service est automatiquement relancé (donc avec un nouveau PID).

f) Redémarrez la VM et refaites les vérifications de la question d).

g) Placez le masque sur le service avec systemctl. Le service est-il encore actif ? Stoppez le service. Pouvez-vous le relancer ? Comment débloquer le service ?