¿Es posible revertir un comando en el shell bash?

12

Me preguntaba si hay una posibilidad (simple) de rehacer / revertir un comando que se ejecutó en el shell bash? (para deshacerlo)

¿Hay algo similar a la combinación ctrl+ zpara rehacer cualquier acción (por ejemplo, en word o LibreOffice)?

Fraenzina
fuente
8
La respuesta corta es no. algún comando puede revertirse, pero no existe tal cosa como un deshacer genérico.
Archemar
3
como dijeron otros, no hay undocomandos, por lo que es realmente útil tener una copia de seguridad actualizada de un sistema operativo completo. Cuando algo sale mal, simplemente restaura el estado anterior. Eche un vistazo a rsnapshot, por ejemplo
Arkadiusz Drabczyk el
1
Me gustaría encontrar una manera de deshacer el comando de detener -p
Skaperen
3
@Joshua Publicar un comentario con un comando que puede destruir los datos de un usuario y no hay explicación no es un comportamiento aceptable. No es divertido, llena el sitio y, lo más importante, es peligroso. No vuelvas a hacer eso.
terdon
2
Me gustaría deshacer el shutdowncomando jajaja ... ¡no puedo creer que tales preguntas también puedan obtener 8 votos en un día!
MagExt

Respuestas:

33

Debe comprender que bashes solo un entorno de ejecución. Ejecuta comandos que usted llama: no es asunto del shell saber siquiera lo que hace el comando, puede llamar a cualquier ejecutable que desee. En la mayoría de los casos, ni siquiera está claro qué haría un deshacer, por ejemplo, ¿puedes "deshacer" una película? ¿Se puede "enviar" un correo electrónico? ¿Qué significaría "deshacer la ejecución de Firefox", por ejemplo? Puede cerrarlo, pero los marcadores, descargas e historial no serán lo mismo.

Si ejecuta un comando, se ejecuta, haga lo que haga. Depende de usted saber lo que está haciendo. Tenga en cuenta que esto no significa que los comandos individuales no tengan "deshacer" ... sí pueden, incluso puede escribir una función de contenedor que haga algo para protegerlo de errores tontos.

Por ejemplo, mves fácilmente reversible simplemente moviendo el archivo de donde vino, a menos que haya sobrescrito algo. Es por eso que -iexiste el interruptor, para preguntarle antes de sobrescribir. Técnicamente, inverso de cpes rm, a menos que se haya sobrescrito algo (de nuevo, -ile pregunta al respecto). rmes más permanente, para intentar recuperar los archivos, tienes que hacer algo de pirateo de nivel inferior (hay herramientas para eso). Si consideraras el sistema de archivos como un recuadro negro, técnicamente no sería posible en absoluto (solo los detalles del diseño lógico y físico de los datos te permiten controlar el daño). rmsignifica rm, si quieres la funcionalidad "basura", en realidad eso es solomven algún directorio preestablecido (y posiblemente un servicio programado para mantenerlo o vaciarlo), no tiene nada de especial. Pero puede usarlo -ipara solicitarle antes de eliminarlo. Puede usar una función o un alias para incluir siempre -ien estos comandos.

Tenga en cuenta que la mayoría de las aplicaciones lo protegen de la pérdida de datos de diferentes maneras. La mayoría de los editores de texto (~ todos) crean archivos de respaldo ~al final en caso de que desee recuperar la versión anterior. En algunas distribuciones, lstiene un alias por defecto para que los oculte ( -B), pero están ahí. Administrar los permisos de manera adecuada brinda mucha protección: no seas root a menos que sea necesario, crea archivos de solo lectura si no quieres que cambien. A veces es útil tener un entorno de "caja de arena": ejecuta cosas en una copia, ve si está bien y luego combina los cambios (o abandona los cambios). chrooto lxcpuede evitar que sus scripts escapen de un directorio y causen daños.

