Yritän löytää tehokas tapa suorittaa taso 5 OverTheWire-bandiittihaaste .
Minulla on joka tapauksessa joukko tiedostoja, ja vain yksi noudattaa seuraavia ehtoja:
- Ihmisen luettavissa
- 1033 tavua kooltaan
- Ei suoritettavissa
Käytän tällä hetkellä komentoa find
, ja löydän tiedostot, jotka vastaavat kahta viimeistä ehtoa:
find . -size 1033c ! -executable
En kuitenkaan tiedä, kuinka erotella ei-luettavia tiedostoja Ratkaisut, jotka löysin haastetta varten, käyttävät -readable
-testiparametriä, mutta en usko, että tämä toimii. -readable
tarkastelee vain tiedostojen käyttöoikeuksia eikä sen sisältöä, kun taas haasteen kuvauksessa pyydetään ASCII-tiedostoa tai vastaavaa.
Kommentit
- Kuinka määrität ihmisen luettavan? Ei binaarista?
- tiedostokomento on ystäväsi 🙂
- Ehkä kopio: stackoverflow.com/questions/14505218/…
- Ihmiset ovat älykkäimpiä lajeja maan päällä. He ’ ovat myös ainoa, jonka tietävät tietokoneet. He voivat lukea suurimman osan tiedostoista edellyttäen, että he saavat selville salatun avaimen tyypin ja pitävät sitä salassa.
- SPOILER ALERT !!
Vastaa
Kyllä, voit käyttää find
etsimään oikean kokoisia ei-suoritettavia tiedostoja ja tarkista sitten file
tarkistaaksesi ASCII: n. Jotain:
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Kysely päällä, ei kuitenkaan ole niin yksinkertainen kuin miltä se kuulostaa. ”Ihmisen luettavissa” on hirvittävän epämääräinen termi. Oletettavasti tarkoitat tekstiä. OK, mutta millaista tekstiä? Ainoastaan latinalaismerkki ASCII? Täysi Unicode? Harkitse esimerkiksi näitä kolmea tiedostoa:
$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo
Nämä kaikki ovat tekstiä ja luettavissa ihmisille. Katsotaan nyt, mitä file
tekee niistä:
$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable
Joten, -komento löytää vain file1
(kuvitellaan tämän esimerkin vuoksi, että tiedostoissa on 1033 merkkiä). Voit laajentaa find
etsiäksesi merkkijonoa text
:
find . -type f -size 1033c ! -executable -exec file {} + | grep -w text
Kun -w
, grep
tulostaa vain rivejä, joissa text
on itsenäinen sana. Sen pitäisi olla melko lähellä haluamaasi, mutta en voi taata, että ei ole muuta tiedostotyyppiä, jonka kuvauksessa saattaa olla myös merkkijono text
.
vastaus
Vaikka -exec
käytetään enimmäkseen tekemään jotain tiedostojen kanssa mistä se löytyy, se voi toimia myös testinä. Siksi voimme lisätä sen muihin ehtoihisi:
find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \;
Muista, grep
palauttaa nollasta poikkeavan, kun mallia ei löydy, ja sh -c "COMMAND"
palauttaa arvioinnin tuloksen (niin kauan kuin se on kelvollinen). tulosta vain tiedostot, joissa file <filename>
sylkee jotain, joka päättyy text
, esimerkiksi ”UTF-8 Unicode-teksti” tai ”ASCII-teksti”, mutta ei ”Ei-ISO-laajennettu ASCII-teksti, jossa on pakosarjat”.
Yhdellä rivillä se on jopa lyhyempi kuin xargs
:
find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \;
Säilytä i Huomaa, että voit korvata sh -c "file {} | grep "text$""
millä tahansa mukautetulla komennolla. Jos haluat tarkistaa jotain hyvin monimutkaista, saattaa olla parempi idea antaa komentosarjakomentosarja ja käyttää sitä sen sijaan:
find . -size 1033c -not -executable -exec is_human_readable.sh {} \;
joka pitkällä aikavälillä Suorita, on helpompi ylläpitää kuin shellisi historia:
#!/bin/sh file "$@" | grep "text$" > /dev/null
Kommentit
- Hienoa! Huomaa kuitenkin, että
text$
-sovelluksen sulkeminen sulkee pois shell-skripteinä tunnistetut asiat. Kaikki, jolla on shebang, tunnistetaan skriptinä, ja ne ovat täysin ihmisten luettavia. @terdon totta, mutta komentosarjat ovat yleensä suoritettavia: D. Tästä huolimatta oikean komentosarjan tulisi tunnistaa myös PDF-tiedostot. Mutta toisaalta, onko PDF-tiedosto, joka sisältää ihmisen kuvan, luettavissa ? Onko PNG jonkin verran tekstiä luettavissa ? Luultavasti. Luulen, että täydellinen testi on… haastava.
Vastaa
Sinun tarvitsee käyttää vain:
find inhere -size 1033c
Se antaa sinulle ainoan salasanan sisältävän tiedoston.
Kommentit
- miksi + 1033c palauttaa enemmän tiedostoja? onko se kuin isompi tai yhtäsuuri merkki?
Vastaa
find . -size 1033c ! -executable -exec file {} +
Vastaa
Suorita vain seuraava hakemiston sisältöä vastaan:
$ 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>
Vastaa
On vain yksi tiedosto, jonka koko on 1033
tavua.
bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$
Miksi 1033c
eikä 1033
? Tarkista man
-sivu
-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)
Vahvista se komennoilla ls -l
ja file
, ja saat kaiken vastauksen.
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:~$
- ihmisen luettavissa (
ASCII text
) - 1033 tavua (myös
ls -l
ulostulo) - ei suoritettavissa (
-rw-r-----
)
Vastaa
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}"
Kokeile näitä yhdistettyjä komentoja. se toimii asemallani.
Vastaa
Voit kokeilla tätä
find . -size 1033c ! -executable -exec file {} +
Haastesi ei salli grep
. salasanatiedosto raportoidaan ”ASCII-tekstinä, erittäin pitkillä viivoilla”
vastaus
ihmisen luettavien tiedostojen nimiä, voit käyttää [:print:]
( tulostettava ) merkkiluokkaa nimi. Löydät lisää tällaisista luokista grep
-oppaasta.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Toinen ajatus , ”ihmisen luettavissa” -vaatimus saattaa viitata tiedoston sisältöön sen nimen sijaan. Toisin sanoen etsit teksti -tiedostoja. Se on vähän hankalampaa. Kuten @ D_Bye ehdotti kommentissa, että sinun pitäisi sitten käyttää file
-komentoa tiedoston sisältötyypin määrittämiseen. Mutta ei olisi hyvä ajatus suorittaa file
putken jälkeen, koska se vaikeuttaisi tiedoston nimen näyttämistä. Tässä ehdotan:
find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print
Näin file
-osa toimii lyhyesti:
-
-exec
predikaatti suorittaash -c "file -b $0 | grep -q text" FILENAME
jokaiselleFILENAME
, joka täyttää kaikki edelliset ehdot (tyyppi, koko, ei-suoritettava). - Jokaiselle kyseiselle tiedostolle , shell (
sh
) suorittaa tämän lyhyen komentosarjan :file -b $0 | grep -q text
, korvaamalla$0
tiedostonimellä. -
file
ohjelma määrittää kunkin tiedoston sisältötyypin ja antaa nämä tiedot.-b
-vaihtoehto estää tulostuksen kunkin testatun tiedoston nimi. -
grep
suodattimet lähtö
-ohjelma etsii rivejä, jotka sisältävät ”teksti” . (Katso itse, miltä tyypillinen komennonfile
tulos näyttää.)
grep
ei tulosta suodatettu teksti, koska sille on annettu vaihtoehto -q
(hiljainen) . Mitä se tekee, on vain muuttaa sen poistumistila joko 0
(joka edustaa ”true” – suodatettu teksti löydettiin) tai 1 (mikä tarkoittaa ”virhettä”) ”- teksti ” text ” ei ilmestynyt lähteestä file
). grep
välitetään sh
eteenpäin find
ja toimii kokonaisuuden lopputuloksena ”-exec sh -c "file $0 | grep -q text" {} \;
” -testi. -print
-komento suoritetaan (ts. testatun tiedoston nimi tulostetaan). Vastaa
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:~$
Kommentit
- Käytä yksinkertaisesti tiedostoa inhere / * ja cat / home / bandit4 / inhere / -file07
vastaus
find -type f ! -executable -size 1033c
saa tiedoston harjoituksesta
Vastaa
find . -type f -size 1033c ! -executable | xargs file | grep text
Yhden linjan tuuletin
Vastaa
Luulen, että useimmat yllä mainituista pidemmistä tavoista löytää salasana tälle rosvotasolle Find and grep -toiminnon avulla on kuvailevin komento.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Mutta kun olin käyttänyt ”tiedosto” -komentoa enemmän, tajusin, että ihmislukuisten tiedostojen (eli ASCII tällä tasolla) löytäminen on melko helppoa tällä tavoin tarkistamalla kokonaiset hakemistotiedostotyypit.Inhere-hakemistossa on tiedostoja, joiden nimi on ”-filexx”, tai tarkista koko inhere-hakemisto nopeasti file ./*
Tässä oli minun lähestymistapani.
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