Megpróbálok hatékony módszert találni a OverTheWire bandita kihívás .

Egyébként van egy csomó fájlom, és csak egy van, amely betartja a következő feltételeket:

  • ember által olvasható
  • 1033 bájt méretű
  • Nem futtatható

Jelenleg a find parancsot használom , és meg tudom találni a fájlokat, amelyek megfelelnek a 2 utolsó feltételnek:

find . -size 1033c ! -executable 

Azonban nem tudom, hogyan különítsem el az ember által nem olvasható fájlokat A kihívásra talált megoldások a -readable tesztparamétert használják, de szerintem ez nem működik. A -readable csak a fájlok engedélyeit nézi, a tartalmát nem, míg a kihívás leírása ASCII fájlt vagy hasonlót kér.

Megjegyzések

  • Hogyan definiálja az ember által olvashatót? Nem bináris?
  • a fájlparancs a barátja 🙂
  • Esetleg a következő másolat: stackoverflow.com/questions/14505218/…
  • Az emberek az egyik legintelligensebb faj a földön. Ők ‘ is az egyetlen, aki ismeri a számítógépeket. Elolvashatja a legtöbb fájlt, feltéve, hogy megtudja a titkosított kulcs típusát és birtokában van.
  • SPOILER ALERT !!

Válasz

Igen, használhatja a find megfelelő méretű, nem futtatható fájlok megkereséséhez, majd a file segítségével ellenőrizze az ASCII-t. Valami hasonló:

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

A questi on azonban nem olyan egyszerű, mint amilyennek hangzik. Az “ember által olvasható” borzalmasan homályos kifejezés. Feltehetően szövegre gondolsz. OK, de milyen szöveg? Csak ASCII latin karakter? Teljes Unicode? Fontolja meg például ezt a három fájlt:

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

Ezek mind szöveges, mind emberi olvashatók. Most nézzük meg, mit csinál file belőlük:

$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable 

Tehát a parancs csak file1 -t fogja megtalálni (ennek a példának a kedvéért képzeljük el, hogy ezek a fájlok 1033 karakterből álltak). A find kiterjesztésével megkeresheti a text karakterláncot:

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

A -w szolgáltatással a grep csak azokat a sorokat fogja kinyomtatni, ahol text a önálló szó. Ennek nagyon közel kell lennie ahhoz, amit szeretne, de nem tudom garantálni, hogy nincs más fájltípus, amelynek leírásában szerepelhet a text karakterlánc is.

Válasz

Míg a -exec -et többnyire arra használják, hogy valamit csináljanak a fájlokkal, ahol megtalálható, tesztként is működhet. Ezért hozzáadhatjuk a többi feltételhez:

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

Ne feledje, grep nem nulla értéket ad vissza, ha a mintát nem találták, és a sh -c "COMMAND" visszaadja az értékelés eredményét (mindaddig, amíg érvényes). csak olyan fájlokat nyomtasson, ahol file <filename> köp valamit, ami text végződik, pl. “UTF-8 Unicode text” vagy “ASCII text”, de nem “Nem ISO kiterjesztett ASCII szöveg, menekülési szekvenciákkal”.

Egy sorban rövidebb is, mint xargs:

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

Tartsa i Ne feledje, hogy a sh -c "file {} | grep "text$"" tetszőleges parancsra cserélhető. Ha valami nagyon összetettet szeretne ellenőrizni, érdemesebb egy shell parancsfájlt megadni, és ezt használni:

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

amely hosszú távon futni, könnyebben fenntartható, mint a shell előzményei:

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

megjegyzések

  • Szép! Ne feledje azonban, hogy a text$ megfeleltetése kizárja a shell parancsfájlként elismert dolgokat. Bármi, ami shebanggal rendelkezik, szkriptként azonosul, és ezek tökéletesen olvashatók az ember számára. @terdon igaz, de a szkriptek hajlamosak futtathatóra: D. Mindazonáltal egy megfelelő szkriptnek fel kell ismernie a PDF-eket is. De másfelől vajon az emberi képeket tartalmazó PDF olvasható ? olvasható szöveg? Valószínűleg. Azt hiszem, egy teljes teszt… kihívást jelent.

Válasz

Csak a következőket kell használnia:

find inhere -size 1033c 

