Unix / Linux undelete / recupera arquivos apagados

124

Existe um comando para recuperar / recuperar arquivos apagados excluídos rm?

$ rm -rf /path/to/myfile

Como posso me recuperar myfile? Se existe uma ferramenta, como posso usá-la?

pylover
fonte
1
cyberciti.biz/tips/… pode ajudar. Também é melhor no Stack Exchange .
Fedorqui
1. Isso seria melhor para Unix e Linux 2. Backups?
1
Antes de fazer qualquer coisa, monte o sistema de arquivos somente leitura para garantir que os dados não sejam substituídos. Além disso, dê uma olhada nesta publicação: superuser.com/questions/170857/ext4-undelete-utilities .
1
@EvanTeitelman, você quer dizer remontar somente leitura é melhor do que tentar recuperar o arquivo enquanto ele estiver desmontado? btw, Midnight Commander maneira (mc), sugere desmontar datarecoverypros.com/recover-linux-midnightcommander.html
Aquarius Poder
1
A melhor solução é pensar no futuro e usar uma ferramenta de controle de revisão.
Ctrl-alt-delor

Respostas:

66

O link fornecido por alguém nos comentários provavelmente é sua melhor chance.

Linux debugfs Hack: Undelete Files

Esse artigo, embora pareça um pouco intimidador, é realmente bastante simples de seguir. Em geral, as etapas são as seguintes:

  1. Use debugfs para visualizar um log do sistema de arquivos

    $ debugfs -w /dev/mapper/wks01-root
    
  2. No prompt debugfs

    debugfs: lsdel
    
  3. Saída de amostra

    Inode  Owner  Mode    Size    Blocks   Time deleted
    23601299      0 120777      3    1/   1 Tue Mar 13 16:17:30 2012
    7536655      0 120777      3    1/   1 Tue May  1 06:21:22 2012
    2 deleted inodes found.
    
  4. Execute o comando no debugfs

    debugfs: logdump -i <7536655>
    
  5. Determinar arquivos inode

    ...
    ...
    ....
    output truncated
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
      FS block 7536642 logged at sequence 38402086, journal block 26711
        (inode block for inode 7536655):
        Inode: 7536655   Type: symlink        Mode:  0777   Flags: 0x0   Generation: 3532221116
        User:     0   Group:     0   Size: 3
        File ACL: 0    Directory ACL: 0
        Links: 0   Blockcount: 0
        Fragment:  Address: 0    Number: 0    Size: 0
        ctime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        atime: 0x4f9fc730 -- Tue May  1 06:21:20 2012
        mtime: 0x4f9fc72f -- Tue May  1 06:21:19 2012
        dtime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
    No magic number at block 28053: end of journal.
    
  6. Com as informações do inode acima, execute os seguintes comandos

    # dd if=/dev/mapper/wks01-root of=recovered.file.001 bs=4096 count=1 skip=7235938
    # file recovered.file.001
    file: ASCII text, with very long lines
    

Arquivos foram recuperados para recovered.file.001.

Outras opções

Se o exposto acima não é para você, usei ferramentas como photoreca de recuperar arquivos no passado, mas é voltado apenas para arquivos de imagem. Eu escrevi sobre esse método extensivamente no meu blog neste artigo intitulado:

Como recuperar arquivos jpeg e mov corrompidos do cartão SDD de uma câmera digital no Fedora / CentOS / RHEL .

slm
fonte
11
Eu tentei com debugfs -w /dev/sdb2mas lsdelsais:0 deleted inodes found.
rubo77
5
o uso extundeleteé mais fácil para o ext3 / 4 e provavelmente levaria aos mesmos resultados.
Eadmaster
1
isso funcionou para recuperar um arquivo, mas recebi @ y U T6 Ԝ * e 0 v' T 0 <#selinuxsystem_u: object_r: rpm_var_lib_t: s0} yUT6 ..... tentando conv = ascii, conv = ibm, e conv = rendimentos EBCDIC mesmo problema
codyc4321
2
lsdel: Sistema de arquivos não aberto, como resolvê-lo?
Amitābha
3
Eu recebo De /dev/mapper/wks01-root: No such file or directory while opening filesystemonde você tirou isso /dev/mapper/wks01-root?
Marko Avlijaš
29

Com algumas chances, às vezes posso recuperar arquivos excluídos com esse script ou com a próxima solução na resposta:

