Est-il possible d'inverser une commande dans le shell bash?

12

Je me demandais s'il y avait une (simple) possibilité de refaire / inverser une commande qui a été exécutée dans le shell bash? (pour le défaire)

Existe-t-il quelque chose de similaire à la combinaison ctrl+ zpour refaire une action (par exemple dans Word ou LibreOffice)?

Fraenzine
la source
8
la réponse courte est non. une commande peut être annulée, mais une annulation générique n'existe pas.
Archemar
3
comme d'autres l'ont dit, aucune undocommande, donc avoir une sauvegarde à jour de tout un système d'exploitation est vraiment utile. En cas de problème, vous restaurez simplement l'état précédent. Jetez un œil à rsnapshot par exemple
Arkadiusz Drabczyk
1
je voudrais trouver un moyen d'annuler la commande halt -p
Skaperen
3
@Joshua Publier un commentaire avec une commande qui peut détruire les données d'un utilisateur et aucune explication n'est un comportement acceptable. Ce n'est pas drôle, cela encombre le site et, surtout, c'est dangereux. Ne recommencez pas.
terdon
2
Je voudrais annuler la shutdowncommande lol .. je ne peux pas croire que de telles questions peuvent également obtenir 8 votes positifs en une journée !!
MagExt

Réponses:

33

Vous devez comprendre qu'il ne bashs'agit que d'un environnement d'exécution. Il exécute les commandes que vous appelez - ce n'est pas l'affaire du shell de savoir ce que fait la commande, vous pouvez appeler n'importe quel exécutable que vous voulez. Dans la plupart des cas, il n'est même pas clair ce que ferait une annulation - par exemple, pouvez-vous "défaire" un film? Pouvez-vous "supprimer" un e-mail? Que signifierait même "annuler l'exécution de Firefox", par exemple? Vous pouvez le fermer, mais les signets, les téléchargements et l'historique ne seront pas les mêmes.

Si vous exécutez une commande, elle est exécutée, quoi qu'elle fasse. A vous de savoir ce que vous faites. Notez que cela ne signifie pas que les commandes individuelles n'ont pas "d'annulation" ... elles le peuvent - vous pouvez même écrire une fonction wrapper qui fait quelque chose pour vous protéger contre les erreurs stupides.

Par exemple, mvest facilement réversible en déplaçant simplement le fichier d'où il vient, sauf si vous avez écrasé quelque chose. C'est pourquoi le -icommutateur existe, à vous demander avant d'écraser. Techniquement, l'inverse de cpest rm, sauf si quelque chose a été écrasé (encore une fois, -ivous demande à ce sujet). rmest plus permanent, pour essayer de récupérer les fichiers, vous devez en fait faire un piratage de niveau inférieur (il existe des outils pour cela). Si vous considérez le système de fichiers comme une boîte noire, cela ne serait techniquement pas possible du tout (seuls les détails de la disposition logique et physique des données vous permettent de contrôler les dommages). rmsignifie rm, si vous voulez une fonctionnalité "poubelle", c'est en fait justemvdans un répertoire pré-arrangé (et éventuellement un service planifié pour le maintenir ou le vider) - rien de spécial à ce sujet. Mais vous pouvez utiliser -ipour vous demander avant la suppression. Vous pouvez utiliser une fonction ou un alias à toujours inclure -idans ces commandes.

Notez que la plupart des applications vous protègent contre la perte de données de différentes manières. La plupart (~ tous) les éditeurs de texte créent des fichiers de sauvegarde ~à la fin au cas où vous souhaiteriez récupérer l'ancienne version. Sur certaines distributions, lsest alias par défaut pour qu'il les masque ( -B), mais elles sont là. Une grande protection est fournie par la gestion correcte des autorisations: ne soyez pas root à moins que vous ne deviez l'être, rendez les fichiers en lecture seule si vous ne voulez pas qu'ils changent. Parfois, il est utile d'avoir un environnement "bac à sable" - vous exécutez des choses sur une copie, voyez si tout va bien, puis fusionnez les modifications (ou abandonnez les modifications). chrootou lxcpeut empêcher vos scripts de s'échapper d'un répertoire et de causer des dommages.

Lorsque vous essayez d'exécuter des choses en bloc - par exemple, si vous avez une commande find complexe, une boucle while, un long pipeline ou quelque chose comme ça, c'est une bonne idée de commencer uniquement par echoles commandes qui seront exécutées. Ensuite, si les commandes semblent raisonnables, supprimez-les echoet exécutez-les pour de vrai. Et bien sûr, si vous n'êtes vraiment pas sûr de ce que vous faites, faites-en d'abord une copie. Je crée parfois simplement une archive tar du répertoire courant.

En parlant de tarballs - les tarbombes et les zipbombs sont malheureusement assez courants (lorsque les gens font une archive sans sous-répertoire approprié et que le déballage disperse les fichiers, ce qui crée un énorme gâchis). Je me suis habitué à créer moi-même un sous-répertoire avant de déballer (je pourrais lister le contenu, mais je suis paresseux). Je pense à créer un script qui créera un sous-répertoire uniquement si le contenu a été archivé sans sous-répertoire. Mais lorsque cela se produit, ls -lrtaide à trouver les fichiers les plus récents à mettre à leur place. Je viens de donner cela à titre d'exemple - un programme peut avoir de nombreux effets secondaires que le shell n'a aucun moyen de connaître (Comment pourrait-il? C'est un programme différent qui est appelé!) La seule façon sûre d'éviter les erreurs est d'être prudent (pensez deux fois, exécutez une fois).

Les commandes les plus dangereuses sont probablement celles qui concernent le système de fichiers: mkfs, fdisk / gdisk et ainsi de suite. Ils peuvent détruire complètement le système de fichiers (bien qu'avec un logiciel médico-légal approprié, une rétro-ingénierie au moins partielle soit possible). Vérifiez toujours le périphérique que vous formatez et le partitionnement est correct avant d'exécuter la commande.

orion
la source
14

Non, il n'y a pas de "défaire" dans Bash, désolé. C'est pourquoi vous devez revérifier vos commandes ou les tester d'abord sur des fichiers sans importance (si c'est possible). Et vérifiez si vous faites des choses en tant que root;)

Erathiel
la source
1
Ctr + / effectue une annulation pour certaines commandes de contrôle dans le terminal bash, mais toutes les commandes ne sont pas annulables.
Eric Leschinski
@EricLeschinski Pourriez-vous fournir une référence?
Erathiel
Il est enfoui dans les commentaires-réponses de cette page: skorks.com/2009/09/bash-shortcuts-for-maximum-productivity Pour le voir fonctionner, tapez quelques mots sur le terminal. Déplacez le curseur vers la gauche sur un caractère, appuyez sur Ctrl-d pour supprimer sous caractère, puis appuyez sur Ctrl + / qui annule la suppression.
Eric Leschinski
1
Oh, mais c'est quelque chose de fondamentalement différent de l'annulation d'une commande. Si vous supprimez un fichier avec rm, le fichier a disparu, il est décédé, il est décédé, ce n'est plus, c'est un ex-fichier (alerte Monty Python). Maintenant, ses proches pleurent de douleur et vous ne pouvez pas annuler votre acte. Ce dont vous parlez, c'est d'annuler la saisie ou la suppression de caractères et je soupçonne que c'est une fonctionnalité de votre émulateur de terminal. Je viens de l'essayer dans Terminator et cela fonctionne. Passer à une autre console (Ctrl + Alt + F1 dans mon cas) ne lui permet pas de fonctionner.
Erathiel
Il y a une entrée de commande de terminal annulée et une commande de terminal après l'annulation de l'exécution. Je suis venu ici à la recherche du premier.
Eric Leschinski
11

Non, il n'y a pas d'annulation générique, mais certaines conséquences sont plus réversibles que d'autres. Prenons par exemple rm: il est essentiellement utilisé à deux fins: éviter l'encombrement et libérer de l'espace pour de nouveaux fichiers. Avec un peu de chance, vous pouvez récupérer le contenu du fichier en utilisant des outils comme extundelete, car seul le pointeur vers le début du fichier est écrasé lorsque vous exécutez rm; le contenu est écrasé lorsque le système d'exploitation réutilise cet espace (ce qui peut se produire des millisecondes ou des années plus tard). Du fait de cette fonctionnalité, rmtombe au milieu d'une échelle de systèmes plus ou moins destructrice. D'une part, il y a des orduressystèmes, qui offrent un moyen d'éviter l'encombrement sans risque de perdre les données immédiatement (car l'annulation est triviale). Encore plus conservateurs sont les systèmes d' écriture unique et de lecture ("WORM"), où les données ne peuvent pas être supprimées ou écrasées à volonté par le système qui y écrit. À l'autre extrémité de l'échelle se trouvent les systèmes de destruction , qui écrasent le contenu du fichier (généralement plusieurs fois) en plus du pointeur. À ce stade, la technologie pour récupérer vos données n'existe probablement pas encore (et peut-être n'existera peut-être jamais).

Vous pouvez donc voir comment l'outil spécifique le plus utilisé ( rm) n'est pas la seule alternative, mais il offre un compromis que la plupart des gens semblent à l'aise avec:

  • La suppression d'un pointeur de fichier est très rapide et contribue très peu à la détérioration du disque
  • Vous êtes moins susceptible de manquer d'espace sur des systèmes hautement automatisés
  • Fournit une protection de la vie privée très modeste, mais non nulle, et inversement, des garanties de récupération
  • Faible complexité et donc faible risque de bugs ou de comportement inattendu

Si les compromis que font vos outils sont inacceptables pour vous, jetez un œil. Il y a des chances il existe des outils là - bas qui prennent les décisions qui conviennent pour vous .

l0b0
la source
3
La seule partie de cette réponse qui répond à la question est la première ligne
Alvaro
J'essaie juste d'expliquer pourquoi les choses sont ainsi, du point de vue d'un administrateur système.
l0b0
9

Les applications qui offrent une fonction «annuler» le font en conservant un historique des actions entreprises et soit une méthode pour inverser l'action, soit un instantané de l'état d'un objet pour restaurer un état précédent. Les commandes exécutées dans un shell effectuent des actions directes ou exécutent des commandes pour effectuer des actions.

Le shell lui-même n'aurait pas la possibilité d'annuler les actions résultant d'une commande ou d'un programme exécuté. Si la commande ou le programme conservait un historique et avait une fonction d'annulation, alors peut-être que cela pourrait être utilisé, mais le shell lui-même ne peut pas.

Par exemple, si vous exécutez rm important_file.txt, cela indiquera alors au pilote du système de fichiers de "dissocier" le fichier sur le système de fichiers. Le shell n'exécute pas l'action, il appelle uniquement rmqui le fait.

Dans le cas où vous souhaitez annuler la suppression d'un fichier perdu, il peut être possible de le faire, car généralement la suppression du fichier ne le supprime pas réellement, mais supprime uniquement la référence à celui-ci. Après un certain temps, le contenu du fichier sera écrasé lorsque d'autres données sont enregistrées sur le disque, mais pendant un certain temps, le fichier d'origine peut être restauré à l'aide d'utilitaires qui peuvent le trouver et le "relier".

enveloppe
la source
1

Non, il n'y en a pas, mais si, disons, que vous avez joué avec un répertoire privilégié root et que vous avez foiré quelque chose, votre meilleur pari est de sauvegarder tous les fichiers que vous pouvez sur une clé USB ou une carte SD et de réinitialiser votre système d'exploitation à partir de le fichier ISO (si vous l'avez toujours, sinon vous pouvez en obtenir un autre hors ligne ...). Si vous avez supprimé quelque chose, vous pouvez, comme l' a dit wraeth , télécharger une application pour relier les données du fichier au nom de fichier et enregistrer le contenu des fichiers (voir cette question ici ). Pour une réponse plus approfondie, pouvez-vous nous dire ce que vous avez fait de mal?

Intéressant...
la source
1

Je ne répéterai pas ce que les autres ont dit, mais je peux voir d'où vous venez. Mon approche standard pour exécuter des commandes "dangereuses" a toujours été de leur faire écho pour voir si toutes les variables sont correctement développées ou non. Si vous pouvez citer des exemples spécifiques, nous pourrons peut-être vous aider davantage.

Par exemple, dans une situation comme:

for i in $(cat /my/file); 
do 
   echo "Now removing file $i using rm -f $i"
done
Hopping Bunny
la source
1

Comme d'autres bonnes réponses l'ont dit: il n'y a pas de "défaire" dans le shell. Mais dans votre cas d'utilisation spécifique, pour annuler un shutdown, vous pouvez tuer le processus d'arrêt: voir /programming//a/526330

Olivier Dulac
la source