Cuando intenta ejecutar cosas en bloque, por ejemplo, si tiene un comando de búsqueda complejo, un bucle, una tubería larga o algo así, es una buena idea primero solo echolos comandos que se ejecutarán. Luego, si los comandos parecen razonables, elimínelos echoy ejecútelos de verdad. Y, por supuesto, si realmente no está seguro de lo que está haciendo, primero haga una copia. A veces solo creo un tarball del directorio actual.

Hablando de tarballs: desafortunadamente, los tarbombs y zipbombs son bastante comunes (cuando las personas crean un archivo sin un subdirectorio adecuado y el desempaquetado dispersa los archivos, creando un gran desastre). Me acostumbré a hacer un subdirectorio antes de desempacar ( podría enumerar los contenidos, pero soy vago). Estoy pensando en crear un script que cree un subdirectorio solo si el contenido se archivó sin un subdirectorio. Pero cuando sucede, ls -lrtayuda a encontrar los archivos más recientes para colocarlos donde pertenecen. Acabo de dar esto como ejemplo: un programa puede tener muchos efectos secundarios que el shell no tiene forma de conocer (¿cómo podría? ¡Se llama un programa diferente!) La única forma segura de evitar errores es tener cuidado (piense dos veces, corre una vez).

Posiblemente los comandos más peligrosos son los que se ocupan del sistema de archivos: mkfs, fdisk / gdisk, etc. Pueden destruir completamente el sistema de archivos (aunque con el software forense adecuado, es posible al menos una ingeniería inversa parcial). Siempre verifique dos veces el dispositivo que está formateando y la partición es correcta, antes de ejecutar el comando.

Orión
fuente
14

No, no hay tal cosa como "deshacer" en Bash, lo siento. Esta es la razón por la que debe verificar sus comandos o probarlos primero en archivos sin importancia (si eso es posible). Y verifique tres veces si está haciendo cosas como root;)

Erathiel
fuente
1
Ctr + / realiza una acción de deshacer para ciertos comandos de Control en el terminal bash, pero no todos los comandos son imposibles de deshacer.
Eric Leschinski
@EricLeschinski ¿Podría proporcionar alguna referencia?
Erathiel
Está oculto en los comentarios de respuesta de esta página: skorks.com/2009/09/bash-shortcuts-for-maximum-productivity Para que funcione, escriba algunas palabras en el terminal. Mueva el cursor hacia la izquierda sobre un carácter, presione Ctrl-d para eliminar debajo del carácter, luego presione Ctrl + / que deshace la eliminación.
Eric Leschinski
1
Ah, pero eso es algo fundamentalmente diferente de deshacer un comando. Si elimina un archivo con rm, el archivo se ha ido, ha fallecido, ha fallecido, ya no existe, es un archivo ex (alerta de Monty Python). Ahora sus parientes lloran de pena y no puedes deshacer tu acción. De lo que estás hablando es de deshacer la escritura o eliminación de caracteres y sospecho que es una característica de tu emulador de terminal. Lo acabo de probar en Terminator y funciona. Cambiar a una consola diferente (Ctrl + Alt + F1 en mi caso) no permite que funcione.
Erathiel
Hay una entrada de comando de terminal deshacer y un comando de terminal después de la ejecución deshacer. Vine aquí buscando lo primero.
Eric Leschinski
11

No, no hay un deshacer genérico, pero algunas consecuencias son más reversibles que otras. Tomemos por ejemplo rm: se usa esencialmente para dos propósitos: evitar el desorden y liberar espacio para nuevos archivos. Con un poco de suerte, puede recuperar el contenido del archivo utilizando herramientas como extundelete, porque solo el puntero al inicio del archivo se sobrescribe cuando ejecuta rm; el contenido se sobrescribe cuando el sistema operativo reutiliza ese espacio (lo que podría suceder milisegundos o años después). Debido a esta funcionalidad, rmcae en el medio de una escala de sistemas que son más o menos destructivos. Por un lado hay basurasistemas, que proporcionan una manera de evitar el desorden sin riesgo de perder los datos de inmediato (porque deshacer es trivial). Aún más conservadores son los sistemas de escribir una vez, leer muchos ("WORM"), donde los datos no pueden ser borrados o sobrescritos a voluntad por el sistema que los escribe. En el otro extremo de la escala están los sistemas de trituración , que sobrescriben el contenido del archivo (generalmente varias veces) además del puntero. En ese punto, la tecnología para recuperar sus datos probablemente aún no exista (y posiblemente nunca exista).

Por lo tanto, puede ver cómo la herramienta específica más utilizada ( rm) no es la única alternativa, pero proporciona una compensación con la que la mayoría de las personas se sienten cómodas:

  • Eliminar un puntero de archivo es muy rápido y contribuye muy poco al deterioro del disco.
  • Es menos probable que se quede sin espacio en sistemas altamente automatizados
  • Proporciona protección de privacidad muy modesta, pero no nula y, por el contrario, garantías de recuperación
  • Baja complejidad y, por lo tanto, baja probabilidad de errores o comportamiento inesperado

Si las compensaciones que hacen sus herramientas son inaceptables para usted, eche un vistazo. Lo más probable es que existan herramientas que toman las decisiones adecuadas para usted .

l0b0
fuente
3
La única parte de esta respuesta que aborda la pregunta es la primera línea
Alvaro
Solo trato de explicar por qué las cosas son así, desde la perspectiva de un administrador de sistemas.
l0b0
9

Las aplicaciones que proporcionan una función de 'deshacer' lo hacen manteniendo un historial de acciones tomadas y un método para revertir la acción o una instantánea del estado de un objeto para restaurar un estado anterior. Los comandos ejecutados en un shell realizan acciones directas o ejecutan comandos para realizar acciones.

El shell en sí no tendría la capacidad de deshacer las acciones resultantes de cualquier comando o programa ejecutado. Si el comando o programa mantenía un historial y tenía una función de deshacer, entonces tal vez eso podría usarse, pero el shell en sí no.

Por ejemplo, si ejecuta rm important_file.txt, eso le indicará al controlador del sistema de archivos que "desvincula" el archivo en el sistema de archivos. El shell no realiza la acción, solo llama a lo rmque hace.

En el caso de querer recuperar un archivo perdido, puede ser posible hacerlo, ya que generalmente eliminar el archivo en realidad no lo elimina, sino que solo elimina la referencia a él. Después de un tiempo, el contenido del archivo se sobrescribirá a medida que se guarden otros datos en el disco, pero durante un tiempo el archivo original puede restaurarse utilizando utilidades que pueden encontrarlo y "volver a vincularlo".

ira
fuente
1

No, no lo hay, pero si, digamos que se equivocó con un directorio privilegiado de root y de alguna manera arruinó algo, su mejor opción es guardar todos los archivos que pueda en una Unidad USB o una Tarjeta SD y restablecer su sistema operativo desde el archivo ISO (si todavía lo tiene, si no puede obtener otro fuera de línea ...). Si eliminó algo que puede, como dijo wraeth , descargue una aplicación para volver a vincular los datos del archivo con el nombre del archivo y guardar el contenido del archivo (consulte esta pregunta aquí ). Para una respuesta más profunda, ¿puede decirnos qué hizo mal?

Interesante...
fuente
1

No repetiré lo que otros han dicho, pero puedo ver de dónde vienes. Mi enfoque estándar para ejecutar comandos "peligrosos" siempre ha sido repetirlos para ver si todas las variables se expanden correctamente o no. Si puede citar algunas instancias específicas, podríamos ayudarlo más.

Por ejemplo, en una situación como:

for i in $(cat /my/file); 
do 
   echo "Now removing file $i using rm -f $i"
done
Saltando conejito
fuente
1

Como otras buenas respuestas dijeron: no hay "deshacer" en el shell. Pero en su caso de uso específico, para deshacer un shutdown, puede matar el proceso de apagado: consulte /programming//a/526330

Olivier Dulac
fuente