Backuper automatiquement ses fichiers de travail chaque vendredi à 17h ou piéger l'ordinateur d'un ami pour lui faire dire « Big Brother is watching you » ? C'est possible sous Linux et macOS via le cron.

Au cœur des systèmes d’exploitation de la grande famille Unix, dont font partie les systèmes Linux (dont Android) et macOS, vit un dæmon nommé cron. En tant que dæmon, c’est un programme qui tourne en tâche de fond. Chaque minute, le cron regarde dans un fichier appelé crontab s’il a une commande à lancer à cette date et heure précise, et l’exécute s’il en voit une.

Le crontab est donc un véritable emploi du temps automatisé, que vous pouvez modifier vous-même avec quelques lignes de code pour en faire quelque chose d’utile, d’amusant ou de franchement méchant. Les exemples suivants sont basés sur Ubuntu ; s’ils ne fonctionneront pas forcément tels quels sous macOS, le principe reste le même.

On rappelle que dans un terminal, Ctrl+C et Ctrl+V n’ont pas leur effet habituel, et qu’il faut passer par le clic droit et choisir « copier » ou « coller », ou utiliser le clic du milieu à la place de ce dernier.

Le cron, par la pratique

cron_1

Attrapez un terminal (Ctrl+Alt+T sous Ubuntu, ou cherchez-le dans vos applications) et faites crontab -e pour commencer à écrire dans le crontab. Mis à part de longues lignes d’explications, il est vide si vous n’y avez pas touché ; vous pouvez d’ailleurs directement lister le contenu de votre crontab depuis le terminal avec crontab -l.

cron_2

