7 votes

Comment éviter l'exécution accidentelle de commandes potentiellement nocives (par exemple, redémarrage)

Je passe beaucoup de temps dans Terminal.app et iTerm2 - surtout en utilisant des connexions SSH vers quelques boîtes Linux. J'ai l'habitude de donner des commandes reboot à ces boîtes Linux, mais plus tôt ce soir, j'ai accidentellement entré sudo reboot depuis Terminal.app ce qui s'appliquait à mon Mac. En conséquence, j'ai perdu une partie de mon historique Firefox - peut-être d'autres choses que je n'ai pas encore découvertes.

Je sais comment "réparer cela" sur une boîte Linux, mais je ne peux pas arriver à la première base sur mon macOS Ventura. J'ai essayé ceci :

seamus@Fumier-Pro ~ % whereis reboot
reboot: /sbin/reboot /usr/share/man/man8/reboot.8
seamus@Fumier-Pro ~ % cd /sbin
seamus@Fumier-Pro /sbin ~ % sudo mv reboot r-reboot
mv: rename reboot to r-reboot: Operation not permitted
seamus@Fumier-Pro /sbin ~ % GRRRRRRRR!

Et donc je suppose que cela signifie que "/sbin/reboot" est dans l'une des partitions/volumes en lecture seule ??

Quoi qu'il en soit - Comment puis-je accéder à reboot pour le renommer - ou peut-être le remplacer par un simple script qui a un echo "Voulez-vous VRAIMENT faire cela?"?

18voto

benwiggy Points 21125

Il suffit de créer une commande reboot dans /usr/local/bin, qui doit être placée en premier dans votre $PATH.

10voto

David Anderson Points 30783

En rebondissant sur la réponse de @Seamus:

Vous pourriez simplement ajouter la fonction suivante à votre fichier ~/.zshrc.

sudo() {
    case "${1:-}" in
    reboot)
        echo "Êtes-vous VRAIMENT sûr de vouloir faire cela?"
        echo "Si c'est le cas, saisissez 'sudo r-reboot', et je le transmettrai.";;
    r-reboot)
        shift
        command sudo reboot "$@";;
    *)
        command sudo "$@"
    esac
}

Notez ce qui suit.

  • La commande intégrée command rend inutile de savoir où se trouve la commande sudo.
  • Les fonctions prennent le dessus sur les commandes, donc vous n'avez pas à vous soucier de ce qui est dans PATH.
  • Vous n'avez pas à ajouter quoi que ce soit à /opt/local/bin ou /usr/local/bin.
  • La fonction s'applique uniquement à votre compte. Les autres utilisateurs ne rencontreront aucun changement.

3voto

Seamus Points 3171

En rebondissant sur la réponse de @benwiggy:

  1. Créez un petit script - reboot :

    #!/bin/bash
    echo "Êtes-vous VRAIMENT sûr de vouloir faire cela?"
    echo "Si c'est le cas, saisissez 'sudo r-reboot', et je le transmettrai."
  2. Marquez reboot comme exécutable:

    chmod 755 reboot
  3. Créez un lien symbolique:

    ln -s /sbin/reboot r-reboot
  4. Vérifiez votre variable d'environnement PATH, et NOTEZ où se trouve /sbin:

    echo $PATH
    # dans mon cas:
    ----------------------------------------------------------------------------------------------------YYYYYY--------------
    /opt/local/bin:/opt/local/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin
  5. "Trouvez" un répertoire qui n'est PAS dans le système de fichiers en lecture seule d'Apple. Par exemple, je sais maintenant (de la réponse acceptée) que usr/local/bin n'est PAS, et je sais que /opt/local/bin n'est PAS. Avec ces informations, copiez comme suit:

    sudo cp -a r-reboot reboot /opt/local/bin
    # et pour plus de sûreté:
    sudo cp -a r-reboot reboot /usr/local/bin
  6. Testez

    % sudo reboot
    Êtes-vous VRAIMENT sûr de vouloir faire cela?
    Si c'est le cas, saisissez 'sudo r-reboot', et je le transmettrai.
    %

2voto

Mark Smith Points 491

Une autre façon d'apprendre à ne pas faire cela est exemplifiée par le package sl sur un tas de distros linux. sl est parfois une faute de frappe pour ls et au lieu d'être utile, il affiche une locomotive à vapeur en mode texte qui roule à travers votre terminal, et est interrupible. Ainsi, à chaque fois que vous faites une faute de frappe, vous devez passer ~5 secondes à regarder ceci :

                          (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O
                     (@@@)
                 (    )
              (@@@@)

            (   )
           ====        ________                ___________
       _D _|  |_______/        \__I_I_____===__|_________|
        |(_)---  |   H\________/ |   |        =|___ ___|      _________________
        /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
       |      |  |   H  |__--------------------| [___] |   =|                        |
       | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
       |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
     __/ =| o |=-O=====O=====O=====O \ ____Y___________|__|__________________________|_
      |/-=|___|=    ||    ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_|
       \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

Ce bref ennui est suffisant pour vous aider à "réapprendre" sans être un filet de sécurité complet.

alias reboot="echo Pénalité de redémarrage local...;nohup sleep 5 > /dev/null ; echo puis exécutez /usr/sbin/reboot à la place"

Testez ceci en exécutant which reboot

user@host ~ % which reboot
reboot: aliased to echo Pénalité de redémarrage local...;nohup sleep 5;echo puis exécuter /u\n......etc

Le problème avec cela est que vous avez seulement un filet de sécurité sur cet ordinateur, mais pas sur les autres. Donc réapprendre à votre cerveau à anticiper est une meilleure solution à long terme.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X