É possível reverter um comando no shell bash?

12

Eu queria saber se existe uma possibilidade (simples) de refazer / reverter um comando que foi executado no shell bash? (para desfazer)

Existe algo semelhante à combinação ctrl+ zpara refazer qualquer ação (por exemplo, no word ou no LibreOffice)?

Fraenzine
fonte
8
resposta curta é não. algum comando pode ser revertido, mas não existe um desfazer genérico.
Archemar 02/03
3
como outros disseram, nenhum undocomando, portanto, ter um backup atualizado de todo o sistema operacional é realmente útil. Quando algo der errado, você apenas restaura o estado anterior. Dê uma olhada em rsnapshot por exemplo
Arkadiusz Drabczyk
1
eu gostaria de encontrar uma maneira de desfazer o comando halt -p
Skaperen
3
@ Joshua Publicar um comentário com um comando que pode destruir os dados de um usuário e nenhuma explicação é um comportamento aceitável. Não é engraçado, ele atravessa o site e, mais importante, é perigoso. Não faça isso de novo.
terdon
2
Gostaria de desfazer o shutdowncomando lol .. não acredito que essas perguntas também podem receber 8 upvotes em um dia !!
MagExt

Respostas:

33

Você deve entender que bashé apenas um ambiente de execução. Ele executa comandos que você chama - não é da conta do shell nem mesmo saber o que o comando faz; você pode chamar qualquer executável que desejar. Na maioria dos casos, ainda não está claro o que um desfazer faria - por exemplo, você pode "desfazer" um filme? Você pode "cancelar o envio" de um email? O que "desfazer a execução do firefox" significaria, por exemplo? Você pode fechá-lo, mas favoritos, downloads e histórico não serão os mesmos.

Se você executar um comando, ele será executado, faça o que fizer. Cabe a você saber o que está fazendo. Observe que isso não significa que comandos individuais não tenham "desfazer" ... eles podem - você pode até escrever uma função de invólucro que faz algo para protegê-lo de erros tolos.

Por exemplo, mvé facilmente reversível apenas movendo o arquivo de volta de onde veio, a menos que você tenha sobrescrito algo. É por isso que o -iswitch existe, para perguntar antes de substituir. Tecnicamente, o inverso de cpé rm, a menos que algo tenha sido sobrescrito (novamente, -ivocê pergunta sobre isso). rmé mais permanente, para tentar recuperar os arquivos, você precisa fazer alguns hackers de nível inferior (existem ferramentas para isso). Se você considerasse o sistema de arquivos como uma caixa preta, tecnicamente não seria possível (apenas os detalhes do layout lógico e físico dos dados permitem que você faça algum controle de danos). rmsignifica que rm, se você quiser a funcionalidade "lixo", isso é apenasmvem algum diretório pré-arranjado (e possivelmente um serviço agendado para mantê-lo ou esvaziá-lo) - nada de especial nele. Mas você pode usar -ipara avisar antes da exclusão. Você pode usar uma função ou um alias para sempre incluir -inesses comandos.

Observe que a maioria dos aplicativos está protegendo você da perda de dados de maneiras diferentes. A maioria (~ todos) dos editores de texto cria arquivos de backup ~no final, caso você queira trazer a versão antiga de volta. Em algumas distros, lsé alternativo por padrão, para ocultá-las ( -B), mas elas estão lá. Muita proteção é dada ao gerenciar as permissões corretamente: não seja root, a menos que seja necessário, torne os arquivos somente leitura se não quiser que eles sejam alterados. Às vezes, é útil ter um ambiente de "sandbox" - você executa as coisas em uma cópia, verifica se está tudo bem e depois mescla as alterações (ou as abandona). chrootou lxcpode impedir que seus scripts escapem de um diretório e causem danos.

Quando você tenta executar coisas em massa - por exemplo, se você possui um comando find complexo, enquanto loop, um pipeline longo ou algo assim, é uma boa ideia primeiro apenas echoos comandos que serão executados. Então, se os comandos parecerem razoáveis, remova echoe execute-o de verdade. E, claro, se você realmente não tem certeza do que está fazendo, faça uma cópia primeiro. Às vezes, apenas crio um tarball do diretório atual.

Falando de tarballs - tarbombs e zipbombs são bastante comuns, infelizmente (quando as pessoas fazem um arquivo sem um subdiretório adequado e a descompactação espalha os arquivos, causando uma enorme bagunça). Eu me acostumei a fazer um subdiretório antes de descompactar (eu poderia listar o conteúdo, mas sou preguiçoso). Estou pensando em criar um script que criará um subdiretório somente se o conteúdo tiver sido arquivado sem um subdiretório. Mas quando isso acontece, ls -lrtajuda a encontrar os arquivos mais recentes para colocar onde eles pertencem. Eu apenas dei isso como um exemplo - um programa pode ter muitos efeitos colaterais que o shell não tem como saber (como poderia? É um programa diferente sendo chamado!) A única maneira certa de evitar erros é ter cuidado (pense duas vezes, execute uma vez).

Possivelmente os comandos mais perigosos são os que lidam com o sistema de arquivos: mkfs, fdisk / gdisk e assim por diante. Eles podem destruir completamente o sistema de arquivos (embora com o software forense adequado, pelo menos a engenharia reversa parcial seja possível). Sempre verifique duas vezes o dispositivo que você está formatando e o particionamento está correto antes de executar o comando.

orion
fonte
14

Não, não existe um "desfazer" no Bash, desculpe. É por isso que você deve verificar seus comandos ou testá-los primeiro em arquivos sem importância (se isso for possível). E verifique três vezes se você está fazendo as coisas como root;)

Erathiel
fonte
1
Ctr + / executa um desfazer para determinados comandos de controle no terminal bash, mas nem todos os comandos são desfeitos.
Eric Leschinski
@EricLeschinski Você poderia fornecer alguma referência?
Erathiel
Está oculto nos comentários e respostas desta página: skorks.com/2009/09/bash-shortcuts-for-maximum-productivity Para vê-lo funcionando, digite algumas palavras no terminal. Mova o cursor para a esquerda sobre um caractere, pressione Ctrl-d para excluir o caractere e pressione Ctrl + / que desfaz a exclusão.
Eric Leschinski
1
Ah, mas isso é algo fundamentalmente diferente de desfazer um comando. Se você remover um arquivo rm, o arquivo se foi, passou, faleceu, não existe mais, é um ex-arquivo (alerta Monty Python). Agora seus parentes choram de tristeza e você não pode desfazer sua ação. O que você está falando é desfazer a digitação ou a exclusão de caracteres e suspeito que seja um recurso do seu emulador de terminal. Eu apenas tentei no Terminator e funciona. Mudar para um console diferente (Ctrl + Alt + F1 no meu caso) não permite que ele funcione.
Erathiel
Há a entrada de comando do terminal desfazer e comando do terminal após a execução desfazer. Eu vim aqui procurando o primeiro.
Eric Leschinski
11

Não, não há desfazer genérico, mas algumas consequências são mais reversíveis que outras. Tomemos, por exemplo rm: é essencialmente usado para dois propósitos - evitando confusão e liberando espaço para novos arquivos. Com um pouco de sorte, você pode recuperar o conteúdo do arquivo usando ferramentas como extundelete, porque apenas o ponteiro para o início do arquivo é substituído quando você executa rm; o conteúdo é substituído quando o sistema operacional reutiliza esse espaço (o que pode acontecer milissegundos ou anos depois). Devido a essa funcionalidade, rmocorre no meio de uma escala de sistemas ser mais ou menos destrutiva. Por um lado, há lixosistemas, que fornecem uma maneira de evitar confusão sem o risco de perder os dados imediatamente (porque desfazer é trivial). Ainda mais conservadores são os sistemas de gravação única, leitura de muitos ("WORM"), em que os dados não podem ser excluídos ou substituídos à vontade pelo sistema que está gravando nele. No outro extremo da escala estão os sistemas de trituração , que substituem o conteúdo do arquivo (geralmente várias vezes), além do ponteiro. Nesse ponto, a tecnologia para recuperar seus dados provavelmente ainda nem existe (e possivelmente nunca pode existir).

