Ich versuche, einen effizienten Weg zu finden, um die -Ebene 5 der OverTheWire-Banditenherausforderung .

Wie auch immer, ich habe eine Reihe von Dateien, und es gibt nur eine, die die folgenden Kriterien erfüllt:

  • Vom Menschen lesbar
  • 1033 Bytes groß
  • Nicht ausführbar

Im Moment verwende ich den Befehl find und ich kann die Dateien finden, die den beiden letzten Kriterien entsprechen:

find . -size 1033c ! -executable 

Ich weiß jedoch nicht, wie ich nicht von Menschen lesbare Dateien ausschließen kann Lösungen, die ich für diese Herausforderung gefunden habe, verwenden den Testparameter -readable, aber ich glaube nicht, dass dies funktioniert. -readable überprüft nur die Berechtigungen der Dateien und nicht deren Inhalt, während in der Beschreibung der Herausforderung eine ASCII-Datei oder ähnliches angefordert wird.

Kommentare

  • Wie definieren Sie menschlich lesbar? Nicht binär?
  • Dateibefehl ist Ihr Freund 🙂
  • Vielleicht Duplikat von: stackoverflow.com/questions/14505218/…
  • Menschen sind eine der intelligentesten bekannten Arten auf der Erde. Sie ‚ sind auch die einzigen, die mit Computern vertraut sind. Sie können die meisten Dateien lesen, vorausgesetzt, sie können den Typ herausfinden und die Verschlüsselungsschlüssel für die verschlüsselte erhalten.
  • SPOILER-ALARM !!

Antwort

Ja, Sie können find, um nach nicht ausführbaren Dateien mit der richtigen Größe zu suchen und dann mit file nach ASCII zu suchen. So etwas wie:

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII 

Die Questi on ist jedoch nicht so einfach, wie es sich anhört. „Vom Menschen lesbar“ ist ein schrecklich vager Begriff. Vermutlich meinst du Text. OK, aber welche Art von Text? Nur lateinisches ASCII-Zeichen? Voller Unicode? Betrachten Sie beispielsweise diese drei Dateien:

$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo 

Diese Dateien sind alle text- und lesbar. Nun wollen wir sehen, was file aus ihnen macht:

$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable 

Also, die findet nur file1 (für dieses Beispiel stellen wir uns vor, diese Dateien hätten 1033 Zeichen). Sie können die find erweitern, um nach der Zeichenfolge text zu suchen:

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text 

Mit -w druckt grep nur Zeilen, in denen text als gefunden wird ein eigenständiges Wort. Das sollte ziemlich nahe an dem liegen, was Sie wollen, aber ich kann nicht garantieren, dass es keinen anderen Dateityp gibt, dessen Beschreibung möglicherweise auch die Zeichenfolge text enthält.

Antwort

Während -exec meistens verwendet wird, um etwas mit den Dateien zu tun, die Wo gefunden, kann es auch als Test dienen. Daher können wir es zu Ihren anderen Kriterien hinzufügen:

find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \; 

Denken Sie daran, grep gibt einen Wert ungleich Null zurück, wenn das Muster nicht gefunden wurde, und sh -c "COMMAND" gibt das Ergebnis der Auswertung zurück (solange es gültig ist) Drucken Sie nur Dateien, in denen file <filename> etwas ausspuckt, das mit text endet, z. B. „UTF-8 Unicode-Text“ oder „ASCII-Text“ nicht „Erweiterter ASCII-Text ohne ISO mit Escape-Sequenzen“.

In einer einzelnen Zeile wird er sogar kürzer als xargs:

find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \; 

Behalte i Beachten Sie jedoch, dass Sie sh -c "file {} | grep "text$"" durch einen beliebigen benutzerdefinierten Befehl ersetzen können. Wenn Sie nach etwas sehr Komplexem suchen möchten, ist es möglicherweise besser, ein Shell-Skript bereitzustellen und dieses stattdessen zu verwenden:

find . -size 1033c -not -executable -exec is_human_readable.sh {} \; 

was auf lange Sicht run, ist einfacher zu pflegen als der Verlauf Ihrer Shell:

#!/bin/sh file "$@" | grep "text$" > /dev/null 

Kommentare

  • Schön! Beachten Sie jedoch, dass durch das Abgleichen von text$ Dinge ausgeschlossen werden, die als Shell-Skripte erkannt wurden. Alles, was einen Shebang enthält, wird als Skript identifiziert und ist für den Menschen perfekt lesbar @terdon stimmt, aber Skripte sind in der Regel ausführbar: D. Allerdings sollte ein ordnungsgemäßes Skript auch PDFs erkennen. Ist eine PDF-Datei jedoch ein menschliches lesbares Bild? Ist ein PNG von einem Text lesbar ? Wahrscheinlich. Ich denke, ein vollständiger Test wird… herausfordernd sein.

Antwort

Sie müssen nur Folgendes verwenden:

find inhere -size 1033c 

Sie erhalten die einzige Datei, die das Kennwort enthält.

Kommentare

  • Warum gibt + 1033c mehr Dateien zurück? ist das wie ein größeres oder gleiches Zeichen?

Antwort

find . -size 1033c ! -executable -exec file {} + 

Antwort

Führen Sie einfach Folgendes für den Inhalt des Verzeichnisses aus:

$ file -- * -file00: data -file01: data -file02: data -file03: data -file04: data -file05: data -file06: data -file07: ASCII text -file08: data -file09: data $ cat -- \-file07 <output> 

Antwort

Es gibt nur 1 Datei mit 1033 Bytes.

bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$ 

Warum 1033c und nicht 1033? Überprüfen Sie die Seite man

 -size n[cwbkMG] File uses n units of space, rounding up. The following suffixes can be used: `b" for 512-byte blocks (this is the default if no suffix is used) `c" for bytes `w" for two-byte words `k" for Kilobytes (units of 1024 bytes) `M" for Megabytes (units of 1048576 bytes) `G" for Gigabytes (units of 1073741824 bytes) 

Überprüfen Sie dies mit den Befehlen ls -l und file, und Sie erhalten alle Antworten.

bandit5@bandit:~$ ls -l ./inhere/maybehere07/.file2 -rw-r----- 1 root bandit5 1033 May 7 20:15 ./inhere/maybehere07/.file2 bandit5@bandit:~$ bandit5@bandit:~$ file ./inhere/maybehere07/.file2 ./inhere/maybehere07/.file2: ASCII text, with very long lines bandit5@bandit:~$ 
  1. lesbar (ASCII text)
  2. 1033 Byte (auch in ls -l Ausgabe)
  3. nicht ausführbar (-rw-r-----)

Antwort

find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}" 

Bitte versuchen Sie diese kombinierten Befehle. es funktioniert auf meiner Station.

Antwort

Sie können dies versuchen

find . -size 1033c ! -executable -exec file {} + 

Ihre Herausforderung erlaubt nicht grep. Die Kennwortdatei wird als „ASCII-Text mit sehr langen Zeilen“ gemeldet.

Antwort

Zum Herausfiltern der Für von Menschen lesbare Dateinamen können Sie die Zeichenklasse [:print:] ( printable ) name. Weitere Informationen zu solchen Klassen finden Sie im Handbuch für grep.

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

Bei einem zweiten Gedanken Die Anforderung „lesbar“ bezieht sich möglicherweise auf den Inhalt der Datei anstelle des Namens. Mit anderen Worten, Sie würden nach Textdateien suchen. Das ist etwas kniffliger. Als @ D_Bye schlug in einem Kommentar vor, dass Sie dann den Befehl file verwenden sollten, um den Dateiinhaltstyp zu bestimmen. Es wäre jedoch keine gute Idee, file nach einer Pipe, 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 file -Teil kurz:

  • Das Prädikat -exec führt sh -c "file -b $0 | grep -q text" FILENAME für jede FILENAME, die alle vorherigen Bedingungen erfüllt (Typ, Größe, nicht ausführbar).
  • Für jede dieser Dateien Eine Shell (sh) führt dieses kurze Skript aus: file -b $0 | grep -q text, wobei $0 durch den Dateinamen ersetzt wird.
  • Die file bestimmt den Inhaltstyp jeder Datei und gibt diese Informationen aus. Die Option -b verhindert das Drucken des Name jeder getesteten Datei.
  • grep Filter die Ausgabe kommt von

Programm, das nach Zeilen sucht, die „text“ enthalten. (Überzeugen Sie sich selbst, wie eine typische Ausgabe des Befehlsfileaussieht.)

  • grep jedoch nicht Geben Sie den gefilterten Text aus, da die Option -q (leise) angegeben ist . Ändern Sie einfach den Exit-Status in 0 (was „true“ darstellt – der gefilterte Text wurde gefunden) oder 1 (was „Fehler“ bedeutet) „- Der Text “ text „ wurde in der Ausgabe von file) nicht angezeigt.
  • Der True / False-Exit-Status von grep wird von sh an find weitergeleitet und fungiert als Endergebnis des Ganzen „-exec sh -c "file $0 | grep -q text" {} \;“ Test.
  • Falls der obige Test true zurückgibt, wird die -print Befehl wird ausgeführt (dh der Name der getesteten Datei wird gedruckt).
  • Antwort

    bandit4@bandit:~$ ls inhere bandit4@bandit:~$ file inhere/* inhere/-file00: data inhere/-file01: data inhere/-file02: data inhere/-file03: data inhere/-file04: data inhere/-file05: data inhere/-file06: data inhere/-file07: ASCII text inhere/-file08: data inhere/-file09: data bandit4@bandit:~$ pwd /home/bandit4 bandit4@bandit:~$ cat /home/bandit4/inhere/-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh bandit4@bandit:~$ 

    Kommentare

    • Verwenden Sie einfach die Dateien inhere / * und cat / home / bandit4 / inhere / -file07

    Antwort

    find -type f ! -executable -size 1033c 

    Sie erhalten die Datei aus der Übung

    Antwort

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

    Fan eines Liners

    Antwort

    Ich denke, der längere Weg, das Passwort für diese Banditenstufe zu finden, der von den meisten oben mit find und grep erwähnt wurde, ist der aussagekräftigste Befehl.

    find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

    Nachdem ich den Befehl „file“ mehr verwendet hatte, wurde mir klar, dass es ziemlich einfach ist, lesbare Dateien (in dieser Ebene auch als ASCII bezeichnet) auf diese Weise zu finden, indem ich die Dateitypen eines ganzen Verzeichnisses überprüfe.Das Inhere-Verzeichnis enthält Dateien mit dem Namen „-filexx“ oder überprüfen Sie schnell das gesamte Inhere-Verzeichnis mit file ./*

    Hier war mein Ansatz.

    bandit4@bandit:~/inhere$ file ./* ./-file00: data ./-file01: data ./-file02: data ./-file03: data ./-file04: data ./-file05: data ./-file06: data ./-file07: ASCII text ./-file08: data ./-file09: data bandit4@bandit:~/inhere$ cat ./-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh 

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.