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:~$
- ember által olvasható (
ASCII text
) - 1033 bájt méretű (
ls -l
output) - 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 ash -c "file -b $0 | grep -q text" FILENAME
mindenFILENAME
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 afile
parancs tipikus kimenete.)
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. 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. -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