Разбор ClamAV регистрирует в скрипте Bash, используя Regex для вставки в MySQL. - PullRequest
0 голосов
/ 12 июля 2011

Утро / Вечер всех,

У меня возникла проблема, когда я делаю сценарий для работы, который использует ClamAV для сканирования на наличие вредоносных программ, а затем помещаю его результаты в MySQL, принимая полученные журналы ClamAV, используя grep с awk для преобразования нужных частей войти в переменную. У меня проблема в том, что, хотя я и сделал резюме, синтаксис обнаружений делает его немного сложнее. Я ни в коем случае не эксперт в regex, и это немного опыт обучения, так что, вероятно, есть гораздо лучший способ сделать это, чем я!

Строки, которые я пытаюсь разобрать, выглядят так:

/net/nas/vol0/home/recep/SG4rt.exe: Worm.SomeFool.P FOUND
/net/nas/vol0/home/recep/SG4rt.exe: moved to '/srv/clamav/quarantine/SG4rt.exe'

Насколько мне удалось установить, мне нужен позитивный взгляд сзади, чтобы соответствовать тому, что происходит после и перед двоеточием, без фактического соответствия двоеточия или пробела после него, и я не вижу четкого способа сделать это от RegExr без этого думая, я пытаюсь найти два двоеточия. Что еще хуже, мы иногда получаем это тоже ...

WARNING: Can't open file /net/nas/vol0/home/laser/samples/sample1.avi: Permission denied

Конечным результатом является то, что я могу создать запрос MySQL, который вставляет путь, найденное вредоносное ПО и место, куда он был перемещен, или, если произошла ошибка, то путь, а затем обнаруженная ошибка, чтобы преобразовать каждый элемент в переменную. содержание в операторе while.

Я сделал сводку сканирования следующим образом:

Резюме выглядит так:

----------- SCAN SUMMARY -----------
Known viruses: 329
Engine version: 0.97.1
Scanned directories: 17350
Scanned files: 50342
Infected files: 3
Total errors: 1
Data scanned: 15551.73 MB
Data read: 16382.67 MB (ratio 0.95:1)
Time: 3765.236 sec (62 m 45 s)

Разбор так:

SCANNED_DIRS=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Scanned directories" | awk '{gsub("Scanned directories: ", "");print}')
SCANNED_FILES=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Scanned files" | awk '{gsub("Scanned files: ", "");print}')
INFECTED=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Infected files" | awk '{gsub("Infected files: ", "");print}')
DATA_SCANNED=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Data scanned" | awk '{gsub("Data scanned: ", "");print}')
DATA_READ=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Data read" | awk '{gsub("Data read: ", "");print}')
TIME_TAKEN=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Time" | awk '{gsub("Time: ", "");print}')
END_TIME=$(date +%s)
mysql -u scanner_parser --password=removed sc_live -e "INSERT INTO bs.live.bs_jobstat VALUES (NULL, '$CURRTIME', '$PID', '$IY', '$SCANNED_DIRS', '$SCANNED_FILES', '$INFECTED', '$DATA_SCANNED', '$DATA_READ', '$TIME_TAKEN', '$END_TIME');"
rm -f /srv/clamav/$IY-scan-$LOGTIME.log

Некоторые из этих переменных взяты из других частей скрипта и могут быть проигнорированы. Причина, по которой я это делаю, заключается в том, чтобы сохранить беспорядок в лог-файле и получить простой веб-обзор состояния системы.

Есть какие-нибудь подсказки? Я иду обо всем этом неправильно? Заранее спасибо за помощь, я ценю это!

1 Ответ

1 голос
/ 12 июля 2011

Из того, что я могу определить из этого вопроса, похоже, что вы спрашиваете, как отличить нужные строки от строк регистратора, начинающихся с ПРЕДУПРЕЖДЕНИЯ, ОШИБКИ, ИНФОРМАЦИИ.

Вы можете сделать это, не получаявоображать с предвкушением или взглядом позади.Просто grep для строк , начинающихся с

"/net/nas/vol0/home/recep/SG4rt.exe: "

, затем с помощью awk вы можете извлечь оставшуюся часть строки.Или вы можете gsub префикс, как вы делаете в разделе обработки сводки.

Что касается вопроса об обработке сводки, меня больше всего удивляет то, что вы обрабатываете весь файл несколько раз, каждый раз вытаскивая один вид линии.Для подобных задач я бы использовал Perl, Ruby или Python и сделал один проход по файлу, собирая фрагменты каждой строки после двоеточия, сохраняя их в переменных обычного языка программирования (не переменных env) и формируя вставку MySQLстрока с использованием интерполяции.

Bash отлично подходит для некоторых вещей, но ИМХО вы оправдываетесь в использовании более общего языка сценариев (на ум приходят Perl, Python, Ruby).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...