È possibile invertire un comando nella shell bash?


12

Mi chiedevo se esiste una (semplice) possibilità di ripetere / invertire un comando eseguito nella shell bash? (per annullarlo)

Esiste qualcosa di simile alla combinazione ctrl+ zper ripetere un'azione (ad esempio in Word o LibreOffice)?


8
la risposta breve è no. alcuni comandi potrebbero essere ripristinati, ma non esiste un annullamento generico.
Archemar,

3
come altri hanno detto, nessun undocomando così avere un backup aggiornato di un intero sistema operativo è davvero utile. Quando qualcosa va storto ripristini semplicemente lo stato precedente. Dai un'occhiata a rsnapshot per esempio
Arkadiusz Drabczyk

1
vorrei trovare un modo per annullare il comando halt -p
Skaperen

3
@Joshua Pubblicare un commento con un comando che può distruggere i dati di un utente e nessuna spiegazione non è un comportamento accettabile. Non è divertente, ingombra il sito e, soprattutto, è pericoloso. Non farlo di nuovo.
terdon

2
Vorrei annullare il shutdowncomando lol .. non posso credere che tali domande possano anche ottenere 8 voti al giorno !!
MagExt

Risposte:


33

Dovresti capire che bashè solo un ambiente di esecuzione. Esegue i comandi che chiami: non è compito della shell nemmeno sapere cosa fa il comando, puoi chiamare qualsiasi eseguibile che desideri. Nella maggior parte dei casi, non è nemmeno chiaro cosa farebbe un annullamento, ad esempio puoi "annullare la riproduzione" di un film? Puoi "inviare" un'e-mail? Cosa significherebbe "annullare l'esecuzione di Firefox", ad esempio? Puoi chiuderlo, ma i segnalibri, i download e la cronologia non saranno gli stessi.

Se si esegue un comando, viene eseguito, qualunque cosa faccia. Sta a te sapere cosa stai facendo. Nota che questo non significa che i singoli comandi non abbiano "annulla" ... possono - puoi persino scrivere una funzione wrapper che fa qualcosa per proteggerti da errori insensati.

Ad esempio, mvè facilmente reversibile semplicemente spostando il file indietro da dove proviene, a meno che tu non abbia sovrascritto qualcosa. Ecco perché -iesiste switch, da chiederti prima di sovrascrivere. Tecnicamente, il contrario di cpè rm, a meno che qualcosa non sia stato sovrascritto (di nuovo, -ite lo chiede). rmè più permanente, per provare a recuperare i file, devi effettivamente fare un po 'di hacking di livello inferiore (ci sono strumenti per quello). Se consideri il filesystem come una scatola nera, tecnicamente non sarebbe affatto possibile (solo i dettagli del layout logico e fisico dei dati ti permettono di fare un controllo dei danni). rmsignifica rm, se si desidera la funzionalità "cestino", in realtà è solomvin una directory predisposta (e possibilmente un servizio programmato per mantenerlo o svuotarlo) - niente di speciale al riguardo. Ma è possibile utilizzare -iper richiedere prima dell'eliminazione. È possibile utilizzare una funzione o un alias da includere sempre -iin questi comandi.

Nota che la maggior parte delle applicazioni ti protegge dalla perdita di dati in diversi modi. La maggior parte (~ tutto) degli editor di testo crea file di backup ~alla fine nel caso in cui si desideri ripristinare la versione precedente. In alcune distro, lsviene impostato come predefinito per nasconderlo ( -B), ma sono presenti. Molta protezione viene data gestendo correttamente le autorizzazioni: non essere root a meno che non sia necessario, creare file di sola lettura se non si desidera che cambino. A volte è utile avere un ambiente "sandbox": esegui le cose su una copia, vedi se va bene e poi unisci le modifiche (o abbandona le modifiche). chrooto lxcpuò impedire agli script di uscire da una directory e causare danni.

Quando si tenta di eseguire operazioni collettive, ad esempio se si dispone di un comando find complesso, mentre loop, una lunga pipeline o qualcosa del genere, è una buona idea innanzi tutto solo echoi comandi che verranno eseguiti. Quindi, se i comandi sembrano ragionevoli, rimuoverlo echoed eseguirlo per davvero. E, naturalmente, se non sei davvero sicuro di ciò che stai facendo, crea prima una copia. A volte creo solo un tarball della directory corrente.

Parlando di tarball: tarbombe e zipbomb sono sfortunatamente abbastanza comuni (quando le persone fanno un archivio senza una corretta sottodirectory, e spacchettare i file sparsi, facendo un casino enorme). Mi sono abituato a creare una sottodirectory da solo prima di decomprimere ( potrei elencare il contenuto, ma sono pigro). Sto pensando di creare uno script che creerà una sottodirectory solo se i contenuti sono stati archiviati senza una sottodirectory. Ma quando succede, ls -lrtaiuta a trovare i file più recenti da mettere al loro posto. Ho appena dato questo come esempio: un programma può avere molti effetti collaterali che la shell non ha modo di conoscere (come potrebbe essere chiamato un programma diverso!) L'unico modo sicuro per evitare errori è stare attenti (pensa due volte, corri una volta).

Forse i comandi più pericolosi sono quelli che riguardano il filesystem: mkfs, fdisk / gdisk e così via. Possono distruggere completamente il filesystem (anche se con un software forense adeguato, è possibile almeno un reverse engineering parziale). Controlla sempre il dispositivo che stai formattando e il partizionamento è corretto, prima di eseguire il comando.


14

No, non esiste un "annullamento" in Bash, mi dispiace. Questo è il motivo per cui dovresti ricontrollare i tuoi comandi o testarli prima su file non importanti (se possibile). E controlla tre volte se stai facendo le cose come root;)


1
Ctr + / esegue un annullamento per alcuni comandi di controllo nel terminale bash, ma non tutti i comandi sono annullabili.
Eric Leschinski,

@EricLeschinski Potresti fornire qualche riferimento?
Erathiel,

È nascosto nei commenti di risposta di questa pagina: skorks.com/2009/09/bash-shortcuts-for-ma maximum - productivity Per vederlo funzionare, digitare alcune parole sul terminale. Spostare il cursore a sinistra su un carattere, premere Ctrl-d per eliminare sotto il carattere, quindi premere Ctrl + / che annulla l'eliminazione.
Eric Leschinski,

1
Oh, ma è qualcosa di fondamentalmente diverso dall'annullare un comando. Se rimuovi un file con rm, il file è sparito, è scomparso, è deceduto, non esiste più, è un ex-file (avviso Monty Python). Ora i suoi parenti piangono nel dolore e non puoi annullare la tua azione. Quello di cui stai parlando è annullare la digitazione o l'eliminazione di caratteri e sospetto che sia una caratteristica del tuo emulatore di terminale. L'ho appena provato in Terminator e funziona. Passare a una console diversa (Ctrl + Alt + F1 nel mio caso) non gli consente di funzionare.
Erathiel,

Esiste la voce comando terminale annulla e il comando terminale dopo l'esecuzione annulla. Sono venuto qui in cerca del primo.
Eric Leschinski,

11

No, non esiste un annullamento generico, ma alcune conseguenze sono più reversibili di altre. Prendiamo ad esempio rm: viene essenzialmente utilizzato per due scopi: evitare disordine e liberare spazio per i nuovi file. Con un po 'di fortuna puoi recuperare il contenuto del file usando strumenti come extundelete, perché solo il puntatore all'inizio del file viene sovrascritto quando esegui rm; il contenuto viene sovrascritto quando il sistema operativo riutilizza quello spazio (che potrebbe accadere millisecondi o anni dopo). A causa di questa funzionalità, rmrientra nel mezzo di una scala di sistemi più o meno distruttivi. Da un lato c'è spazzaturasistemi, che forniscono un modo per evitare il disordine senza il rischio di perdere immediatamente i dati (perché annullare è banale). Ancora più conservativi vengono scritti una volta, letti molti sistemi ("WORM"), in cui i dati non possono essere cancellati o sovrascritti a piacimento dal sistema che vi scrive. All'altra estremità della scala ci sono i sistemi di distruzione , che sovrascrivono il contenuto del file (di solito più volte) oltre al puntatore. A quel punto la tecnologia per recuperare i tuoi dati probabilmente non esiste ancora (e forse potrebbe non esistere mai).

