Apa alasan tepatnya `grep` on / proc dan disk mentah adalah ide yang buruk?

9

Saya berlari grep -r "searchphrase" /hari ini dan itu tidak berhasil. Saya melakukan riset dan ternyata find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"pendekatan yang tepat.

Saya mengumpulkan /procdan disk seperti /dev/sda1adalah penyebab grep yang tidak berhasil.

Saya akan menyukai latar belakang teknis yang mendalam tentang "mengapa". Saya pikir beberapa tautan di dalam /procmembuat loop tak terbatas ketika dilalui, dan saya membaca ada lebih banyak alasan, tetapi tidak ada yang spesifik.

Juga, apa yang terjadi ketika disk mentah dipahami? Dapatkah data biner (yang dapat diakses pada /dev/sda1, sejauh yang saya tahu?) Tidak dapat diartikan, karena hanya mountdengan tipe sistem file yang membuat data dari disk dapat dipahami? Apakah karena itu masih mungkin untuk mengambil string biner?

curious_weather
sumber

Jawaban:

11

Ya, Anda bisa grep /dev/sda1dan /proctetapi Anda mungkin tidak mau. Lebih detail:

  1. Ya, Anda dapat menjalankan grep konten biner /dev/sda1. Tetapi, dengan hard disk besar modern, ini akan memakan waktu yang sangat lama dan hasilnya tidak akan berguna.

  2. Ya, Anda dapat mengambil konten /proctetapi perlu diketahui bahwa memori komputer Anda dipetakan di sana sebagai file. Pada komputer modern dengan RAM gigabytes, ini akan membutuhkan waktu lama untuk diraih dan, sekali lagi, hasilnya tidak akan berguna.

Sebagai pengecualian, jika Anda mencari data pada hard disk dengan sistem file yang rusak, Anda mungkin menjalankan grep something /dev/sda1sebagai bagian dari upaya untuk memulihkan data file.

File bermasalah lainnya di /dev

Hard disk dan partisi hard disk di bawah /devdapat, jika seseorang memiliki cukup kesabaran, ditangkap. File lain (ujung hat: user2313067 ), bagaimanapun, dapat menyebabkan masalah:

  1. /dev/zeroadalah file dengan panjang tak terbatas. Untungnya, grep(setidaknya versi GNU) cukup pintar untuk melewatkannya:

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/randomdan /dev/urandomjuga tak terbatas. Perintah grep something /dev/randomakan berjalan selamanya kecuali grepditandai untuk berhenti.

    Berguna untuk melakukan grep /dev/urandomsaat membuat kata sandi. Untuk mendapatkan, misalnya, lima karakter alfanumerik acak:

    $ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
    G
    4
    n
    X
    2
    

    Ini bukan tanpa batas karena, setelah menerima karakter yang cukup, headmenutup pipa yang menyebabkan grep berakhir.

Loop tak terbatas

"... tautan ... buat loop tak terbatas saat dilalui ..."

Grep (setidaknya versi GNU) cukup pintar untuk tidak melakukan itu. Mari kita pertimbangkan dua kasus:

  1. Dengan -ropsi ini, grep tidak mengikuti tautan simbolik kecuali mereka secara eksplisit ditentukan pada baris perintah. Oleh karena itu, loop tak terbatas tidak mungkin.

  2. Dengan -Ropsi tersebut, grep memang mengikuti tautan simbolis tetapi memeriksa dan menolak untuk terjebak dalam satu lingkaran. Menggambarkan:

    $ mkdir a
    $ ln -s ../ a/b
    $ grep -R something .
    grep: warning: ./a/b: recursive directory loop
    

Tidak termasuk direktori yang bermasalah dari grep -r

Selain itu, grepsediakan fasilitas terbatas untuk menghentikan grep dari mencari file atau direktori tertentu. Misalnya, Anda dapat mengecualikan semua direktori bernama proc, sysdan devdari pencarian rekursif grep dengan:

grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /

Atau, kita bisa mengecualikan proc, sysdan devmenggunakan gumpalan diperpanjang bash:

shopt -s extglob
grep -r something /!(proc|sys|dev)
John1024
sumber
Terima kasih! Itu jawaban yang bagus. Kecuali jika pahlawan lain muncul dari kegelapan malam ini aku akan menerimanya besok! Saya bertanya-tanya tentang satu hal lagi, dan saya harap itu tidak terlalu jauh: Jika grepmencari file /procyang mengarah ke memori yang dipetakan, mungkinkah itu mengenai grepEOF di dalam memori (acak), dan mengartikan data berikut ini sebagai nama file baru untuk dicari? Saya sudah mulai membaca grepkode sumber, tapi saya rasa saya tidak akan melihat terlalu banyak di dalamnya.
curious_weather
1
@krork Dalam beberapa sistem operasi lama, seperti CP / M, akhir file ditandai oleh karakter EOF. Karena sistem file modern melacak ukuran file, karakter tersebut tidak digunakan.
John1024
2
Grepping /devmungkin tidak pernah berakhir karena grep mulai memindai /dev/zeroatau serupa. Tidak yakin apakah file tersebut ada di /procatau /sys.
user2313067
1
@ user2313067 Poin bagus! Meskipun GNU grep akan menolak untuk mencari /dev/zero, ia akan mencari /dev/randomselamanya kecuali dihentikan. Jawaban diperbarui.
John1024
Saya tidak melakukan banyak hal dengan / proc atau / sys, tetapi karena ini adalah direktori virtual yang dapat diperbarui setiap saat, Anda mungkin mendapatkan hasil yang tidak terduga / tidak dapat diulang dari beberapa kali proses. Tentu saja, ini dapat terjadi dengan sistem file biasa juga, tetapi mungkin sedikit lebih mengejutkan di sini.
Joe