Jeg prøver å finne en effektiv måte å gjøre nivå 5 av OverTheWire-bandittutfordring .

Uansett har jeg en haug med filer, og det er bare en som respekterer følgende kriterier:

  • Menneskelig lesbar
  • 1033 byte i størrelse
  • Ikke-kjørbar

Akkurat nå bruker jeg kommandoen find , og jeg kan finne filene som samsvarer med de to siste kriteriene:

find . -size 1033c ! -executable 

Jeg vet imidlertid ikke hvordan jeg skal utelukke filer som ikke kan leses av mennesker Løsninger jeg fant for den utfordringen bruker testparameteren -readable, men jeg tror ikke dette fungerer. -readable ser bare på tillatelsene til filene, og ikke på innholdet, mens beskrivelsen av utfordringen ber om en ASCII-fil eller noe sånt.

Kommentarer

  • Hvordan definerer du menneskelig lesbar? Ikke binær?
  • filkommandoen er vennen din 🙂
  • Kanskje duplikat av: stackoverflow.com/questions/14505218/…
  • Mennesker er en av de mest intelligente kjente artene på jorden. De ‘ er også den eneste som er kjent med datamaskiner. De kan lese de fleste filer forutsatt at de kan finne ut typen og få tak i krypteringsnøklene for kryptert.
  • SPOILER ALERT !!

Svar

Ja, du kan bruke find for å se etter filer som ikke kan kjøres i riktig størrelse, og bruk deretter file for å se etter ASCII. Noe som:

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

Questi på er imidlertid ikke så enkelt som det høres ut. «Menneskelig lesbar» er et fryktelig vag begrep. Antagelig mener du tekst. OK, men hva slags tekst? Latinsk karakter bare ASCII? Full Unicode? Tenk for eksempel på disse tre filene:

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

Alt dette er tekst og leselig for mennesker. La oss se hva file gjør av 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 finner bare file1 (av hensyn til dette eksemplet, la oss forestille oss at filene hadde 1033 tegn). Du kan utvide find for å se etter strengen text:

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

Med -w vil grep bare skrive ut linjer der text et frittstående ord. At skal være ganske nær det du vil ha, men jeg kan ikke garantere at det ikke er noen annen filtype hvis beskrivelse også kan inneholde strengen text.

Svar

Mens -exec mest brukes til å gjøre noe med filene som der den finnes, kan den også fungere som en test. Derfor kan vi legge den til dine andre kriterier:

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

Husk, grep returnerer ikke-null når mønsteret ikke ble funnet, og sh -c "COMMAND" vil returnere resultatet av evalueringen (så lenge den er gyldig). Så dette vil bare skrive ut filer der file <filename> spytter noe ut som ender med text, f.eks. «UTF-8 Unicode-tekst» eller «ASCII-tekst», men ikke «Ikke-ISO utvidet ASCII-tekst, med escape-sekvenser».

I en enkelt linje ender den til og med kortere enn å gå over xargs:

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

Hold i Husk at du kan erstatte sh -c "file {} | grep "text$"" med en hvilken som helst tilpasset kommando. Hvis du vil se etter noe veldig komplisert, kan det være bedre å gi et skallskript og bruke det i stedet:

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

som på lang sikt kjøre, er lettere å vedlikeholde enn shell-historikken din:

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

Kommentarer

  • Fint! Vær imidlertid oppmerksom på at samsvarende text$ vil ekskludere ting som er gjenkjent som skallskript. Alt med en shebang er identifisert som et skript, og de er fullstendig lesbare for mennesker.
  • @terdon sant, men skript har en tendens til å være kjørbare: D. Når det er sagt, skal et riktig skript også gjenkjenne PDF-filer. Men på den annen side, er en PDF som inneholder et menneskelig bilde lesbart ? Er en PNG av en eller annen tekst lesbar ? Sannsynligvis. Jeg antar at en fullstendig test vil være … utfordrende.

Svar

Du trenger bare å bruke:

find inhere -size 1033c 

Det vil gi deg den eneste filen som inneholder passordet.

Kommentarer

  • hvorfor returnerer + 1033c flere filer? er det som et større-eller-lik-tegn-?

Svar

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

Svar

Bare kjør følgende mot innholdet i katalogen:

$ 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

Det er bare 1 fil med 1033 størrelser.

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

Hvorfor 1033c og ikke 1033? Sjekk man siden

 -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) 

Bekreft det med kommandoen ls -l og file, 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. lesbar for mennesker (ASCII text)
  2. 1033 byte i størrelse (Også i ls -l utdata)
  3. ikke kjørbar (-rw-r-----)

Svar

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

Prøv disse kombinerte kommandoene. det fungerer på stasjonen min.

Svar

Du kan prøve dette

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

Utfordringen din tillater ikke grep. passordfil vil bli rapportert som «ASCII-tekst, med veldig lange linjer»

Svar

For å filtrere ut menneskelesbare filnavn, kan du bruke [:print:] ( utskrivbar ) tegnklasse navn. Du finner mer om slike klasser i håndboken for grep.

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

På en annen tanke , kan det «menneskelesbare» kravet referere til filens innhold i stedet for navnet. Med andre ord vil du søke etter tekst filer. Det er litt vanskeligere. Som @ D_Bye foreslått i en kommentar, bør du bruke kommandoen file for å bestemme filinnholdstypen. Men det vil ikke være lurt å kjøre file etter et rør, fordi det ville komplisere oppgaven med å vise filens navn. Her er hva 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 utfører sh -c "file -b $0 | grep -q text" FILENAME for hver FILENAME som tilfredsstiller alle tidligere betingelser (type, størrelse, ikke-kjørbar).
  • For hver av disse filene , et skall (sh) kjører dette korte skript : file -b $0 | grep -q text, erstatter $0 med filnavnet.
  • file -programmet bestemmer innholdstypen for hver fil og sender ut denne informasjonen. Alternativet -b forhindrer utskrift navnet på hver testet fil.
  • grep filtre produksjonen kommer fra

program, søker etter linjer som inneholder «tekst» . (Se selv hvordan en typisk utgang avfile-kommandoen ser ut.)

  • Men grep send ut den filtrerte teksten, fordi den har -q (stille) alternativet gitt . Det den gjør, er bare å endre exit status til enten 0 (som representerer «true» – den filtrerte teksten ble funnet) eller 1 (som betyr «feil «- teksten » tekst « dukket ikke opp i utdata fra file).
  • Den sanne / falske utgangsstatusen kommer fra grep sendes videre av sh til find og fungerer som det endelige resultatet av helheten «-exec sh -c "file $0 | grep -q text" {} \;» test.
  • Hvis testen ovenfor returnerte true , -print kommandoen kjøres (dvs. navnet på den testede filen skrives ut).
  • 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

    • Bare bruk filen inhere / * og cat / home / bandit4 / inhere / -file07

    Svar

    find -type f ! -executable -size 1033c 

    gir deg filen fra øvelsen

    Svar

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

    Vifte av én liners

    Svar

    Jeg tror den lengre måten å finne passordet for dette bandittnivået som er nevnt av de fleste ovenfor ved hjelp av find og grep, er den mest beskrivende kommandoen.

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

    Men etter å ha brukt «file» -kommandoen mer, skjønte jeg at det er ganske enkelt å finne menneskelesbare filer (også kalt ASCII på dette nivået) på denne måten ved å sjekke hele filtypene i katalogene.Inhere-katalogen inneholder filer med navnet «-filexx» eller sjekk raskt hele inhere-katalogen med file ./*

    Her var min tilnærming.

    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 

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *