Jeg forsøger at finde en effektiv måde at udføre niveau 5 af OverTheWire-banditudfordring .
Under alle omstændigheder har jeg en masse filer, og der er kun én, der respekterer følgende kriterier:
- Menneskelig læsbar
- 1033 byte i størrelse
- Ikke-eksekverbar
Lige nu bruger jeg kommandoen find
, og jeg er i stand til at finde filerne, der matcher de sidste to kriterier:
find . -size 1033c ! -executable
Jeg ved dog ikke, hvordan man ekskluderer filer, der ikke kan læses af mennesker Løsninger, jeg fandt til denne udfordring, brug testparameteren -readable
, men jeg tror ikke, det fungerer. -readable
ser kun på filernes tilladelser og ikke på dens indhold, mens udfordringsbeskrivelsen beder om en ASCII-fil eller lignende.
Kommentarer
- Hvordan definerer du menneskelig læsbar? Ikke binær?
- filkommando er din ven 🙂
- Måske duplikat af: stackoverflow.com/questions/14505218/…
- Mennesker er en af de mest intelligente kendte arter på jorden. De ‘ er også den eneste, man kender computere. De kan læse de fleste filer, forudsat at de kan finde ud af typen og få fat i krypteringsnøglerne til den krypterede.
- SPOILER ALERT !!
Svar
Ja, du kan bruge find
for at kigge efter ikke-eksekverbare filer i den rigtige størrelse og brug derefter file
for at kontrollere ASCII. Noget som:
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Questi tændt er det dog ikke så simpelt som det lyder. “Menneskelig læsbar” er en frygtelig vag betegnelse. Formentlig mener du tekst. OK, men hvilken slags tekst? Latinsk karakter kun ASCII? Fuld Unicode? Overvej f.eks. Disse tre filer:
$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo
Disse er alle tekst og menneskelige læsbare. Lad os nu se, hvad file
laver af dem:
$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable
Så find
-kommandoen ovenfor finder kun file1
(af hensyn til dette eksempel, lad os forestille os, at disse filer havde 1033 tegn). Du kan udvide find
for at se efter strengen text
:
find . -type f -size 1033c ! -executable -exec file {} + | grep -w text
Med -w
vil grep
kun udskrive linjer, hvor text
findes som et enkeltstående ord. At skal være temmelig tæt på, hvad du vil, men jeg kan ikke garantere, at der ikke er nogen anden filtype, hvis beskrivelse muligvis også inkluderer strengen text
.
Svar
Mens -exec
oftest bruges til at gøre noget med de filer, der hvor den findes, kan den også fungere som en test. Derfor kan vi tilføje den til dine andre kriterier:
find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \;
Husk, grep
returnerer ikke-nul, når mønsteret ikke blev fundet, og sh -c "COMMAND"
returnerer resultatet af evalueringen (så længe den er gyldig). Så dette vil kun udskrive filer, hvor file <filename>
spytter noget ud, der ender med text
, f.eks. “UTF-8 Unicode-tekst” eller “ASCII-tekst”, men ikke “Ikke-ISO udvidet ASCII-tekst med escape-sekvenser”.
I en enkelt linje ender den endda kortere end at gå over xargs
:
find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \;
Hold i n husk at du kan erstatte sh -c "file {} | grep "text$""
med enhver brugerdefineret kommando. Hvis du vil kontrollere noget meget komplekst, kan det være en bedre idé at give et shell-script og bruge det i stedet:
find . -size 1033c -not -executable -exec is_human_readable.sh {} \;
som i det lange løb køre, er lettere at vedligeholde end din shell “s historie:
#!/bin/sh file "$@" | grep "text$" > /dev/null
Kommentarer
- Dejligt! Bemærk dog, at matchning af
text$
udelukker ting, der genkendes som shell-scripts. Alt med en shebang identificeres som et script, og de er fuldstændig menneskelige læsbare. - @terdon sandt, men scripts har tendens til at være eksekverbare: D. Når det er sagt, skal et ordentligt script også genkende PDF-filer. Men på den anden side er en PDF, der indeholder et billede menneskeligt læsbart af en eller anden tekst læsbar ? Sandsynligvis. Jeg antager, at en komplet test vil være … udfordrende.
Svar
Du skal kun bruge:
find inhere -size 1033c
Det giver dig den eneste fil, der indeholder adgangskoden.
Kommentarer
- hvorfor returnerer + 1033c flere filer? er det som et større-eller-lige tegn-?
Svar
find . -size 1033c ! -executable -exec file {} +
Svar
Kør bare følgende mod indholdet af biblioteket:
$ 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>
Svar
Der er kun 1 fil med 1033
størrelser.
bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$
Hvorfor 1033c
og ikke 1033
? Tjek man
side
-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)
Bekræft det med ls -l
og file
-kommandoen, og du får alt svaret.
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:~$
- menneskelig læsbar (
ASCII text
) - 1033 bytes i størrelse (Også i
ls -l
output) - ikke eksekverbar (
-rw-r-----
)
Svar
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}"
Prøv denne kombinerede kommando. det fungerer på min station.
Svar
Du kan prøve dette
find . -size 1033c ! -executable -exec file {} +
Din udfordring tillader ikke grep
. adgangskodefil rapporteres som “ASCII-tekst med meget lange linjer”
Svar
For at filtrere ud menneskelæsbare filnavne, du kan gøre brug af [:print:]
( printbar ) tegnklasse navn. Du finder mere om sådanne klasser i manualen til grep
.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
På en anden tanke , kan det “menneskeligt læsbare” krav referere til filens indhold i stedet for dets navn. Med andre ord vil du søge efter tekst filer. Det er lidt mere vanskeligt. Som @ D_Bye foreslået i en kommentar, skal du derefter bruge kommandoen file
til at bestemme filens indholdstype. Men det ville ikke være en god ide at køre file
efter et rør, fordi det ville komplicere opgaven med at vise filens navn. Her er hvad jeg foreslår:
find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print
Dette er kort hvordan file
-delen fungerer:
-
-exec
predikat udførersh -c "file -b $0 | grep -q text" FILENAME
for hverFILENAME
, der opfylder alle de tidligere betingelser (type, størrelse, ikke-eksekverbar). - For hver af disse filer , en shell (
sh
) kører dette korte script :file -b $0 | grep -q text
, der erstatter$0
med filnavnet. -
file
-programmet bestemmer indholdet af hver fil og sender disse oplysninger.-b
-indstillingen forhindrer udskrivning af navn på hver testet fil. -
grep
filtre output kommer fra
program, der søger efter linjer, der indeholder “tekst” . (Se selv, hvordan en typisk output affile
-kommandoen ser ud.)
grep
output den filtrerede tekst, fordi den har -q
(stille) mulighed givet . Hvad det gør, er bare at ændre dets exit-status til enten 0
(som repræsenterer “sand” – den filtrerede tekst blev fundet) eller 1 (hvilket betyder “fejl “- teksten ” tekst “ vises ikke i output fra file
). grep
sendes videre af sh
til find
og fungerer som det endelige resultat af hele “-exec sh -c "file $0 | grep -q text" {} \;
” test. -print
kommandoen udføres (dvs. navnet på den testede fil udskrives). Svar
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:~$
Kommentarer
- Brug bare filen inhere / * og cat / home / bandit4 / inhere / -file07
Svar
find -type f ! -executable -size 1033c
giver dig filen fra øvelsen
Svar
find . -type f -size 1033c ! -executable | xargs file | grep text
Fan af en liners
Svar
Jeg tror, at den længere måde at finde adgangskoden til dette banditniveau, der er nævnt af de fleste ovenfor ved hjælp af find og grep, er den mest beskrivende kommando.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Men efter at have brugt kommandoen “fil” mere indså jeg, at det er ret nemt at finde menneskelæsbare filer (også kaldet ASCII på dette niveau) på denne måde ved at kontrollere en hel filtypes kataloger.Inhere-kataloget indeholder filer med navnet “-filexx” eller tjek hurtigt hele inhere-kataloget med file ./*
Her var min tilgang.
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