Saya mencoba menemukan cara yang efisien untuk melakukan level 5 dari tantangan bandit OverTheWire .
Lagi pula, saya punya banyak file, dan hanya ada satu yang menghormati kriteria berikut:
- Dapat dibaca oleh manusia
- Berukuran 1033 byte
- Tidak dapat dieksekusi
Saat ini, saya menggunakan find
perintah, dan saya dapat menemukan file yang cocok dengan 2 kriteria terakhir:
find . -size 1033c ! -executable
Namun, saya tidak tahu bagaimana cara mengecualikan file yang tidak dapat dibaca manusia. Solusi yang saya temukan untuk tantangan itu menggunakan -readable
parameter uji, tapi saya rasa ini tidak berhasil. -readable
hanya melihat izin file, dan bukan pada isinya, sedangkan deskripsi tantangan meminta file ASCII atau sesuatu seperti itu.
Jawaban:
Ya, Anda dapat menggunakan
find
untuk mencari file yang tidak dapat dieksekusi dengan ukuran yang tepat dan kemudian gunakanfile
untuk memeriksa ASCII. Sesuatu seperti:Namun, pertanyaannya tidak sesederhana kedengarannya. 'Dapat dibaca manusia' adalah istilah yang sangat tidak jelas. Agaknya, maksud Anda teks. OK, tapi teks seperti apa? Hanya karakter Latin ASCII? Unicode penuh? Sebagai contoh, perhatikan tiga file ini:
Ini semua adalah teks dan dapat dibaca manusia. Sekarang, mari kita lihat apa yang
file
membuat mereka:Jadi,
find
perintah di atas hanya akan menemukanfile1
(demi contoh ini, mari kita bayangkan file-file tersebut memiliki 1033 karakter). Anda dapat memperluasfind
untuk mencari stringtext
:Dengan
-w
,grep
hanya akan mencetak garis-garis di manatext
ditemukan sebagai kata yang berdiri sendiri. Itu seharusnya cukup dekat dengan apa yang Anda inginkan, tetapi saya tidak dapat menjamin bahwa tidak ada jenis file lain yang uraiannya mungkin juga menyertakan stringtext
.sumber
Meskipun
-exec
sebagian besar digunakan untuk melakukan sesuatu dengan file-file yang ditemukan, itu juga dapat bertindak sebagai tes. Karena itu, kami dapat menambahkannya ke kriteria Anda yang lain:Ingat,
grep
kembalikan bukan nol ketika pola tidak ditemukan, dansh -c "COMMAND"
akan mengembalikan hasil evaluasi (asalkan valid). Jadi ini hanya akan mencetak file di manafile <filename>
meludahkan sesuatu yang berakhir dengantext
, misalnya "teks UTF-8 Unicode` atau" teks ASCII ", tetapi bukan" Teks non-ISO extended-ASCII, dengan urutan pelarian ".Dalam satu baris, bahkan berakhir lebih pendek daripada melewati
xargs
:Ingatlah bahwa Anda dapat mengganti
sh -c 'file {} | grep "text$"'
dengan perintah khusus apa pun. Jika Anda ingin memeriksa sesuatu yang sangat kompleks, mungkin ide yang lebih baik untuk menyediakan skrip shell dan menggunakannya:yang, dalam jangka panjang, lebih mudah dipertahankan daripada riwayat shell Anda:
sumber
text$
akan mengecualikan hal-hal yang dikenali sebagai skrip shell. Apa pun dengan shebang diidentifikasi sebagai skrip, dan itu bisa dibaca manusia.sumber
Anda hanya perlu menggunakan:
Ini akan memberi Anda satu-satunya file yang berisi kata sandi.
sumber
Jalankan saja berikut ini terhadap isi direktori:
sumber
Silakan coba perintah gabungan ini. ini bekerja di stasiun saya.
sumber
Anda bisa mencoba ini
Tantangan Anda tidak memungkinkan
grep
. file kata sandi akan dilaporkan sebagai "teks ASCII, dengan garis yang sangat panjang"sumber
Untuk memfilter nama file yang dapat dibaca manusia, Anda dapat menggunakan nama kelas karakter
[:print:]
(yang dapat dicetak ) . Anda akan menemukan lebih banyak tentang kelas-kelas tersebut di manual untuk .grep
Setelah dipikir-pikir, persyaratan "yang dapat dibaca manusia" mungkin merujuk pada konten file, alih-alih namanya. Dengan kata lain, Anda akan mencari file teks . Itu sedikit lebih rumit. Seperti yang disarankan @D_Bye dalam komentar, Anda harus menggunakan
file
perintah untuk menentukan tipe konten file. Tetapi itu bukan ide yang baik untuk dijalankanfile
setelah pipa, karena itu akan menyulitkan tugas menampilkan nama file. Inilah yang saya sarankan:Ini adalah singkat bagaimana
file
-bagian bekerja:-exec
predikat mengeksekusish -c 'file -b $0 | grep -q text' FILENAME
untuk setiapFILENAME
yang memenuhi semua kondisi sebelumnya (jenis, ukuran, non-executable).sh
) berjalan singkat ini naskah :file -b $0 | grep -q text
, mengganti$0
dengan nama file.file
Program menentukan jenis konten setiap file dan output informasi ini. The-b
mencegah opsi mencetak nama setiap file diuji.grep
memfilter output yang berasal darifile
program, mencari baris yang berisi "teks" . (Lihat sendiri, bagaimana output khas darifile
perintah terlihat.)grep
tidak menampilkan teks yang difilter, karena ia memiliki opsi-q
(sunyi) yang diberikan. Apa yang dilakukannya, hanya mengubah status keluarnya menjadi0
(yang mewakili "benar" - teks yang difilter ditemukan) atau 1 (artinya "kesalahan" - teks "teks" tidak muncul di keluaran darifile
).grep
diteruskan olehsh
kefind
dan bertindak sebagai hasil akhir dari seluruh "-exec sh -c 'file $0 | grep -q text' {} \;
" tes.-print
perintah dijalankan (yaitu nama file yang diuji dicetak).sumber
sumber
akan memberi Anda file dari latihan
sumber
Penggemar satu liners
sumber
Saya pikir cara yang lebih lama untuk menemukan kata sandi untuk level bandit ini yang disebutkan oleh sebagian besar di atas menggunakan find dan grep adalah perintah yang paling deskriptif.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Tapi, setelah menggunakan perintah 'file' lebih saya menyadari cukup mudah untuk menemukan file yang dapat dibaca manusia (alias ASCII di tingkat ini) dengan cara ini dengan memeriksa seluruh jenis file direktori. Direktori inhere menyimpan file dengan nama '-filexx' atau dengan cepat memeriksa seluruh direktori inhere
file ./*
Inilah pendekatan saya.
sumber
akan mendapatkan hasil Anda
sumber