Сценарий Bash отправляет электронную почту, даже если это не должно

У меня есть задание cron, запускаемое root каждый час, которое проверяет, есть ли нарушение tripwire. Он по-прежнему отправляет мне электронное письмо каждый час, независимо от того, есть ли у меня нарушение или нет. Если есть нарушение, он включает отчет. Если нарушений нет, он отправляет мне пустое электронное письмо только с темой.

Вот сценарий:

#!/bin/bash

# Save report
tripwire --check > /tmp/twreport

# Count violations
v=`grep -c 'Total violations found:  0' /tmp/twreport`

# Send report
if [ "$v" -eq 0 ]; then
        mail -s "[tripwire] Report for `uname -n`" [email protected] < /tmp/twreport
fi

person MarkH    schedule 03.05.2017    source источник
comment
Если он отправляет пустое электронное письмо, это, по-видимому, указывает на то, что /tmp/twreport пуст. Это, безусловно, приведет к тому, что v будет установлено равным нулю. Предложите отлаживать то, что на самом деле записывается в этот файл.   -  person paxdiablo    schedule 03.05.2017
comment
В файл записывается - либо показывает 0 нарушений, либо x количество нарушений. v равно 0 или 1. Когда я запускаю его вручную, он работает нормально, только в cron он не работает.   -  person MarkH    schedule 03.05.2017
comment
Существует огромная разница в среде между терминалами и заданиями cron, поэтому здесь может быть проблема. См., например, stackoverflow.com/questions/1972690/   -  person paxdiablo    schedule 03.05.2017
comment
Ах, у меня в сценарии нет полного пути к tripwire. Я добавил его и посмотрю, выполняется ли он   -  person MarkH    schedule 03.05.2017


Ответы (2)


Я предлагаю изменить код на

if [ -f /tmp/twreport ] # Check file exists
then
 v=$(grep -c '^Total violations found:  0$' /tmp/twreport)
 #Not suggested using legacy backticks
 if [ "$v" -eq 0 ]; then
        mail -s "[tripwire] Report for $(uname -n)" [email protected] < /tmp/twreport
 fi
fi

Наконец, установите путь в cron, прежде чем поместить строку сценария. как

# Setting PATH
PATH=/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/path/to/tripwire:/and/so/on
# Now,set up the cron-job for the script
0        11         *              *          0       /path/to/script
person sjsam    schedule 03.05.2017

Попробуйте заключить в двойные кавычки и использовать полный путь

v="`/bin/grep -c 'Total violations found:  0' /tmp/twreport`"

и

if [ "$v" == "0" ]; then # or = instead of == based on your shell

Если они не работают, проверьте условие поиска. Я вижу два пробела перед 0 в строке «Найдено: 0»

person Theofanis    schedule 03.05.2017
comment
Использование " кавычек здесь не проблема, так как grep -c всегда выводит число (без пробелов или других странных вещей, которые могли бы исправить кавычки). - person paxdiablo; 04.05.2017