web-dev-qa-db-fra.com

Comment modifier la commande de redémarrage?

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?

4
EndenDragon

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:

  1. 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
    
  2. 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 .

12
terdon

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

5

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.

1
Byte Commander