Які точні причини `grep` on / proc та необроблені диски - це погана ідея?


9

Я grep -r "searchphrase" /сьогодні побіг, і це не вийшло. Я провів деякі дослідження і виявив, find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"що це правильний підхід.

Я збираюсь, /procі диски, як /dev/sda1винуватці невдалого гріпа.

Мені б хотілося глибокого технічного підґрунтя на тему "чому". Я думаю, що деякі посилання всередині /procстворюють нескінченні петлі при проходженні, і я читаю, що є більше причин, але нічого конкретного.

Крім того, що відбувається, коли сирий диск стискається? Чи /dev/sda1не можна інтерпретувати бінарні дані (доступні на , наскільки я знаю?), Оскільки лише mountтип файлової системи робить дані з диска зрозумілими? Тож чи все-таки можна було б схопитися за двійковий рядок?

Відповіді:


11

Так, ви можете grep /dev/sda1і , /procале ви , ймовірно , не хочете. Більш детально:

  1. Так, ви можете виконати grep бінарний вміст /dev/sda1. Але для сучасних великих жорстких дисків це займе дуже багато часу, і результат, ймовірно, не буде корисним.

  2. Так, ви можете зібрати вміст, /procале пам’ятайте, що пам’ять вашого комп'ютера відображається там як файли. На сучасному комп'ютері з гігабайтами оперативної пам’яті це буде потрібно довго, а результат знову не буде корисним.

Як виняток, якщо ви шукаєте дані на жорсткому диску з пошкодженою файловою системою, ви можете запуститись grep something /dev/sda1як частина спроби відновити дані файлу.

Інші проблемні файли в /dev

/devЯкщо у вас достатньо терпіння, жорсткі диски та розділи жорсткого диска під цим можна отримати. Інші файли (порада капелюха: user2313067 ), однак, можуть спричинити проблеми:

  1. /dev/zero- це файл нескінченної довжини. На щастя, grep(принаймні версія GNU) досить розумна, щоб пропустити його:

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/randomі /dev/urandomтакож є нескінченними. Команда grep something /dev/randomбуде виконуватись назавжди, якщо не grepбуде подано сигнал зупинити

    Він може бути корисним для отримання грепів /dev/urandomпід час генерації паролів. Отримати, наприклад, п'ять випадкових буквено-цифрових символів:

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

    Це не нескінченно, оскільки, отримавши достатньо символів, headзакриває трубу, внаслідок чого греп припиняється.

Нескінченні петлі

"... посилання ... створюють нескінченні петлі при проходженні ..."

Grep (принаймні версія GNU) досить розумний, щоб цього не робити. Розглянемо два випадки:

  1. За допомогою -rопції grep не переходить до символьних посилань, якщо вони прямо не вказані в командному рядку. Отже, нескінченні петлі неможливі.

  2. За допомогою цього -Rпараметра grep виконує символічні посилання, але він перевіряє їх і відмовляється потрапити в цикл. Проілюструвати:

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

Виключення проблемних каталогів із grep -r

В сторону grepнадається обмежена можливість зупинити пошук файлів певних файлів чи каталогів. Наприклад, можна виключити всі каталоги по імені proc, sysі devвід рекурсивного пошуку Grep з:

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

З іншого боку , ми можемо виключити proc, sysі devвикористовуючи розширені кульки в Bash:

shopt -s extglob
grep -r something /!(proc|sys|dev)

Дякую! Це чудова відповідь. Якщо сьогодні вночі з темряви не з’явиться інший герой, я прийму це завтра! Мені цікаво ще одне, і я сподіваюся, що це не надто далеко: Якщо grepшукати файл у /procтому, що веде до відображеної пам'яті, чи може статися так, що grepпотрапить на EOF всередині (випадкової) пам'яті та інтерпретує наступні дані як нове ім'я файлу для пошуку? Я почав читати grepвихідний код, але, мабуть, не побачу в ньому занадто багато.
curious_weather

1
@krork У деяких старих операційних системах, таких як CP / M, кінець файлу був сигналізований символом EOF. Оскільки сучасні файлові системи відстежують розмір файлу, такі символи вийшли з ужитку.
John1024

2
Зібрання /devможе ніколи не закінчитися, коли греп починає сканувати /dev/zeroчи подібне. Переконайтесь, що такі файли існують у /procабо /sys.
user2313067

1
@ user2313067 Добрий момент! У той час як GNU grep відмовиться від пошуку /dev/zero, він буде шукати /dev/randomназавжди, якщо не буде зупинено. Відповідь оновлено.
John1024

Я не дуже працюю з / proc або / sys, але оскільки це віртуальні каталоги, які можуть оновлюватися в будь-який час, ви можете отримати несподівані / неповторні результати з декількох запусків. Звичайно, це може статися і з звичайними файловими системами, але це може бути трохи дивніше.
Джо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.