Okunabilir dosyaları bulun


14

OverTheWire haydut meydan okuma seviye 5 yapmak için etkili bir yol bulmaya çalışıyorum .

Her neyse, bir sürü dosyam var ve aşağıdaki ölçütlere uyan sadece bir tane var:

  • İnsan okunabilir
  • 1033 bayt boyutunda
  • Sigara çalıştırılabilir

Şu anda, findkomutu kullanıyorum ve son 2 ölçütle eşleşen dosyaları bulabiliyorum:

find . -size 1033c ! -executable

Ancak, insan tarafından okunamayan dosyaları nasıl hariç tutacağımı bilmiyorum. Bu zorluk için bulduğum çözümler -readabletest parametresini kullanıyor, ancak bunun işe yaradığını düşünmüyorum. -readablemeydan okuma açıklaması bir ASCII dosyası veya bunun gibi bir şey isterken, sadece dosyaların izinlerine bakar, içeriğine bakmaz.


1
İnsan tarafından okunabilirliği nasıl tanımlıyorsunuz? İkili değil mi?
terdon

2
dosya komutu arkadaşın :)
Romeo Ninov


3
İnsanlar yeryüzünde bilinen en akıllı türlerden biridir. Ayrıca bilgisayarlarla bilgili olduğu bilinen tek kişi onlar. Şifrelenmiş olanın şifreleme anahtarlarının türünü bulup alabilmeleri koşuluyla çoğu dosyayı okuyabilirler.
Stéphane Chazelas

1
SPOİLER UYARISI!!
Dan Bolser

Yanıtlar:


17

Evet, finddoğru boyutta yürütülebilir olmayan dosyaları aramak için ve ardından fileASCII'yi denetlemek için kullanabilirsiniz . Gibi bir şey:

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

Ancak soru, göründüğü kadar basit değil. 'İnsan tarafından okunabilir' korkunç bir terimdir. Muhtemelen, metin demek istiyorsun. Tamam, ama ne tür bir metin? Yalnızca Latin karakteri ASCII? Tam Unicode? Örneğin, şu üç dosyayı göz önünde bulundurun:

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

Bunların hepsi metin ve insan tarafından okunabilir. Şimdi, fileonların ne yaptığını görelim :

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

Yani, findyukarıdaki komut sadece bulacaktır file1(bu örnek uğruna, bu dosyaların 1033 karakter olduğunu hayal edelim). Dizeyi findaramak için öğesini genişletebilirsiniz text:

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

İle -w, grepsadece çizgiler yazdırır texttek başına bir kelime olarak bulunmuştur. Bu ne istediğinizi oldukça yakın olmalıdır , ancak açıklaması da dize içerebilir başka bir dosya türü olduğunu garanti edemez text.


4

İken -execçoğunlukla bulduğum yer, aynı zamanda bir test olarak hareket edebileceğinizi dosyalarla şeyler yapmak için kullanılır. Bu nedenle, diğer ölçütlerinize ekleyebiliriz:

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

Unutmayın, grepdesen bulunmadığında sıfırdan farklı bir değer döndürür sh -c "COMMAND"ve değerlendirmenin sonucunu döndürür (geçerli olduğu sürece). Bu nedenle, yalnızca "UTF-8 Unicode metin" veya "ASCII metin" file <filename>ile biten text, ancak "ISO olmayan genişletilmiş ASCII metin, kaçış dizileri" ile biten dosyaları tüküren dosyalar yazdırılır .

Tek bir hatta, gitmekten daha kısa sürede sonuçlanır xargs:

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

sh -c 'file {} | grep "text$"'Herhangi bir özel komutla değiştirebileceğinizi unutmayın . Çok karmaşık bir şey olup olmadığını kontrol etmek istiyorsanız, bir kabuk komut dosyası sağlamak ve bunun yerine bunu kullanmak daha iyi bir fikir olabilir:

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

ki bu, uzun vadede, kabuğunuzun geçmişinden daha kolaydır:

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

Güzel! Ancak, eşleştirmenin text$kabuk komut dosyaları olarak tanınan şeyleri hariç tutacağını unutmayın . Bir sapma ile her şey bir senaryo olarak tanımlanır ve bunlar mükemmel insan tarafından okunabilir.
terdon

@terdon true, ancak komut dosyaları yürütülebilir olma eğilimindedir: D. Bununla birlikte, uygun bir komut dosyasının PDF'leri de tanıması gerekir. Ancak öte yandan, bir görüntü içeren bir PDF okunabilir mi? Bazı metnin PNG'si okunabilir mi? Muhtemelen. Sanırım tam bir test zor olacak.
Zeta


1

Yalnızca aşağıdakileri kullanmanız gerekir:

find inhere -size 1033c

Size şifreyi içeren tek dosyayı verecektir.


+ 1033c neden daha fazla dosya döndürüyor? daha büyük veya eşittir işareti gibi mi?
szeitlin

1

Dizinin içeriğinde aşağıdakileri çalıştırın:

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

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

Lütfen bu kombine komutları deneyin. istasyonumda çalışıyor.


0

Bunu deneyebilirsin

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

Sizin meydan okuma izin vermez grep. şifre dosyası "ASCII metni, çok uzun satırlar" olarak rapor edilecektir


0

Okunabilir dosya adlarını filtrelemek için, [:print:]( yazdırılabilir ) karakter sınıfı adını kullanabilirsiniz. Bu sınıflar hakkında daha fazla bilgiyi kılavuzunda bulabilirsiniz grep.

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

İkinci bir düşüncede, "insan tarafından okunabilir" gereksinimi dosyanın adı yerine dosyanın içeriğiyle ilgili olabilir. Başka bir deyişle, metin dosyaları arıyor olacaksınız . Bu biraz daha zor. @D_Bye bir yorumda önerildiği gibi file, dosya içerik türünü belirlemek için komutu kullanmalısınız . Ancak file, bir kanaldan sonra çalıştırmak iyi bir fikir olmaz, çünkü dosyanın adını görüntüleme görevini zorlaştırır. İşte önerim:

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

file-Part'ın çalışma şekli kısaca şöyle:

  • -execYüklem yürütür sh -c 'file -b $0 | grep -q text' FILENAMEher biri için FILENAMEbu tatmin önceki tüm durumlar (tipi, boyutu, yürütülemez).
  • Bu dosyaların her biri için bir kabuk ( sh), bu kısa komut dosyasını çalıştırır : dosya adıyla file -b $0 | grep -q textdeğiştirir $0.
  • fileProgram, her dosyanın içeriği tipini belirler ve bu bilgiyi verir. Bu -bseçenek, test edilen her dosyanın adının yazdırılmasını önler.
  • grep"metin"file içeren satırları arayarak programdan gelen çıktıyı filtreler . ( Komutun tipik bir çıktısının nasıl göründüğünü kendiniz görün .)file
  • Ancak grepfiltrelenen metni vermez, çünkü verilen -q(sessiz) seçeneğine sahiptir. Ne, sadece kendi değiştirecek gelmez çıkış durumu birine 0( "true" temsil - filtrelenmiş metin bulunmuştur) veya 1 (- Metin "hatası" anlamına "metin" den çıktıda görünmüyor file).
  • Gelen doğru / yanlış çıkış durumu grepile daha da geçirilir shiçin findve bütün "nihai sonucu olarak görür -exec sh -c 'file $0 | grep -q text' {} \;" test.
  • Yukarıdaki testin true döndürülmesi durumunda -printkomut yürütülür (yani test edilen dosyanın adı yazdırılır).

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

Sadece inhere / * ve cat / home / bandit4 / inhere / -file07 dosyasını kullanın

0
find  -type f ! -executable -size 1033c

dosyayı egzersizden alacak


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

Bir astarın fanı


0

Ben en çok bul ve grep kullanarak yukarıda bahsedilen haydut seviyesi için şifre bulmak için daha uzun yolu en açıklayıcı komut olduğunu düşünüyorum.

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

Ancak, 'file' komutunu daha fazla kullandıktan sonra, tüm dizinlerin dosya türlerini kontrol ederek insan tarafından okunabilir dosyaları (bu düzeydeki ASCII olarak) bulmanın oldukça kolay olduğunu fark ettim. İnhere dizini '-filexx' adında dosyaları tutar veya inhere dizinin tamamınıfile ./*

İşte yaklaşımım.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.