Я работаю над очисткой кода скрипта на машине с Linux, которую предыдущий разработчик создал, когда натолкнулся на эту команду:

find / -xdev -type f | egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs" | xargs md5sum 2> /dev/null | tr -s "[:space:]" | md5sum | cut -d\  -f1

Я пытаюсь полностью обернуть голову вокруг того, что делает каждая часть команды, но часть grep сбивает меня с толку.

Я знаю, что вывод - это, по сути, значение контрольной суммы файловой системы, но мне нужно точно знать, как это происходит.

Благодарю.

2 ответа2

1

В замедленном режиме:

egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs"
  • egrep означает, что мы используем ERE (расширенные регулярные выражения)
  • -v инвертирует выбор (сохраните то, что не совпадает)
  • | ORing различные выражения
  • ^ это совпадение "начало строки"

Поэтому он удаляет строки, начинающиеся с /etc/shadow , /etc/random-seed т.д., Что исключает файлы из этих каталогов.

Так в глобальном масштабе:

  • найти все файлы только в / filesystem (из-за -xdev), так что это исключает /proc например, и, возможно, другие файловые системы (учитывая остальное, я не удивлюсь, если se /var будет отдельной FS), и filter из определенных каталогов, как показано выше.
  • вычислить MD5-хеш всех этих файлов (xargs md5sum)
  • немного помассируйте этот список хэшей
  • вычислить MD5-хэш из списка MD5-хешей md5sum | cut -d\ -f1

Другими словами, он вычисляет объединенный хэш всех файлов на диске, вероятно, для проверки того, что ничего не изменилось с момента последнего вычисления (поэтому я был бы удивлен, что /var учитывается, так как его содержимое меняются со временем: /var/log , /var/mail , /var/lib ...)

0

Ответ от xenoid действителен, поэтому я не буду его повторять. Еще несколько разъяснений, поскольку lukemk1 попросил их в своем комментарии выше об этой части:| xargs md5sum 2> /dev /null | tr -s "[:space:]" | md5sum | cut -d\ -f1

«| xargs md5sum»: позволяет применить команду md5sum с аргументом, представляющим собой все переданные имена файлов (здесь это может быть немного сложнее).

"2> /dev /null": означает выбросить поток stderr

"| tr -s" [:space:] "": (per "man tr" [:space:] - все горизонтальные или вертикальные пробелы, а флаг -s (--squeeze-repeat) сжимает последовательные повторения этого типа пробелов ,

«| md5sum»: принимает md5sum потока md5sum

«| cut -d\ -f1»: используя пробел («\») в качестве полей разделителя, печатать только первое поле (в действительности только число md5sum)

Это не было частью вопроса, но одна проблема, которую я вижу с общей командой, заключается в том, что, если в именах файлов есть место, оно не будет работать должным образом; чтобы исправить, вам нужно использовать find ... -print0 | .... | xargs -0 ....

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .