Quali sono esattamente i motivi per cui grep su on / proc e dischi grezzi è una cattiva idea?


9

Ho corso grep -r "searchphrase" /oggi e non ha funzionato. Ho fatto alcune ricerche e ho trovato find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"l'approccio giusto.

Raccolgo /proce dischi come /dev/sda1sono colpevoli di un grep senza successo.

Mi piacerebbe un profondo background tecnico sul "perché". Penso che alcuni collegamenti all'interno /proccreino infiniti loop quando vengono attraversati, e leggo che ci sono più ragioni, ma nulla di specifico.

Inoltre, cosa succede quando un disco raw viene grepped? I dati binari (che sono accessibili /dev/sda1, per quanto ne so?) Non possono essere interpretati, poiché solo un mountcon un tipo di filesystem rende intelligibili i dati dal disco? Sarebbe quindi ancora possibile richiedere una stringa binaria?

Risposte:


11

Sì, puoi grep /dev/sda1e /procprobabilmente non vorrai. Più in dettaglio:

  1. Sì, puoi eseguire grep i contenuti binari di /dev/sda1. Tuttavia, con i moderni dischi rigidi di grandi dimensioni, ciò richiederà molto tempo e il risultato non sarà probabilmente utile.

  2. Sì, puoi grep il contenuto di /procma tieni presente che la memoria del tuo computer è mappata lì come file. Su un computer moderno con gigabyte di RAM, ci vorrà molto tempo per eseguire il grep e, di nuovo, è probabile che il risultato non sia utile.

In via eccezionale, se si stanno cercando dati su un disco rigido con un file system danneggiato, è possibile eseguire grep something /dev/sda1come parte di un tentativo di recupero dei dati del file.

Altri file problematici in /dev

I dischi rigidi e le partizioni del disco rigido sottostanti /devpossono essere, se uno ha abbastanza pazienza, grepped. Altri file (cappello: user2313067 ), tuttavia, possono causare problemi:

  1. /dev/zeroè un file di lunghezza infinita. Fortunatamente, grep(almeno la versione GNU) è abbastanza intelligente da saltare:

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/randome /dev/urandomsono anche infiniti. Il comando grep something /dev/randomverrà eseguito per sempre a meno che non grepvenga segnalato l'arresto.

    Può essere utile grep /dev/urandomdurante la generazione di password. Per ottenere, ad esempio, cinque caratteri alfanumerici casuali:

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

    Questo non è infinito perché, dopo aver ricevuto abbastanza caratteri, headchiude la pipe facendo terminare grep.

Anelli infiniti

"... collegamenti ... creano cicli infiniti quando vengono attraversati ..."

Grep (almeno la versione GNU) è abbastanza intelligente da non farlo. Consideriamo due casi:

  1. Con l' -ropzione, grep non segue i collegamenti simbolici a meno che non siano esplicitamente specificati sulla riga di comando. Quindi non sono possibili loop infiniti.

  2. Con l' -Ropzione grep fa seguire i link simbolici ma li controlla e si rifiuta di rimanere intrappolati in un ciclo. Illustrare:

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

Escludendo directory problematiche da grep -r

A parte questo, grepoffre una funzione limitata per impedire a grep di cercare determinati file o directory. Ad esempio, è possibile escludere tutte le directory nome proc, syse devdalla ricerca ricorsiva di grep con:

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

In alternativa, si può escludere proc, syse devutilizzando gocce estese di bash:

shopt -s extglob
grep -r something /!(proc|sys|dev)

Grazie! Questa è un'ottima risposta. A meno che stasera non emerga un altro eroe dal buio, lo accetterò domani! Mi chiedo un'altra cosa, e spero che non sia troppo lontano: se grepcerca un file /procche porta alla memoria mappata, potrebbe accadere che grepcolpisca un EOF all'interno della memoria (casuale) e interpreti i seguenti dati come un nuovo nome file da cercare? Ho iniziato a leggere il grepcodice sorgente, ma suppongo che non vedrò troppo in esso.
curious_weather,

1
@krork In alcuni vecchi sistemi operativi, come CP / M, la fine di un file è stata segnalata dal carattere EOF. Poiché i file system moderni tengono traccia delle dimensioni di un file, tali caratteri non sono più utilizzati.
Giovanni 1024,

2
Grepping /devpotrebbe non finire mai poiché grep inizia a scansionare /dev/zeroo simili. Non sono sicuro se tali file esistano in /proco /sys.
user2313067,

1
@ user2313067 Ottimo punto! Mentre GNU grep rifiuterà di cercare /dev/zero, cercherà /dev/randomper sempre a meno che non venga fermato. Risposta aggiornata
Giovanni 1024

Non faccio molto con / proc o / sys, ma poiché si tratta di directory virtuali che possono essere aggiornate in qualsiasi momento, è possibile ottenere risultati imprevisti / irripetibili da più esecuzioni. Naturalmente, questo può accadere anche con i normali file system, ma potrebbe essere un po 'più sorprendente qui.
Joe,
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.