J'essaie de modifier la commande de redémarrage pour faire écho à un message envoyé à l'utilisateur, mais la commande elle-même située dans /sbin
est compilée. Est-il possible d'éditer la commande et de la faire imprimer quelque chose lorsque l'utilisateur tape reboot?
Oui, mais vous devez éditer son code source, ajouter votre avertissement, recompiler et remplacer l’exécutable par celui qui a été modifié.
Une approche beaucoup plus simple consisterait à créer un script qui imprime votre avertissement, puis appelle reboot
et enregistre ce script sous le nom reboot
:
Créez un fichier avec ce contenu et enregistrez-le sous le nom /usr/bin/reboot
:
#!/bin/sh
echo "Eeeek! You are rebooting!"
/sbin/reboot
Rendez-le exécutable:
Sudo chmod a+x /usr/bin/reboot
Maintenant, lorsque vous exécutez reboot
, parce que /usr/bin
est avant /sbin
dans votre $PATH
, vous exécuterez le script qui imprimera l'avertissement, puis exécutera reboot
.
Une façon de le faire comme le montre terdon - avec un script wrapper.
L'autre approche est via function
. Les noms de fonction sont prioritaires sur les commandes système et les alias, ce qui signifie que si nous créons une fonction de redémarrage, celle-ci sera exécutée. Ce qui est pratique, c'est que vous n'avez pas besoin de créer un fichier séparé, vous pouvez le placer dans /etc/bash.bashrc
pour tous les utilisateurs ou ~/.bashrc
uniquement pour vous-même.
En ce qui concerne la fonction elle-même, nous pourrions faire quelque chose comme ceci
reboot()
{
printf "Reboot is about to happen , press enter "
read
/sbin/reboot
# or for those who like to use systemd way, you can do systemctl reboot
}
Ce qui est également cool est que vous pouvez appuyer sur Ctrl+C pour annuler cette fonction
Le moyen le plus simple de modifier une commande consiste à créer un alias qui l’ombre et l’appelle avec des arguments différents ou avant/après une opération différente.
Vous créez un alias comme ceci:
alias ALIASNAME='COMMAND'
Ne vous inquiétez pas de donner à l’alias le même nom que la commande qui le compose, vous ne pouvez pas générer de récursion ici.
Donc, pour imprimer d’abord un message, attendez quelques secondes et redémarrez, cette commande convient:
echo "Rebooting in 10 seconds - abort with CTRL+C" && sleep 10 && reboot
Nous devons maintenant aliaser cette longue commande avec reboot
pour qu'elle soit exécutée à la place de la _ /sbin/reboot
originale:
alias reboot='echo "Rebooting in 10 seconds - abort with CTRL+C" && sleep 10 && reboot'
Cet alias est désormais valide uniquement pour votre utilisateur actuel et uniquement pour cette session Bash. Fermer la fenêtre du terminal le fera disparaître à nouveau.
Pour le rendre persistant pour votre compte d'utilisateur, nous devons nous assurer que Bash l'exécute chaque fois qu'il démarre une nouvelle session. Cela s’effectue très facilement en l’ajoutant à votre fichier ~/.bash_aliases
. Ouvrez-le avec votre éditeur de texte préféré. S'il n'existe pas encore, créez-le simplement.
Ajoutez la commande alias reboot='...'
d'en haut à la fin du fichier. Si vous le souhaitez, vous pouvez également ajouter un commentaire décrivant le sujet. Les lignes de commentaire doivent commencer par un caractère #
. Enregistrez le fichier une fois la modification terminée.
Lorsque vous ouvrez maintenant une nouvelle fenêtre de terminal, l'alias fonctionnera.
Veuillez noter que cette approche est pour 16.04, où (pour quelque raison que ce soit) /sbin/reboot
ne doit plus être exécuté en tant que root, mais est également satisfait des privilèges de l'utilisateur. Si vous utilisez une version plus ancienne où /sbin/reboot
doit encore être exécuté en tant que root ou avec Sudo
, vous devez ajouter le Sudo
à l'intérieur de la commande d'alias:
alias reboot='echo "Rebooting in 10 seconds" && sleep 10 && Sudo reboot'
L'exécution de l'alias lui-même avec Sudo
(c'est-à-dire Sudo ALIASNAME
) ne fonctionnera pas, car les alias sont spécifiques à la session Bash de votre utilisateur.