Snažím se najít efektivní způsob, jak udělat úroveň 5 úrovně Výzva banditů OverTheWire .
Každopádně mám spoustu souborů a existuje pouze jeden, který splňuje následující kritéria:
- Člověk čitelný
- 1033 bajtů o velikosti
- nespustitelné
právě teď používám příkaz find
a jsem schopen najít soubory vyhovující 2 posledním kritériím:
find . -size 1033c ! -executable
Nicméně nevím, jak vyloučit soubory, které nelze číst člověku Řešení, která jsem pro tuto výzvu našel, používají testovací parametr -readable
, ale nemyslím si, že to funguje. -readable
se dívá pouze na oprávnění souborů, nikoli na jeho obsah, zatímco v popisu výzvy je vyžadován soubor ASCII nebo něco podobného.
Komentáře
- Jak definujete čitelnost pro člověka? Není binární?
- příkaz souboru je váš přítel 🙂
- Možná duplikát: stackoverflow.com/questions/14505218/…
- lidé jsou jedním z nejinteligentnějších známých druhů na Zemi. Jsou ‚ také jediní, o nichž je známo, že se vyznají v počítačích. Dokážou přečíst většinu souborů za předpokladu, že zjistí typ a uloží šifrovací klíče pro šifrovaný.
- SPOILER ALERT !!
Answer
Ano, můžete použít find
vyhledejte nespustitelné soubory správné velikosti a pomocí file
zkontrolujte ASCII. Něco jako:
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Úkol ale není to tak jednoduché, jak to zní. „Člověk čitelný“ je strašně vágní výraz. Pravděpodobně máte na mysli text. Dobře, ale jaký text? Pouze latinka ASCII? Úplný Unicode? Zvažte například tyto tři soubory:
$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo
Jedná se o všechny čitelné texty i texty. Nyní se podívejme, co z nich file
dělá:
$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable
Takže najde pouze file1
(pro tento příklad si představme, že tyto soubory měly 1033 znaků). Můžete rozšířit find
a vyhledat řetězec text
:
find . -type f -size 1033c ! -executable -exec file {} + | grep -w text
S -w
bude grep
tisknout pouze řádky, kde text
je nalezen jako samostatné slovo. To by mělo být docela podobné tomu, co chcete, ale nemohu zaručit, že neexistuje žádný jiný typ souboru, jehož popis by mohl zahrnovat i řetězec text
.
Odpověď
Zatímco -exec
se většinou používá k tomu, aby se soubory, které kde je nalezen, může také sloužit jako test. Proto jej můžeme přidat k dalším kritériím:
find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \;
Nezapomeňte, grep
vrací nenulovou hodnotu, když vzor nebyl nalezen, a sh -c "COMMAND"
vrátí výsledek hodnocení (pokud je platný). Bude tedy tisknout pouze soubory, kde file <filename>
vyplivne něco, co končí text
, např. „UTF-8 Unicode text“ nebo „ASCII text“, ale ne „Non-ISO extended-ASCII text, with escape sequence“.
V jednom řádku to dokonce skončí kratší než přejít xargs
:
find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \;
Ponechat i Nezapomeňte, že sh -c "file {} | grep "text$""
můžete nahradit libovolným vlastním příkazem. Pokud chcete zkontrolovat něco velmi složitého, může být lepší poskytnout skript prostředí Shell a použít jej místo toho:
find . -size 1033c -not -executable -exec is_human_readable.sh {} \;
který z dlouhodobého hlediska běh, je snadnější udržovat než historie vašeho shellu:
#!/bin/sh file "$@" | grep "text$" > /dev/null
Komentáře
- Hezké! Pamatujte však, že shoda
text$
vyloučí věci rozpoznané jako shell skripty. Cokoli se shebangem je označeno jako skript a ty jsou dokonale čitelné člověkem. - @terdon true, ale skripty mají tendenci být spustitelné: D. Řešením je, že správný skript by měl také rozpoznávat soubory PDF. Ale na druhé straně, je PDF obsahující obrázek čitelný ? Je PNG nějakého textu čitelný ? Pravděpodobně. Myslím, že kompletní test bude… náročný.
Odpovědět
Musíte použít pouze:
find inhere -size 1033c
Získáte jediný soubor, který obsahuje heslo.
Komentáře
- proč + 1033c vrací více souborů? je to jako znaménko větší nebo rovno?
Odpověď
find . -size 1033c ! -executable -exec file {} +
Odpověď
Spustit proti obsahu adresáře následující:
$ 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>
Odpovědět
Existuje pouze 1 soubor o velikosti 1033
bajtů.
bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$
Proč 1033c
a ne 1033
? Podívejte se na man
stránku
-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)
Ověřte to pomocí příkazů ls -l
a file
a získáte veškerou odpověď.
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:~$
- čitelné pro člověka (
ASCII text
) - 1033 bajtů (také v
ls -l
výstup) - nelze spustit (
-rw-r-----
)
Odpověď
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}"
Zkuste prosím tyto kombinované příkazy. funguje to na mé stanici.
Odpověď
Můžete to zkusit
find . -size 1033c ! -executable -exec file {} +
Vaše výzva neumožňuje grep
. soubor hesla bude hlášen jako „text ASCII s velmi dlouhými řádky“
odpověď
k odfiltrování člověkem čitelné názvy souborů, můžete využít [:print:]
( tisknutelné ) třídy znaků jméno. Více o těchto třídách najdete v příručce pro grep
.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Na druhé zamyšlení , požadavek „čitelný člověkem“ může odkazovat na obsah souboru místo na jeho název. Jinými slovy byste hledali textové soubory. To je trochu složitější. Jako @ D_Bye navrhl v komentáři, pak byste měli použít příkaz file
k určení typu obsahu souboru. Nebylo by ale dobrý nápad spustit file
po kanálu, protože by to zkomplikovalo zobrazování názvu souboru. Navrhuji toto:
find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print
Takto krátce funguje file
-part:
-
-exec
predikát provedesh -c "file -b $0 | grep -q text" FILENAME
pro každýFILENAME
splňující všechny předchozí podmínky (typ, velikost, nespustitelný). - Pro každý z těchto souborů , shell (
sh
) spustí tento krátký skript :file -b $0 | grep -q text
nahrazující$0
názvem souboru. -
file
program určuje typ obsahu každého souboru a vydává tyto informace. Možnost-b
znemožňuje tisk název každého testovaného souboru. -
grep
filtry výstup z
program, který hledá řádky obsahující „text“ . (Podívejte se, jak vypadá typický výstup příkazufile
.)
grep
ne vypíše filtrovaný text, protože má -q
(tichou) možnost . Co dělá, je jen změnit jeho stav ukončení na 0
(což představuje „true“ – byl nalezen filtrovaný text) nebo 1 (což znamená „chyba“ „- text “ text „ se ve výstupu z file
) neobjevil. grep
je předán dále sh
do find
a působí jako konečný výsledek celku „-exec sh -c "file $0 | grep -q text" {} \;
“ test. -print
je spuštěn příkaz (tj. je vytištěn název testovaného souboru). Odpověď
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:~$
Komentáře
- Jednoduše použijte soubor inhere / * a cat / home / bandit4 / inhere / -file07
Odpověď
find -type f ! -executable -size 1033c
dostanete soubor z cvičení
Odpověď
find . -type f -size 1033c ! -executable | xargs file | grep text
Fanoušek jedné linky
Odpovědět
Myslím, že nejpopisnějším příkazem je delší způsob hledání hesla pro tuto úroveň banditů, o kterém se zmiňuje většina výše, pomocí find a grep.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Ale po použití příkazu „file“ jsem si více uvědomil, že je docela snadné najít soubory čitelné člověkem (na této úrovni také ASCII) tak, že zkontroluji celé typy souborů adresářů.Adresář inhere obsahuje soubory s názvem „-filexx“ nebo rychle zkontrolovat celý adresář inhere pomocí file ./*
Zde byl můj přístup.
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