Quais são as razões exatas que o `grep` on / proc e os discos brutos são uma má idéia?

9

Eu corri grep -r "searchphrase" /hoje e isso não funcionou. Eu fiz algumas pesquisas e achei find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"a abordagem correta.

Eu recolho /proce discos como /dev/sda1são os culpados de um grep sem êxito.

Eu adoraria um conhecimento técnico profundo sobre o "porquê". Eu acho que alguns links dentro /proccriam loops infinitos quando percorridos, e eu li que existem mais razões, mas nada específico.

Além disso, o que acontece quando um disco bruto é recebido? Os dados binários (acessíveis /dev/sda1até onde eu sei?) Não podem ser interpretados, pois apenas um mounttipo de sistema de arquivos torna os dados do disco inteligíveis? Portanto, ainda seria possível grep para uma string binária?

curious_weather
fonte

Respostas:

11

Sim, você pode grep /dev/sda1e /procmas provavelmente não quer. Em mais detalhes:

  1. Sim, você pode executar grep o conteúdo binário de /dev/sda1. Porém, com discos rígidos grandes e modernos, isso levará muito tempo e o resultado provavelmente não será útil.

  2. Sim, você pode visualizar o conteúdo, /procmas esteja ciente de que a memória do seu computador está mapeada como arquivos. Em um computador moderno com gigabytes de RAM, isso levará muito tempo para grep e, novamente, o resultado provavelmente não será útil.

Como exceção, se você estiver procurando dados em um disco rígido com um sistema de arquivos danificado, poderá executar grep something /dev/sda1como parte de uma tentativa de recuperar os dados do arquivo.

Outros arquivos problemáticos em /dev

Os discos rígidos e partições de disco rígido abaixo /devpodem ser, se houver paciência suficiente, recebidos. Outros arquivos (dica de chapéu: user2313067 ), no entanto, podem causar problemas:

  1. /dev/zeroé um arquivo de tamanho infinito. Felizmente, grep(pelo menos a versão GNU) é inteligente o suficiente para ignorá-la:

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/randome /dev/urandomtambém são infinitos. O comando grep something /dev/randomserá executado para sempre, a menos que grepseja sinalizado para parar.

    Pode ser útil grep /dev/urandomao gerar senhas. Para obter, por exemplo, cinco caracteres alfanuméricos aleatórios:

    $ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
    G
    4
    n
    X
    2
    

    Isso não é infinito porque, depois de receber caracteres suficientes, headfecha o canal, causando o término do grep.

Loops infinitos

"... links ... criam loops infinitos quando percorridos ..."

O Grep (pelo menos a versão GNU) é inteligente o suficiente para não fazer isso. Vamos considerar dois casos:

  1. Com a -ropção, o grep não segue links simbólicos, a menos que eles sejam especificados explicitamente na linha de comandos. Portanto, loops infinitos não são possíveis.

  2. Com a -Ropção, grep faz seguir links simbólicos mas verifica-los e se recusa a ficar preso em um loop. Ilustrar:

    $ mkdir a
    $ ln -s ../ a/b
    $ grep -R something .
    grep: warning: ./a/b: recursive directory loop
    

Excluindo diretórios problemáticos de grep -r

Como um aparte, grepfornece um recurso limitado para impedir que o grep procure determinados arquivos ou diretórios. Por exemplo, você pode excluir todos os diretórios nomeados proc, syse devde pesquisa recursiva do grep com:

grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /

Alternativamente, podemos excluir proc, syse devusando globs prolongados do bash:

shopt -s extglob
grep -r something /!(proc|sys|dev)
John1024
fonte
Obrigado! Essa é uma ótima resposta. A menos que outro herói saia do escuro esta noite, eu o aceitarei amanhã! Estou pensando em mais uma coisa, e espero que não seja muito longe: se greppesquisar um arquivo /procque leve à memória mapeada, isso pode ocorrer que grepatinge um EOF dentro da memória (aleatória) e interpreta os seguintes dados como um novo nome de arquivo para pesquisar? Comecei a ler o grepcódigo fonte, mas acho que não vou ver muito nele.
Curious_weather
11
@krork Em alguns sistemas operacionais antigos, como CP / M, o final de um arquivo foi sinalizado pelo caractere EOF. Como os sistemas de arquivos modernos controlam o tamanho de um arquivo, esses caracteres ficaram fora de uso.
John1024
2
O grepping /devpode muito bem nunca terminar, pois o grep começa a varredura /dev/zeroou similar. Não tenho certeza se esses arquivos existem em /procou /sys.
user2313067
11
@ user2313067 Bom ponto! Enquanto o GNU grep se recusar a pesquisar /dev/zero, ele procurará /dev/randompara sempre, a menos que seja parado. Resposta atualizada.
John1024
Eu não faço muito com / proc ou / sys, mas como esses são diretórios virtuais que podem ser atualizados a qualquer momento, você pode obter resultados inesperados / irrepetíveis em várias execuções. Obviamente, isso também pode acontecer com sistemas de arquivos comuns, mas pode ser um pouco mais surpreendente aqui.
Joe