Quindi puoi vedere come lo strumento specifico più in uso ( rm) non sia l'unica alternativa, ma fornisce un compromesso a cui molte persone sembrano essere a proprio agio:

  • L'eliminazione di un puntatore di file è molto rapida e contribuisce molto poco al deterioramento del disco
  • È meno probabile che rimanga a corto di spazio su sistemi altamente automatizzati
  • Fornisce una protezione della privacy molto modesta, ma diversa da zero, e viceversa, garanzie di recupero
  • Bassa complessità e quindi bassa possibilità di bug o comportamento imprevisto

Se i compromessi apportati dai tuoi strumenti sono inaccettabili per te, dai un'occhiata in giro. È probabile che ci siano strumenti là fuori che prendono le decisioni giuste per te .


3
L'unica parte di questa risposta che risponde alla domanda è la prima riga
Alvaro

Sto solo cercando di spiegare perché le cose sono così, da una prospettiva di amministratore di sistema.
l0b0

9

Le applicazioni che forniscono una funzionalità di "annullamento" lo fanno mantenendo una cronologia delle azioni intraprese e un metodo per invertire l'azione o un'istantanea dello stato di un oggetto per ripristinare uno stato precedente. I comandi eseguiti in una shell eseguono azioni dirette o eseguono comandi per eseguire azioni.

La shell stessa non avrebbe la possibilità di annullare le azioni risultanti da qualsiasi comando o programma eseguito. Se il comando o il programma mantenevano una cronologia e avevano una funzione di annullamento, forse quello poteva essere usato, ma la shell stessa non poteva.

Ad esempio, se si esegue rm important_file.txt, ciò dirà al driver del filesystem di "scollegare" il file sul filesystem. La shell non esegue l'azione, chiama solo ciò rmche fa.

Nel caso in cui si desideri ripristinare un file perso, potrebbe essere possibile farlo, poiché in genere l'eliminazione del file non lo rimuove effettivamente, ma rimuove solo il riferimento ad esso. Dopo un po ', il contenuto del file verrà sovrascritto man mano che altri dati vengono salvati sul disco, ma per un po' il file originale può essere ripristinato utilizzando utility che possono trovarlo e "ricollegarlo".


1

No, non c'è, ma se, diciamo, hai fatto un casino con una directory con privilegi di root e in qualche modo hai rovinato qualcosa, allora la cosa migliore è salvare tutti i file che puoi su un'unità USB o una scheda SD e ripristinare il sistema operativo da il file ISO (se lo hai ancora, in caso contrario puoi ottenerne un altro offline ...). Se hai cancellato qualcosa che si può, come wraeth detto, scaricare un'applicazione per ricollegare i dati del file al nome del file e avere i file contenuti salvati (vedi questo domanda qui ). Per una risposta più approfondita, puoi dirci cosa hai fatto di sbagliato?


1

Non ripeterò ciò che gli altri hanno detto, ma posso vedere da dove vieni. Il mio approccio standard all'esecuzione di comandi "pericolosi" è sempre stato quello di farli eco per vedere se tutte le variabili si espandono correttamente o meno. Se puoi citare alcuni casi specifici, potremmo essere in grado di aiutarti ulteriormente.

Ad esempio, in una situazione come:

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

1

Come hanno detto altre buone risposte: non c'è "annullamento" nella shell. Ma nel tuo caso d'uso specifico, per annullare un shutdown, puoi interrompere il processo di spegnimento: vedi /programming//a/526330

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.