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:~$ 
  1. ihmisen luettavissa (ASCII text)
  2. 1033 tavua (myös ls -l ulostulo)
  3. 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 suorittaa sh -c "file -b $0 | grep -q text" FILENAME jokaiselle FILENAME, 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 komennonfiletulos näyttää.)

  • Mutta 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).
  • Todellinen / väärä poistumistila tulee grep välitetään sh eteenpäin find ja toimii kokonaisuuden lopputuloksena ”-exec sh -c "file $0 | grep -q text" {} \;” -testi.
  • Jos yllä oleva testi palautti true , -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 

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *