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:~$
- lesbar for mennesker (
ASCII text
) - 1033 byte i størrelse (Også i
ls -l
utdata) - 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ørersh -c "file -b $0 | grep -q text" FILENAME
for hverFILENAME
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.)
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
). grep
sendes videre av sh
til find
og fungerer som det endelige resultatet av helheten «-exec sh -c "file $0 | grep -q text" {} \;
» test. -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