UNIX-Befehle - finden


9

Ich versuche, UNIX-Befehle zu lernen, und ich spiele dieses Spiel, um zu lernen, und ich stecke im Moment wirklich fest. Ich bin über ssh auf einem Server und das Verzeichnis ist voll mit zufälligen Dateien und Ordnern und das Passwort für die nächste Ebene befindet sich in einer der Dateien. Mir wurde gesagt, dass die Datei die folgenden Attribute hat:

  • für Menschen lesbar
  • 1033 Bytes
  • nicht ausführbar

Ich vermute, dass ich den findBefehl verwenden sollte und ich habe es versucht, find ! -executableaber das hat eine Menge Dateien zurückgegeben. Die einzige für Menschen lesbare Hilfe, die ich im Handbuch oder online finden kann, ist das Ausdrucken der Dateigrößen in für Menschen lesbaren. Also bin ich dort ein bisschen verloren?

Auch ich habe es versucht, find ~ -size 1033baber das brachte nichts zurück. Aber als ich es versuchte, gab find ~ -size -1033bes jede Datei im Verzeichnis zurück.


Ich würde wirklich gerne mehr über dieses Spiel erfahren!
ivanivan

2
@ivanivan bandit.overthewire.org
avgvstvs

Antworten:


16

Um die für Menschen lesbaren Dateinamen herauszufiltern, können Sie den [:print:]( druckbaren ) Zeichenklassennamen verwenden. Weitere Informationen zu solchen Klassen finden Sie im Handbuch für grep.

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

Bei einem zweiten Gedanken könnte sich die Anforderung "lesbar" auf den Inhalt der Datei anstatt auf ihren Namen beziehen. Mit anderen Worten, Sie würden nach Textdateien suchen . Das ist etwas kniffliger. Wie in einem Kommentar von @D_Bye vorgeschlagen, sollten Sie dann den fileBefehl verwenden, um den Dateiinhaltstyp zu bestimmen. Es wäre jedoch keine gute Idee, fileeiner Pipe nachzulaufen, da dies die Anzeige des Dateinamens erschweren würde. Folgendes schlage ich vor:

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

So funktioniert der Teil kurz file:

  • Das -execPrädikat wird sh -c 'file -b $0 | grep -q text' FILENAMEfür jedes Prädikat ausgeführt FILENAME, das alle vorherigen Bedingungen erfüllt (Typ, Größe, nicht ausführbar).
  • Für jede dieser Dateien führt eine shell ( sh) dieses kurze Skript aus : file -b $0 | grep -q textund ersetzt es $0durch den Dateinamen.
  • Das fileProgramm bestimmt den Inhaltstyp jeder Datei und gibt diese Informationen aus. Die -bOption verhindert das Drucken des Namens jeder getesteten Datei.
  • grepfiltert die Ausgabe des fileProgramms und sucht nach Zeilen, die "Text" enthalten . (Überzeugen Sie sich selbst, wie eine typische Ausgabe des fileBefehls aussieht.)
  • Aber grepnicht ausgibt den gefilterten Text, weil es die hat -q(leise) Option gegeben. Was es tut, ist einfach seinen Exit-Status in entweder 0(was "wahr" darstellt - der gefilterte Text wurde gefunden) oder 1 (was "Fehler" bedeutet - der Text "Text" wurde in der Ausgabe von nicht angezeigt file) zu ändern .
  • Der von / kommende True / False-Exit-Status grepwird weiter shan übergeben findund ist das Endergebnis des gesamten " -exec sh -c 'file $0 | grep -q text' {} \;" -Tests.
  • Wenn der obige Test true zurückgibt , wird der -printBefehl ausgeführt (dh der Name der getesteten Datei wird gedruckt).

Ich weiß, dass dies alt ist, aber ich möchte hinzufügen, dass using find . -type f -size 1033cauch genau die gleiche Antwort zurückgibt.
Brandon Benefield

8
find . -type f -readable -size 1033c ! -executable

Beachten Sie, dass ich canstelle bfür die Dateigröße verwendet habe. bist für 512-Byte-Blöcke. cist für tatsächliche Bytes.


2
Ich denke nicht -readablebedeutet menschlich lesbar (dh nicht binär)
hhaamu

1
@hhaamu - richtig. Es ist jedoch wahrscheinlich nicht schlecht, Dateien herauszufiltern, für die der Benutzer keine Leserechte hat! Um festzustellen, ob eine Datei für Menschen lesbaren Inhalt enthält, leiten Sie die von findan zurückgegebenen Namen weiter file.
D_Bye

2

Alles was ich schrieb war:

find -size 1033c ! -executable

und bekam die Datei. Anscheinend war der von Menschen lesbare Teil, dich abzuwerfen.


0
find . -readable -size 1033c \! -executable

-lesbar bedeutet, dass die Dateien vom Konto gelesen werden können, was sie nicht unbedingt für Menschen lesbar macht.
Anthon

0

Ich denke für das Spiel ist jedoch die richtige Syntax:

file ./* 

Sie erhalten eine Rückgabe, in der aufgeführt ist, woraus jede Datei besteht. Es hat wirklich gut funktioniert für das, was Sie im Bandit-Spiel erreichen wollen. Der eigentliche Kurvenball für diese Aufgabe ist, dass jede Datei mit - (Bindestrich) beginnt.


Sie können dies verbessern, indem Sie diesem Befehl einen Bindestrich hinzufügen file ./-*.
ConstantFun

0

Ich denke, dies ist die beste tatsächliche Antwort, die alle drei Bedingungen abdecken würde

find inhere/ -type f -size 1033c ! -executable |xargs file | grep text

Aber wie viele Leute sagten, sollten die ausführbaren und von Menschen lesbaren Elemente uns abschrecken, also verwenden

find inhere/ -type f -size 1033c 

ist ganz ausreichend!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.