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 

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:~$ 
  1. menneskelig læsbar (ASCII text)
  2. 1033 bytes i størrelse (Også i ls -l output)
  3. 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ører sh -c "file -b $0 | grep -q text" FILENAME for hver FILENAME, 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.)

  • Men 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).
  • Den sande / falske udgangsstatus kommer fra grep sendes videre af sh til find og fungerer som det endelige resultat af hele “-exec sh -c "file $0 | grep -q text" {} \;” test.
  • Hvis ovenstående test returnerede true , -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 

    Skriv et svar

    Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *