Bash скрипт для отправки почты, только если команда возвращает вывод - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь написать скрипт bash, который предупреждает меня, если некоторые файлы изменены. Итак, я написал это:

MYOUT=$(/usr/bin/find /home/public_html/ \( -iname "*.js" -o -iname "*.tpl" -o -iname "*.php" \) -mtime -1)
if [[ -n $? ]]
then
    mail -s "Hack attempt" my_mail@gmail.com <<<"$MYOUT"
fi

Но он отправляет письмо, даже когда файлы не найдены.

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Другой вариант - проверить состояние выхода для присвоения переменной.

if MYOUT=$(/usr/bin/find /home/public_html/ \( -iname "*.js" -o -iname "*.tpl" -o -iname "*.php" \) -mtime -1); then
  mail -s "Hack attempt" my_mail@gmail.com <<<"$MYOUT"
fi

Или проверить состояние выхода, например

MYOUT=$(/usr/bin/find /home/public_html/ \( -iname "*.js" -o -iname "*.tpl" -o -iname "*.php" \) -mtime -1)

case $? in
   0) mail -s "Hack attempt" my_mail@gmail.com <<<"$MYOUT";;
esac
0 голосов
/ 26 апреля 2020

Когда /usr/bin/find находит какой-либо файл в соответствии с его аргументами, происходят два события: в качестве значения возврата в переменную $? устанавливается значение возврата и в переменную $MYOUT выводится строка в соответствии с вашим кодом.

Из вашего вопроса "... скрипт для отправки почты, только если команда возвращает вывод", я могу вывести, что вы хотите использовать второй метод для принятия решения об отправке почты.

В этом случае вам необходимо изменить условие теста, как показано ниже, проверив значение $MYOUT, а не $?, заключив тест в квадратные скобки:

MYOUT=$(/usr/bin/find /home/public_html/ \( -iname "*.js" -o -iname "*.tpl" -o -iname "*.php" \) -mtime -1)
if [ -n "$MYOUT" ]
then
    mail -s "Hack attempt" my_mail@gmail.com <<<"$MYOUT"
fi
...