Assim, você pode ver como a ferramenta específica mais utilizada ( rm) não é a única alternativa, mas fornece uma compensação que a maioria das pessoas parece se sentir confortável com:

  • A exclusão de um ponteiro de arquivo é muito rápida e contribui muito pouco para deteriorar o disco
  • Você está menos propenso a ficar sem espaço em sistemas altamente automatizados
  • Oferece proteção de privacidade muito modesta, mas diferente de zero, e, inversamente, garantias de recuperação
  • Baixa complexidade e, portanto, baixa chance de erros ou comportamento inesperado

Se as vantagens e desvantagens de suas ferramentas são inaceitáveis ​​para você, dê uma olhada. As chances são de que existem ferramentas por aí que tomam as decisões certas para você .

l0b0
fonte
3
A única parte desta resposta que aborda a questão é a primeira linha
Alvaro
Apenas tentando explicar por que as coisas são assim, de uma perspectiva de administrador de sistemas.
L0b0 4/03
9

Os aplicativos que fornecem um recurso "desfazer" fazem isso mantendo um histórico de ações executadas e um método de reverter a ação ou um instantâneo do estado de um objeto para restaurar um estado anterior. Os comandos executados em um shell executam ações diretas ou executam comandos para executar ações.

O próprio shell não teria a capacidade de desfazer as ações resultantes de qualquer comando ou programa que foi executado. Se o comando ou programa mantiver um histórico e tiver uma função de desfazer, talvez isso possa ser usado, mas o próprio shell não pode.

Por exemplo, se você executar rm important_file.txt, isso informará o driver do sistema de arquivos para "desvincular" o arquivo no sistema de arquivos. O shell não executa a ação, apenas chama o rmque faz.

No caso de querer cancelar a exclusão de um arquivo perdido, pode ser possível fazê-lo, pois normalmente a exclusão do arquivo não o remove, mas apenas a referência a ele. Após algum tempo, o conteúdo do arquivo será sobrescrito à medida que outros dados forem salvos no disco, mas por um tempo o arquivo original pode ser restaurado usando utilitários que podem encontrá-lo e "vinculá-lo novamente".

wraeth
fonte
1

Não, não existe, mas se, digamos que você mexeu com um diretório com privilégios de root e estragou algo, sua melhor aposta é salvar todos os arquivos que puder em um drive USB ou cartão SD e reiniciar o sistema operacional de o arquivo ISO (se você ainda o tiver, se não, poderá colocar outro offline ...). Se você excluiu algo, pode, como disse o wraeth , fazer o download de um aplicativo para vincular novamente os dados do arquivo ao nome do arquivo e salvar o conteúdo dos arquivos (consulte esta pergunta aqui ). Para uma resposta mais aprofundada, você pode nos dizer o que fez de errado?

Interessante...
fonte
1

Não vou repetir o que os outros disseram, mas posso ver de onde você está vindo. Minha abordagem padrão para executar comandos "perigosos" sempre foi repeti-los para ver se todas as variáveis ​​são adequadamente expandidas ou não. Se você pode citar algumas instâncias específicas, poderemos ajudar ainda mais.

Por exemplo, em uma situação como:

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

Como outras boas respostas disseram: não há "desfazer" no shell. Mas, no seu caso de uso específico, para desfazer a shutdown, você pode interromper o processo de desligamento: consulte /programming//a/526330

Olivier Dulac
fonte