2015-11-29 2 views
-1

задач: сканирование вирусов с ClamAV и сообщать, если зараженные файлы существуетпроверка Bash пустой выход и отключить выполнение скрипта в одной строке

одна строка сценария

clamscan -ir --exclude=/proc --exclude=/sys --exclude=/dev/| grep "Infected files: [1-9].*" -z | mutt -s 'Viruses detected' -- [email protected] [email protected] [email protected] 

Проблема: сообщение электронной почты отправляется, если команда «clamscan ... | grep "возвращает пустой вывод (вирусы не основаны, зараженные файлы: 0)

Подзадание: напишите скрипт bash без использования временных файлов. Используйте только переадресацию выходных функций и проверьте, не является ли выход пустым, а затем «Mutt» не должно быть выполнено.

+0

Можете ли вы написать небольшой сценарий оболочки для чтения stdin в переменной (например, '$ input') и использовать эту переменную для' -z '$ input "' check? – Prasanna

ответ

2

Вы не можете сделать это одним слоем без обмана.

Прямое решение для захвата вывода и использовать его, если там был матч:

if output=$(clam etc | grep etc); then 
    mutt etc <<<"$output" 
fi 

обманщик, чтобы скрыть эту функцию как-то:

mongrel() { # aka "mutt maybe" 
    input=$(cat -) 
    case $input in '') return 1;; esac 
    mutt "[email protected]" <<<"$input" 
} 
clam etc | grep etc | mongrel etc 

Если есть много вывода, я, возможно, на самом деле предпочитает временный файл для хранения результатов в памяти; но если это ваше задание, я не пойду туда.

Кстати, конечный подстановочный знак в вашем grep регулярном выражении не вносит никакого значения - если это не поможет вам в понимании (что, я думаю, не так, больше похоже на добавление путаницы). Я оставил бы это.

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

output=$(clamscan -ir --exclude=/proc --exclude=/sys --exclude=/dev /) 
case $output in *"Infected files: [1-9]"*) 
    mutt -s 'Viruses detected' -- [email protected] [email protected] [email protected] <<<"$output" ;; 
esac 
+0

Спасибо. Работает отлично. В одной строке (для простого добавления в задачу cron): if output = $ (clamscan -ir --exclude =/proc --exclude =/sys --exclude =/dev/| grep "Зараженные файлы: [1-9] . * "-z); затем mutt -s 'Вирусы, обнаруженные на stkmos' - [email protected] [email protected] <<< "$ output"; фи –

 Смежные вопросы

  • Нет связанных вопросов^_^