Perintah UNIX - find


9

Saya mencoba mempelajari perintah UNIX dan saya memainkan permainan ini untuk belajar dan saya benar-benar terjebak saat ini. Saya berada di server melalui ssh dan direktori penuh dengan file dan folder acak dan kata sandi untuk tingkat berikutnya ada di dalam salah satu file. Saya telah diberitahu bahwa file tersebut memiliki attrbutes berikut:

  • dapat dibaca manusia
  • 1033 byte
  • tidak dapat dieksekusi

Saya menduga bahwa saya harus menggunakan findperintah dan saya mencoba find ! -executabletetapi itu mengembalikan banyak file. Satu-satunya bantuan yang dapat dibaca manusia yang dapat saya temukan dalam manual atau online adalah mencetak ukuran file dalam yang dapat dibaca manusia. Jadi saya agak tersesat di sana?

Saya juga mencoba find ~ -size 1033btetapi itu tidak menghasilkan apa-apa. Tetapi ketika saya mencobanya find ~ -size -1033bmengembalikan setiap file dalam direktori.


Saya benar-benar ingin tahu lebih banyak tentang game ini!
ivanivan

2
@ivanivan bandit.overthewire.org
avgvstvs

Jawaban:


16

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

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

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 fileperintah untuk menentukan tipe konten file. Tetapi itu bukan ide yang baik untuk dijalankan filesetelah pipa, karena itu akan menyulitkan tugas menampilkan nama file. Inilah yang saya sarankan:

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

Ini adalah singkat bagaimana file-bagian bekerja:

  • The -execpredikat mengeksekusi sh -c 'file -b $0 | grep -q text' FILENAMEuntuk setiap FILENAMEyang memenuhi semua kondisi sebelumnya (jenis, ukuran, non-executable).
  • Untuk masing-masing file, shell ( sh) berjalan singkat ini naskah : file -b $0 | grep -q text, mengganti $0dengan nama file.
  • The fileProgram menentukan jenis konten setiap file dan output informasi ini. The -bmencegah opsi mencetak nama setiap file diuji.
  • grepmemfilter output yang berasal dari fileprogram, mencari baris yang berisi "teks" . (Lihat sendiri, bagaimana output khas dari fileperintah terlihat.)
  • Tetapi greptidak menampilkan teks yang difilter, karena ia memiliki opsi -q(sunyi) yang diberikan. Apa yang dilakukannya, hanya mengubah status keluarnya menjadi 0(yang mewakili "true" - teks yang difilter ditemukan) atau 1 (berarti "kesalahan" - teks "teks" tidak muncul pada output dari file).
  • Status keluar benar / salah berasal dari grepditeruskan oleh shke finddan bertindak sebagai hasil akhir dari seluruh " -exec sh -c 'file $0 | grep -q text' {} \;" tes.
  • Dalam hal pengujian di atas dikembalikan benar , -printperintah dijalankan (yaitu nama file yang diuji dicetak).

Saya tahu ini sudah lama tetapi saya ingin menambahkan bahwa menggunakan find . -type f -size 1033cjuga akan mengembalikan respons yang sama persis.
Brandon Benefield

8
find . -type f -readable -size 1033c ! -executable

Perhatikan bahwa saya menggunakan cbukan buntuk ukuran file. buntuk blok 512 byte. cuntuk byte aktual.


2
Saya tidak berpikir -readablecara yang dapat dibaca manusia (yaitu bukan biner)
hhaamu

1
@hhaamu - benar. Namun, mungkin tidak buruk untuk memfilter file yang tidak dapat dibaca pengguna! Untuk menentukan apakah suatu file berisi konten yang dapat dibaca manusia, sambungkan nama yang dikembalikan oleh findke file.
D_Bye

2

semua yang saya tulis adalah:

find -size 1033c ! -executable

dan mendapat file. Rupanya bagian yang bisa dibaca manusia adalah untuk mengusirmu.


0
find . -readable -size 1033c \! -executable

-baca artinya file dapat dibaca oleh akun, itu tidak membuat mereka dapat dibaca manusia.
Anthon

0

Saya pikir untuk gim namun sintaks yang benar adalah:

file ./* 

Anda mendapatkan pengembalian yang mencantumkan daftar masing-masing file. Ini bekerja sangat baik untuk apa yang ingin Anda capai dalam permainan Bandit. Bola kurva nyata untuk tugas ini adalah bahwa setiap file dimulai dengan - (tanda hubung).


Anda bisa memperbaiki ini dengan menambahkan tanda hubung ke dalam perintah seperti file ./-*ini.
ConstantFun

0

Saya pikir ini adalah jawaban aktual terbaik yang akan mencakup semua 3 kondisi

find inhere/ -type f -size 1033c ! -executable |xargs file | grep text

Tetapi seperti yang dikatakan banyak orang, yang dapat dieksekusi dan dapat dibaca manusia adalah untuk mengusir kita, jadi gunakanlah

find inhere/ -type f -size 1033c 

sudah cukup!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.