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:~$ 
  1. čitelné pro člověka (ASCII text)
  2. 1033 bajtů (také v ls -l výstup)
  3. 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 provede sh -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.)

  • Ale 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.
  • Stav ukončení / odchodu vycházející z 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.
  • V případě, že výše uvedený test vrátil true , -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 

    Napsat komentář

    Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *