7 votos

Cómo evitar la ejecución accidental de comandos potencialmente dañinos (por ejemplo, reiniciar)

Paso mucho tiempo en Terminal.app, y en iTerm2 - mayormente utilizando conexiones SSH a algunas cajas Linux. Estoy acostumbrado a emitir comandos reboot a estas cajas Linux, pero esta noche accidentalmente ingresé sudo reboot desde Terminal.app que se aplicó a mi Mac. Como resultado, he perdido parte de mi historial de Firefox - tal vez otras cosas que aún no he descubierto.

Sé cómo "arreglar esto" en una caja Linux, pero no puedo ni empezar en mi macOS Ventura. Intenté esto:

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!

Por lo tanto, supongo que esto significa que "/sbin/reboot" está en una de las particiones/volúmenes de solo lectura??

En cualquier caso - ¿Cómo puedo llegar a reboot para renombrarlo - o tal vez reemplazarlo con un simple script que tenga un echo "¿REALMENTE quieres hacer esto?"?

18voto

benwiggy Puntos 8

Solo crea un comando reboot en /usr/local/bin, que debería estar en primer lugar en tu $PATH.

10voto

David Anderson Puntos 2189

Tomando como punto de partida la respuesta de @Seamus:

Solo tienes que agregar la siguiente función a tu archivo ~/.zshrc.

sudo() {
    case "${1:-}" in
    reboot)
        echo "¿Estás REALMENTE seguro de que quieres hacer esto?"
        echo "Si es así, ingresa 'sudo r-reboot', y lo pasaré."
       ;;
    r-reboot)
        shift
        command sudo reboot "$@";;
    *)
        command sudo "$@"
    esac
}

Ten en cuenta lo siguiente.

  • El comando integrado command hace innecesario saber dónde se encuentra el comando sudo.
  • Las funciones tienen prioridad sobre los comandos, por lo que no tienes que preocuparte por lo que está en PATH.
  • No tienes que agregar nada a /opt/local/bin o /usr/local/bin.
  • La función sólo se aplica a tu cuenta. Otros usuarios no encontrarán cambios.

3voto

Joel Puntos 112

Tomando como punto de partida la respuesta de @benwiggy:

  1. Crea un pequeño script - reboot :

    #!/bin/bash
    echo "¿Estás REALMENTE seguro de que quieres hacer esto?"
    echo "Si es así, ingresa 'sudo r-reboot' y lo enviaré."
  2. Marca reboot como ejecutable:

    chmod 755 reboot
  3. Crea un enlace simbólico:

    ln -s /sbin/reboot r-reboot
  4. Verifica tu variable de entorno PATH, y NOTA dónde se encuentra /sbin:

    echo $PATH
    # en mi caso:
    ----------------------------------------------------------------------------------------------------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. "Descubre" un directorio que NO esté en el sistema de archivos de solo lectura de Apple. Por ejemplo, ahora sé (desde la respuesta aceptada) que usr/local/bin NO lo está, y sé que /opt/local/bin tampoco lo está. Con esa información, copia de la siguiente manera:

    sudo cp -a r-reboot reboot /opt/local/bin
    # y por si acaso:
    sudo cp -a r-reboot reboot /usr/local/bin
  6. Prueba

    % sudo reboot
    Are you REALLY sure you want to do this?
    If so, enter 'sudo r-reboot', and I'll pass it along.
    %

2voto

Mark Smith Puntos 491

Otra forma de aprender a no hacer esto se ejemplifica por el paquete sl en un montón de distribuciones de Linux. sl es a veces un error tipográfico por ls y en lugar de ser útil, te muestra una locomotora de vapor en modo texto que atraviesa tu terminal, y es ininterrumpible. Así que cada vez que te equivocas, debes pasar ~5 segundos viendo esto:

                          (  ) (@@) ( )  (@)  ()    @@    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_|
       \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

Esta breve molestia es suficiente para "reentrenar"te sin ser una red de seguridad completa.

alias reboot="echo Penalización de reinicio local...;nohup sleep 5 > /dev/null ; echo luego ejecutar /usr/sbin/reboot en su lugar"

Prueba esto ejecutando which reboot

user@host ~ % which reboot
reboot: aliased to echo Penalización de reinicio local...;nohup sleep 5;echo luego ejecutar /u\n......etc

El problema con esto es que solo tienes una red de seguridad en esta computadora, pero no en ninguna otra. Así que reentrenar tu cerebro para pensar con anticipación es una mejor solución a largo plazo.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X