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:~$
- lesbar (
ASCII text
) - 1033 Byte (auch in
ls -l
Ausgabe) - 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ührtsh -c "file -b $0 | grep -q text" FILENAME
für jedeFILENAME
, 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 Befehlsfile
aussieht.)
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. grep
wird von sh
an find
weitergeleitet und fungiert als Endergebnis des Ganzen „-exec sh -c "file $0 | grep -q text" {} \;
“ Test. -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