Ez adja meg az egyetlen fájlt, amely tartalmazza a jelszót.

Megjegyzések

  • miért ad vissza az + 1033c több fájlt? ez olyan, mint egy nagyobb vagy egyenlő jel-?

Válasz

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

Válasz

Csak a következőt futtassa a könyvtár tartalmához:

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

Válasz

Csak 1 fájl van 1033 méretű bájttal.

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

Miért 1033c és nem 1033? Ellenőrizze a man oldalt

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

Ellenőrizze a ls -l és a file paranccsal, és megkapja a választ.

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. ember által olvasható (ASCII text)
  2. 1033 bájt méretű (ls -l output)
  3. nem futtatható (-rw-r-----)

Válasz

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

Kérjük, próbálja ki ezeket a kombinált parancsokat. az állomásomon működik.

Válasz

Ezt kipróbálhatja

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

A kihívás nem engedi meg a grep parancsot. a jelszófájl “ASCII szövegként, nagyon hosszú sorokkal” lesz jelentve

Válasz

A ember által olvasható fájlnevek, használhatja a [:print:] ( nyomtatható ) karakterosztályt név. Az ilyen osztályokról a grep kézikönyvében talál további információt.

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

Egyetlen gondolattal , az “ember által olvasható” követelmény a fájl nevére hivatkozhat a fájl tartalmára. Más szavakkal, text fájlokra keresne. Ez egy kicsit bonyolultabb. Ahogy @ D_Bye egy megjegyzésben javasolta, majd a file paranccsal meg kell határoznia a fájltartalom típusát. De nem lenne jó ötlet futtatni a file egy pipa után, mert ez bonyolítja a fájl nevének megjelenítését. Ezt javaslom:

find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print 

A file -rész röviden így működik:

  • A -exec predikátum végrehajtja a sh -c "file -b $0 | grep -q text" FILENAME minden FILENAME esetén, amely megfelel az összes előző feltételnek (típus, méret, nem futtatható).
  • Az egyes fájlok mindegyikéhez , egy shell (sh) futtatja ezt a rövid parancsfájlt : file -b $0 | grep -q text, a $0 helyébe a fájlnév lép.
  • A program meghatározza az egyes fájlok tartalmi típusát és kiadja ezeket az információkat. A -b opció megakadályozza a minden tesztelt fájl neve.
  • grep szűrők a kimenet

program, “text” t tartalmazó sorok keresése. (Nézze meg saját maga, hogy néz ki afileparancs tipikus kimenete.)

  • De a grep nem adja ki a szűrt szöveget, mert megadja a -q (csendes) beállítást . Amit tesz, csak megváltoztatja kilépési állapotát 0 -re (ami “igaz” – a szűrt szöveget találtak) vagy 1-re (azaz “hiba”) “- a ” text “ szöveg nem jelent meg a file) kimenetéből.
  • Az igaz / hamis kilépési állapot A grep -et tovább továbbítja sh a find címre, és az egész végeredményeként működik. “-exec sh -c "file $0 | grep -q text" {} \;” teszt.
  • Abban az esetben, ha a fenti teszt true t adott vissza, a -print parancs végrehajtásra kerül (azaz a tesztelt fájl neve ki van nyomtatva).
  • Válasz

    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:~$ 

    Megjegyzések

    • Egyszerűen használja az inhere / * fájlt és a cat / home / bandit4 / inhere / -file07 fájlt

    Válasz

    find -type f ! -executable -size 1033c 

    megszerzi a fájlt a gyakorlatból

    Válasz

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

    Egy bélés rajongója

    Válasz

    Úgy gondolom, hogy ennek a bandita szintnek a jelszavának megtalálásának hosszabb módja, amelyet fentebb említettem a find és a grep használatával, a legjellemzőbb parancs.

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

    De miután jobban használtam a “file” parancsot, rájöttem, hogy az ember által olvasható fájlokat (más néven ezen a szinten ASCII) ilyen módon egyszerűen megkeresni egy könyvtárak teljes fájltípusainak ellenőrzésével.Az inhere könyvtár a “-filexx” nevű fájlokat tárolja, vagy gyorsan ellenőrizheti a teljes inhere könyvtárat a file ./*

    Itt volt az én megközelítésem.

    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 

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük