cron, выполняющий скрипт, не записывающий в файл
У меня есть сервер, на котором выполняется AIDE, и задание cron, которое запускается, выполняет скрипт bash и отправляет оповещение по электронной почте. Это все еще WIP, но я не могу заставить скрипт работать правильно. Когда скрипт выполняется, мой выходной файл определен здесь /sbin/aide --check > /tmp/$AIDEOUT
все еще пустой файл. Я даже попробовал простой /bin/echo "hello world" > /tmp/$AIDEOUT
и это тоже не похоже на работу. /tmp/$AIDEOUT
файл остается пустым.
Однако, если я запускаю этот скрипт вручную без использования Cron, он работает нормально.
Вот мой скрипт
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MYDATE=`date +%Y-%m-%d`
AIDEOUT="AIDE-${MYDATE}.txt"
MAIL_TO=
ALLMATCH='All files match AIDE database. Looks okay!'
MAIL_FROM=
/bin/touch /tmp/$AIDEOUT
/bin/chmod 755 /tmp/$AIDEOUT
#/bin/echo "Aide check `date`" > /tmp/$AIDEOUT
/sbin/aide --check > /tmp/$AIDEOUT
if ! grep -q "$ALLMATCH" /tmp/$AIDEOUT; then
/usr/bin/mailx -s "Daily AIDE report for $(hostname)-${ENVIRONMENT_NAME} ${AWS_REGION}" -r $MAILFROM $MAILTO < /tmp/$AIDEOUT
fi
#/bin/rm /tmp/$AIDEOUT
/sbin/aide --update
/usr/bin/mv /var/lib/aide/aide.db.gz /var/lib/aide/db_backup/aide.db.gz-$(date +"%m-%d-%y")
/usr/bin/mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
мой cron job определен в /etc/cron.d/aide*/5 * * * * root /usr/local/etc/cron_aide2.sh
Спасибо!
3 ответа
Вы используете selinux. Если вы "setenforce 0" и затем запустите cron, вы получите ожидаемый результат. В корневой оболочке ваш контекст selinux:
unconfined_u: unconfined_r: unconfined_t: s0-s0: c0.c1023
Но при запуске из Cron ваш контекст selinux начинается как:
system_u: system_r: system_cronjob_t: s0-s0: c0.c1023
Решение совершенно глупо. Вместо:
/ sbin / aide --check> /tmp/$AIDEOUT
использование
/sbin/aide --check 2>&1 | кот> /tmp/$AIDEOUT
Я бы проверил, что ваш cron действительно работает. Вы можете посмотреть в /var/log/cron и посмотреть, есть ли запись для этого. Если нет, то, возможно, убедитесь, что файл является исполняемым. Если selinux включен, вы можете проверить в журналах аудита.
Вероятно, вспомогательный вывод в stderr, но не в stdout. Попробуй перенаправить stderr
/sbin/aide --check 2> /tmp/$AIDEOUT
Или и стандартный вывод, и стандартный вывод
/sbin/aide --check 2>&1 /tmp/$AIDEOUT