Was sind die genauen Gründe, warum grep on / proc und raw disks eine schlechte Idee sind?

9

Ich bin grep -r "searchphrase" /heute gelaufen und das hat nicht funktioniert. Ich habe nachgeforscht und festgestellt find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase", dass dies der richtige Ansatz ist.

Ich sammle /procund scheibe gerne /dev/sda1die Schuld an einem erfolglosen Grep.

Ich würde einen tiefen technischen Hintergrund über das "Warum" lieben. Ich denke, dass einige Links in /procEndlosschleifen führen, wenn sie durchlaufen werden, und ich lese, dass es weitere Gründe gibt, aber keine spezifischen.

Was passiert auch, wenn eine Raw-Festplatte abgefangen wird? Können die Binärdaten (auf die meines Wissens zugegriffen werden kann /dev/sda1) nicht interpretiert werden, da nur mountein Dateisystemtyp die Daten von der Festplatte verständlich macht? Wäre es also noch möglich, nach einem Binärstring zu suchen?

neugierig_wetter
quelle

Antworten:

11

Ja, das kannst du grep /dev/sda1und /procaber du willst es wahrscheinlich nicht. Ausführlicher:

  1. Ja, Sie können grep ausführen, um den binären Inhalt von zu überprüfen /dev/sda1. Bei modernen großen Festplatten dauert dies jedoch sehr lange, und das Ergebnis ist wahrscheinlich nicht nützlich.

  2. Ja, Sie können den Inhalt von abrufen, /procaber beachten Sie, dass der Arbeitsspeicher Ihres Computers dort als Dateien zugeordnet ist. Auf einem modernen Computer mit Gigabyte RAM wird dies lange dauern und das Ergebnis wird wahrscheinlich auch nicht nützlich sein.

Wenn Sie auf einer Festplatte mit einem beschädigten Dateisystem nach Daten suchen, werden Sie möglicherweise grep something /dev/sda1als Teil des Versuchs ausgeführt, die Daten der Datei wiederherzustellen.

Andere problematische Dateien in /dev

Die Festplatten und Festplattenpartitionen unter /devkönnen, wenn man genug Geduld hat, abgehackt werden. Andere Dateien (hat tip: user2313067 ) können jedoch Probleme verursachen:

  1. /dev/zeroist eine Datei von unendlicher Länge. Zum Glück ist grep(zumindest die GNU-Version) klug genug, um es zu überspringen:

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/randomund /dev/urandomsind auch unendlich. Der Befehl grep something /dev/randomwird für immer ausgeführt, sofern nicht grepsignalisiert wird, dass er gestoppt werden soll.

    Es kann nützlich sein, /dev/urandombeim Generieren von Passwörtern mit grep zu arbeiten . So erhalten Sie beispielsweise fünf zufällige alphanumerische Zeichen:

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

    Dies ist nicht unendlich, da nach dem Empfang von genügend Zeichen headdie Pipe geschlossen wird, wodurch grep beendet wird.

Endlosschleifen

"... Links ... erzeugen beim Durchlaufen Endlosschleifen ..."

Grep (zumindest die GNU-Version) ist schlau genug, das nicht zu tun. Betrachten wir zwei Fälle:

  1. Mit dieser -rOption folgt grep keinen symbolischen Links, es sei denn, sie werden explizit in der Befehlszeile angegeben. Es sind also keine Endlosschleifen möglich.

  2. Mit der -ROption, grep tut symbolischen Links folgen , aber es überprüft sie und weigert sich, in einer Schleife gefangen werden. Um zu veranschaulichen:

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

Ausschluss problematischer Verzeichnisse aus grep -r

Als Nebenwirkung grepbietet eine begrenzte Einrichtung grep von der Suche auf bestimmte Dateien oder Verzeichnisse zu stoppen. Zum Beispiel können Sie alle Verzeichnisse ausschließen genannt proc, sysund devvon grep rekursive Suche mit:

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

Alternativ können wir ausschließen proc, sysund devbash erweiterten Klackse mit:

shopt -s extglob
grep -r something /!(proc|sys|dev)
John1024
quelle
Vielen Dank! Das ist eine großartige Antwort. Wenn heute Nacht kein anderer Held aus der Dunkelheit auftaucht, werde ich es morgen akzeptieren! Ich frage mich noch etwas, und ich hoffe, es ist nicht zu weit weg: Wenn grepeine Datei durchsucht wird /proc, die zu zugeordnetem Speicher führt, kann es vorkommen, dass grepein EOF im (zufälligen) Speicher auftritt und die folgenden Daten als a interpretiert neuer Dateiname zum Suchen? Ich habe angefangen, den grepQuellcode zu lesen , aber ich denke, ich werde nicht zu viel darin sehen.
curious_weather
1
@krork In einigen alten Betriebssystemen, wie z. B. CP / M, wurde das Ende einer Datei durch das EOF-Zeichen signalisiert. Da moderne Dateisysteme die Größe einer Datei verfolgen, wurden solche Zeichen nicht mehr verwendet.
John1024
2
Das Greifen /devkann durchaus niemals enden, wenn grep zu scannen beginnt /dev/zerooder ähnlich. Unsicher, ob solche Dateien in /procoder existieren /sys.
user2313067
1
@ user2313067 Guter Punkt! Während GNU grep sich weigert zu suchen /dev/zero, wird es für /dev/randomimmer suchen , sofern es nicht gestoppt wird. Antwort aktualisiert.
John1024
Ich mache nicht viel mit / proc oder / sys, aber da es sich um virtuelle Verzeichnisse handelt, die jederzeit aktualisiert werden können, können bei mehreren Durchläufen unerwartete / nicht wiederholbare Ergebnisse auftreten. Dies kann natürlich auch mit regulären Dateisystemen passieren, aber es könnte hier etwas überraschender sein.
Joe