#!/bin/bash

if [[ ! $1 ]]; then
    echo -e "Usage:\n\n\t$0 'file name'"
    exit 1
fi

f=$(ls 2>/dev/null -l /proc/*/fd/* | fgrep "$1 (deleted" | awk '{print $9}')

if [[ $f ]]; then
    echo "fd $f found..."
    cp -v "$f" "$1"
else
    echo >&2 "No fd found..."
    exit 2
fi

Há outro truque útil: se você conhece um padrão nos arquivos excluídos, digite alt+ sys+ resuopara reiniciar + remontar em somente leitura e, em um live-cd, use greppara pesquisar no disco rígido:

grep -a -C 500 'known pattern' /dev/sda | tee /tmp/recover

edite /tmp/recoverpara manter apenas o (s) seu (s) arquivo (s) antes.

Ei, se com a filosofia unix tudo são arquivos, é hora de tirar vantagem disso, não?

Gilles Quenot
fonte
5
Sua grepsolução baseada é muito inteligente e funcionou para mim, mesmo com o sistema de arquivos ainda montado. Obrigado!
wchargin
Não entendo como a solução grep funcionou para você, ela gera apenas dados binários. Como isso é útil?
W00t
2
@ w00t Claro, "apenas" cospe dados binários. Às vezes, porém, esses dados binários contêm os bits ASCII correspondentes ao arquivo que estou procurando. Acho que não entendi a pergunta?
wchargin
@ w00t o truque é usar um padrão de pesquisa muito específico para esse arquivo. O comando grep pega as 500 linhas antes e depois de cada linha correspondente, portanto ainda gera muitos dados irrelevantes, mas com um editor de texto que pode lidar com isso (por exemplo, Vim), é fácil entender o que é bom as coisas ruins. Você também pode filtrar todas as linhas com caracteres não imprimíveis, canalizando-o através de um outro comando grep:grep -av "[^[:print:]]"
CJStuart
A grepsolução funcionou para mim com uma modificação: fiz sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee linese obtive desvios de bytes (como 123123123:line\n456456456:another\n...), depois fiz n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$ne n=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$ncom nvalores diferentes .
precisa saber é o seguinte
21

O que funcionou para mim foi dado pelo arch (aplica-se apenas a arquivos de texto):

grep -a -C 200 -F 'Unique string in text file' /dev/sdXN

Onde /dev/sdXNestá a partição que contém o arquivo perdido (verifique mountse não tiver certeza).

Demora um pouco, mas funcionou quando excluí acidentalmente algum código-fonte que ainda não havia confirmado!

William Becker
fonte
4
Muito útil para programadores! geralmente, sempre perdíamos nossos próprios códigos.
pylover
1
diga-me sobre isso, eu acidentalmente correu rm data/*.json python myFile.pyem vez derm data/*.json && python myFile.py
William Becker
2
Obrigado companheiro, você acabou de me ajudar a recuperar um arquivo de texto que passei 2 horas escrevendo à noite. PS /dev/sdXNé para o sistema de arquivos, certo? Eu encontrei o meu comdf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Alex
Eu vejo apenas o binário do arquivo. Existe uma maneira de convertê-lo para o formato normal?
Silgon
grep: conflicting matchers specified
felwithe 25/09
10

Embora esta questão tenha sido resolvida e tenha alguns anos, quero mencionar o utilitário testdisk .

Como recuperar arquivos com o testdisk é explicado bem neste tutorial . Para recuperar arquivos, execute testdisk /dev/sdXe selecione seu tipo de tabela de partição. Depois disso, selecione [ Advanced ] Filesystem Utils, escolha sua partição e selecione [Undelete]. Agora você pode procurar e selecionar arquivos excluídos e copiá-los para outro local no seu sistema de arquivos.

S. Wilhelm
fonte
Ele não vê o meu / dev / nvme0n1p2
h22 21/02
6

Eu tive o mesmo problema na semana passada e tentei muitos programas, como debugfs, photorec, ext3grep e extundelete. O ext3grep foi o melhor programa para recuperar arquivos. A sintaxe é muito fácil:

ext3grep image.img --restore-all

ou:

ext3grep /dev/sda3 --restore-all --after date -d '2015-01-01 00:00:00' '+%s' --before `date -d ‘2015-01-02 00:00:00’ ‘+%s’

Este vídeo é um mini tutorial que pode ajudá-lo.

Juan
fonte
6

Uma alternativa pode estar usando, em delvez de rmexcluir:

http://fex.belwue.de/fstools/del.html

del possui uma função de exclusão e funciona com qualquer sistema de arquivos.

Claro que não é uma solução se você já excluiu seus arquivos com "não faça prisioneiros" rm: -}

Framstag
fonte
1
Não é uma resposta, como você já disse, mas obrigado por introduzir o del comando.
Pylover
5

conecte a unidade através da interface externa

  1. montar
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. os resultados vão para a pasta inicial na unidade de inicialização
  5. pontos de bônus: escreva uma GUI para isso

Veja este link para mais informações: cancele a exclusão de um arquivo recém-excluído no ext4 com extundelete .

GRZ
fonte
2
Downvoters, por favor, explique por que você acha que extundelete não é uma boa opção?
Webminal.org
2
Agradável! Obrigado por publicar. extundelete é uma nova ferramenta para mim. Eu usei isso hoje e achei extremamente útil. IMO muito mais útil do que a resposta aceita. As únicas coisas que eu acrescentaria a esta resposta para melhorá-la são: (1) reiterar as instruções em outras respostas que devem ser desligadas o computador afetado assim que perceberem que os arquivos foram excluídos por engano e (2) para inicialize a partir de um liveCD ou SO liveUSB como o Kali Linux, que inclui o utilitário extundelete (eu descobri que muitos outros liveCDs como o Debian Jessie não incluem esse utilitário na mídia de instalação).
Osteoboon
4

Ferramentas de recuperação - linha de comando:

Ferramentas de recuperação - Gui:

Informações:

Na minha experiência pessoal, recupero meus dados usando o ufs-explorer e o photorec

(1) = Não é de código aberto, não é livre

(2) = Não é de código aberto, gratuito

(3) = Código aberto e gratuito

(4) = Ter suporte a NTFS

(5) = Possui recurso de estrutura de diretório

intika
fonte
1

Discordo que é impossível, apenas muito, muito difícil, e também nunca fiz isso no Linux:

Quando os arquivos são excluídos, eles não são realmente excluídos. O que acontece é que o espaço em que estavam no disco rígido é redefinido, de modo que, se o computador tentar gravar dados lá, nada reclamará. Geralmente, os dados do disco rígido que você pensou que excluiu podem estar lá quase um ano depois. Ou pelo menos, esta é minha experiência em uma máquina Windows. Se funciona ou não da mesma maneira em uma linha de comando no Linux, não tenho certeza, mas você provavelmente precisará de um Live CD separado para abrir a partição assim, e também não há garantia de que os arquivos ainda estejam lá. Eu fiz isso no Windows XP várias vezes usando o Zero Assumption Recovery. Tenho certeza de que existe uma ferramenta semelhante ao redor, se você se esforçar o suficiente.

Roguebantha
fonte
Dependendo da situação, pode ser 100% impossível. Pode ou não funcionar, mas você NUNCA tem garantias.
klutt
0

Quando você exclui um arquivo, a contagem de links na tabela de inodes para esse arquivo diminui em um. No Unix, quando a contagem de links cai para 0, os blocos de dados para esse arquivo são marcados como livres e, geralmente, as referências a esses blocos são perdidas. Acabei de descobrir no comentário do @ fedorqui que pode haver alguma maneira de acessar esses blocos, mas isso só é aplicável ao sistema de arquivos ext3.

Uma maneira de preservar os arquivos será escrever uma função que permita mover os arquivos para uma área de lixo (digamos $HOME/.trash) e recuperar os arquivos necessários a partir daí. Esta função pode ser associada a rm. Você pode agendar um trabalho cron para excluir os arquivos que estão na área de lixo por um determinado número de dias.

unxnut
fonte
0

Isso pode salvar o problema para alguns de vocês.
Se você já usou o gedit para editar esse arquivo, por padrão, uma cópia desse arquivo será criada.
Por exemplo, suponha que tenhamos excluído acidentalmente 'myfile.txt'.
Na pasta que costumava conter o arquivo que você acabou de excluir, use estes comandos e você recuperará a cópia a partir daí:
ls | grep 'myfile.txt~'
Com um pouco de sorte, você o encontrará e depois:
cp 'myfile.txt~' 'myfile.txt'
Eu recuperei um arquivo agora usando esse método. Boa sorte!

ntt
fonte