Ici, les commentaires (précédés d’un #) montrent un exemple pour backuper son dossier Home, contenant tous les utilisateurs, dans une archive .tgz du dossier /var/backups, tous les lundis à 5h du matin.

0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

En remplaçant /home/ par le chemin d’un dossier que vous voulez backuper, et /var/backups par le chemin du lieu de backup, vous pouvez vous resservir cette ligne telle quelle… à ceci près que le cron ne fonctionne pas quand l’ordinateur est en veille, et, bien sûr, encore moins quand il est éteint. L’horaire de 5h du matin est donc peu pratique pour une machine personnelle, et il faudra le changer. Voici comment se présente la syntaxe du crontab :

[minute] [heure] [jour] [mois] [jour semaine] [commande]

C’est un peu abstrait ? Mettons-la en pratique avec une ligne de crontab toute simple :

* * * * *  ping -D -c 1 www.numerama.com

Elle fait que chaque minute, chaque heure, chaque jour, chaque mois et quelque soit le jour de la semaine, l’ordinateur fera un coucou au site de Numerama pour voir s’il est toujours debout et combien de temps il met à répondre. Le -c 1 lui indique d’envoyer un seul ping ; sinon, il en enverrait un par seconde jusqu’à ce qu’on lui dise de s’arrêter. Le -D lui demande d’écrire le timestamp (le nombre de milisecondes écoulées depuis le début du temps Unix, le 1er janvier 1970) au début de chaque ligne.

On va compliquer un peu en envoyant le ping toutes les 2 minutes et en écrivant le résultat dans un fichier texte. Sinon, seule votre machine voit le résultat du ping et vous n’en serez jamais informé.

*/2 * * * * ping -D -c 1 www.numerama.com >> ~/ping_numerama.txt

Pendant que vous y êtes, vous pouvez écrire une deuxième ligne qui écrira au même moment la date et l’heure dans le même fichier ; ce sera plus lisible qu’un timestamp.

*/2 * * * * date >> ~/ping_numerama.txt

cron_5

Le précédent exemple permet une prise en main rapide du cron pour vous familiariser avec sa syntaxe, mais il n’a pas une grande utilité pratique. En soi, manier le crontab est simple ; les critères de temps que vous pouvez y rentrer ne sont limités que par votre imagination. Le plus compliqué est de connaître les commandes Unix à mettre dedans. On pourrait passer des heures à les énumérer, alors contentons-nous d’un exemple.

Le crontab est simple ; le plus compliqué est de connaître les commandes à mettre dedans

Mettons que vous voulez, vers la fin de chaque journée de travail, récupérer le poids des différents dossiers de votre ordinateur, avec pour chaque dossier la date de dernière modification ; puis mettre le tout dans un fichier texte incluant dans son nom la date du jour.

La commande qui récupère le poids des dossiers s’appelle du, pour disk usage. L’option -h, ou lisible par un humain, lui permet de s’exprimer en Mo et Go au lieu de purs octets. –time donne le temps de dernière modification des contenus du dossier. Sous Ubuntu, le dossier utilisateur est plein de contenu caché déposé par les divers logiciels (affichable avec Ctrl+H) ; ses noms commencent toujours par un point, et on peut l’exclure de la liste avec  –exclude=’./.*’. Si l’on souhaitait en plus écarter tout dossier commençant par « perso », par exemple, on pourrait écrire –exclude=’perso*’. Pour ne pas se retrouver avec l’arborescence complète du système, on peut préciser –max-depth=3, par exemple. La commande regardera alors tous les dossiers dans le dossier utilisateur, et les dossiers encore dedans, et ceux encore dedans, mais pas plus loin.

On a donc cette magnifique commande, que vous pouvez taper dans votre console pour tester : du -h –time –exclude=’./.*’ –max-depth=3

cron_3

Si on veut la lancer tous les jours du lundi au vendredi à 17h00, on doit ajouter avant, selon la syntaxe du cron, 0 17 * * 1-5. Ensuite, on veut ranger le résultat dans un dossier nommé poids_dossiers, dans un fichier de type dossiers_2016_12_08.txt. La commande date récupèrera la date actuelle ; si vous voulez la mettre en forme en style aaaa_mm_jj_hh:mm:ss, vous écrirez date +%Y_%m_%d_%H :%M :%S. Dans le nom du fichier, pour bien faire comprendre à l’ordinateur que c’est une commande, vous l’encadrerez par des ` (accents graves).

Voici donc le résultat à mettre dans le crontab :

0 17 * * 1-5 du -h –time –exclude=’./.*’ –max-depth=3 >>
~/poids_dossiers/dossiers_`date +%Y_%m_%d`.txt

cron_4

La partie technique est terminée et vous pouvez faire de cron à peu près tout ce que vous voulez en jouant correctement avec la syntaxe et les commandes ; passons maintenant aux farces, de bon ou mauvais goût, que le crontab permet de faire.

Les blagues drôles et moins drôles

sudo_rm_rf

Linux et macOS demandent de passer en sudo (superutilisateur) avant de laisser l’usager du terminal faire des choses importantes (installer un paquet sous Linux) ou vraiment catastrophiques (le fameux sudo rm -rf /, bien connu des mèmes un peu nerds, qui supprime l’intégralité des fichiers de la machine). Beaucoup de commandes exigent d’être précédées par un sudo, qui lui-même exigera le mot de passe de l’ordinateur.

Cela dit, pour ne pas avoir à retaper ce dernier trop de fois de suite, il est fréquent que l’ordinateur le garde en mémoire un court moment. Si un libriste étourdi laisse son PC à portée de tous moins d’une minute après avoir exécuté des commandes sudo, vous aurez carte blanche pour repeindre son Ubuntu dans un style un peu moins open. La victime de vos facéties tombera littéralement dans les pommes en retrouvant sa machine, mais exécuter une telle farce requiert un timing trop improbable.

Bonne nouvelle : pas besoin de mot de passe ou de privilèges particuliers pour modifier son crontab… ou celui de quelqu’un d’autre. Peut-être le film sur Snowden vous aura inspiré une blague : faire dire spontanément à l’ordinateur d’un ami une phrase comme « Big Brother is watching you ». C’est très simple : attendez qu’il ait le dos tourné, trouvez le terminal, ouvrez le crontab avec crontab -e et rajoutez à la fin :

*/30 * * * * espeak « Big Brother is watching you » (sous Linux)
*/30 * * * * say « Big Brother is watching you » (sous macOS)

Ainsi, toutes les 30 minutes jusqu’à la fin des temps (ou jusqu’à ce que votre cible purge l’emploi du temps avec un crontab -r), l’ordinateur visé dira cette phrase par synthèse vocale, rappelant un peu brutalement à son propriétaire à quel point il est important de garder un œil sur ses affaires. Car si vous étiez un affreux méchant, vous auriez pu causer un carnage à retardement avec la fameuse Bombe du terminal Unix :

 :(){ :| :& } ; :

Une fois tapée dans le terminal, cette fork bomb crée et appelle une fonction qui s’appelle elle-même deux fois, et ainsi de suite jusqu’à engloutir la RAM de la machine. L’effet est très variable selon l’ordinateur. Nos deux machines sous Ubuntu MATE à 8 et 16 Go de RAM flanchent à peine, se contentant d’hyperventiler voire revenant à la normale en moins d’une minute. Notre machine à 4 Go sous Ubuntu Unity se paralyse en quelques secondes ; notre vieux notebook à 750 Mo, lui, gèle instantanément. Dans ces cas-là, pas d’autre choix que de rebooter l’ordinateur, en perdant toute donnée non enregistrée. On vous encourage à tenter l’expérience, après avoir sauvegardé tout ce qui doit l’être.

Imaginez donc la cruauté d’un crontab contenant :

*/8 * * 4-11 * :(){ :| :& } ; :

qui lancera la bombe toutes les 8 minutes, mais uniquement à partir d’avril et jusqu’à fin novembre (laissons-nous le temps de disparaître de la liste des suspects) ! Aucun antivirus ne pourra arrêter le massacre. Mais en cas de doute, il suffit d’un crontab -l pour vérifier si la bombe est aux mains du cron, et d’un crontab -r pour tout effacer.

Numerama se désolidarise bien sûr de tout ce que votre imagination pourrait infliger aux Mac et aux PC Linux de vos amis, de vos collègues ou des salles informatiques de votre université.

Crédit photo de la une : Jeremy Keith

Partager sur les réseaux sociaux