É possível inverter um comando no bash shell?

12

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

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

    
por Fraenzine 02.03.2015 / 13:11

7 respostas

29

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

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

Por exemplo, mv é facilmente reversível movendo apenas o arquivo de onde veio, a menos que você tenha sobrescrito algo. É por isso que existe -i switch, para perguntar antes de sobrescrever. Tecnicamente, o inverso de cp é rm , a menos que algo seja sobrescrito (novamente, -i pergunta a você sobre isso). rm é mais permanente, para tentar recuperar os arquivos, você precisa fazer alguns hacks de baixo nível (existem ferramentas para isso). Se você considerasse o sistema de arquivos como uma caixa preta, tecnicamente não seria possível (somente os detalhes do layout físico e lógico dos dados permitem que você faça algum controle de danos). rm significa rm , se você quiser a funcionalidade "lixeira", isso é apenas mv em algum diretório pré-arranjado (e possivelmente um serviço agendado para manter ou esvaziar) - nada especial sobre isso. Mas você pode usar -i para avisar antes da exclusão. Você pode usar uma função ou um alias para sempre incluir -i nesses comandos.

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

Quando você tenta executar coisas em massa - por exemplo, se você tem um comando find complexo, while loop, um longo pipeline, ou qualquer coisa assim, é uma boa idéia primeiro echo os comandos que serão obtidos executado. Então, se os comandos parecerem razoáveis, remova echo e execute-o para real. E, claro, se você não tiver 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 apropriado, e descompactar espalha os arquivos ao redor, fazendo uma bagunça enorme). Eu me acostumei a apenas fazer um subdiretório antes de descompactar (eu poderia listar o conteúdo, mas eu sou preguiçoso). Estou pensando em criar um script que criará um subdiretório somente se o conteúdo for arquivado sem um subdiretório. Mas quando isso acontece, ls -lrt ajuda 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 segura 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 novamente o dispositivo que você está formatando e o particionamento está correto, antes de executar o comando.

    
por 03.03.2015 / 11:05
14

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

    
por 02.03.2015 / 13:18
11

Não, não há desfazer genérico, mas algumas conseqüências são mais reversíveis do que outras. Tomemos por exemplo rm : ele é essencialmente usado para dois propósitos - evitando desordem 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 somente o ponteiro para o início do arquivo é sobrescrito quando você executa rm ; o conteúdo é sobrescrito quando o sistema operacional reutiliza esse espaço (o que pode acontecer em milissegundos ou anos depois). Devido a essa funcionalidade, rm cai no meio de uma escala de sistemas sendo mais ou menos destrutivos. Por um lado, há sistemas trash , que fornecem uma maneira de evitar a desordem, sem risco de perder os dados imediatamente (porque o desfazer é trivial). Ainda mais conservadores são os sistemas escrever uma vez, ler muitos ("WORM"), onde os dados não podem ser apagados ou sobrescritos à vontade pelo sistema que os grava. No outro extremo da escala estão os sistemas shredding , que sobrescrevem os arquivos conteúdos (geralmente várias vezes) além do ponteiro. Nesse ponto, a tecnologia para recuperar seus dados provavelmente ainda não existe (e possivelmente pode nunca existir).

Assim, você pode ver como a ferramenta específica mais usada ( rm ) não é a única alternativa, mas fornece uma compensação que a maioria das pessoas parece estar acostumada:

  • A exclusão de um ponteiro de arquivo é muito rápida e contribui muito pouco para a deterioração do disco
  • É menos provável que você fique sem espaço em sistemas altamente automatizados
  • Fornece 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 compensações feitas por suas ferramentas forem inaceitáveis para você, dê uma olhada. As chances são de que existem ferramentas que tomam as decisões certas para você .

    
por 02.03.2015 / 13:58
9

Os aplicativos que fornecem um recurso 'desfazer' o fazem mantendo um histórico das 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. 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 fosse executado. Se o comando ou programa mantivesse um histórico e tivesse uma função de desfazer, talvez isso pudesse ser usado, mas a própria shell não pode.

Por exemplo, se você executar rm important_file.txt , isso dirá ao driver do sistema de arquivos para "desvincular" o arquivo no sistema de arquivos. O shell não executa a ação, ele só chama rm , o que faz.

No caso de querer desfazer a exclusão de um arquivo perdido, pode ser possível fazê-lo, já que, normalmente, a exclusão do arquivo não o remove, mas apenas remove a referência a ele. Depois de um tempo, o conteúdo do arquivo será substituído, pois outros dados são salvos no disco, mas por um tempo o arquivo original pode ser restaurado usando utilitários que podem encontrar e "revinculá-lo".

    
por 02.03.2015 / 13:23
1

Não, não há, mas se, digamos que você mexeu com um diretório privilegiado de root e de alguma forma estragou algo, que sua melhor aposta é salvar todos os arquivos que você puder em um drive USB ou um cartão SD e redefinir seu sistema operacional do arquivo ISO (se você ainda tiver, se não você pode obter outro off-line ...). Se você apagou algo que você pode, como wraeth disse, baixe um aplicativo para revincular os dados do arquivo para o nome do arquivo e ter o conteúdo dos arquivos salvos (veja isto pergunta aqui ). Para uma resposta mais detalhada, você pode nos dizer o que você fez de errado?

    
por 02.03.2015 / 13:37
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 ecoar para ver se todas as variáveis são adequadamente expandidas ou não. Se você puder citar alguns exemplos específicos, 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
    
por 05.03.2015 / 09:03
0

Como outras boas respostas disseram: não há "desfazer" no shell. Mas, em seu caso de uso específico, para desfazer um shutdown , você pode eliminar o processo de desligamento: consulte o link

    
por 10.03.2015 / 14:10