Назад | Перейти на главную страницу

Сценарий cronjob не передает пароль mysql

У меня есть сценарий под названием /etc/cron.daily/99loganalyzer_expire, который выглядит так:

#!/bin/bash
SQL="DELETE FROM SystemEvents WHERE ReceivedAt < DATE_SUB(CURDATE(),INTERVAL 30 DAY)"   
MYSQL_USER="loganalyzer"
MYSQL_PASS="loganalyzerpassword"
MYSQL_DB="Syslog"    
echo $SQL | /usr/bin/mysql --user=$MYSQL_USER --password=$MYSQL_PASS $MYSQL_DB

Когда он запускается ночью, я получаю электронное письмо, в котором говорится, что он не удался:

/etc/cron.daily/99loganalyzer-expire:

ERROR 1045 (28000): Access denied for user 'loganalyzer'@'localhost' (using password: YES)

... однако, когда я запускаю его как root с консоли, он работает:

# time /etc/cron.daily/99loganalyzer-expire

real    1m16.391s
user    0m0.012s
sys     0m0.008s

Как я могу передать учетные данные для этого пользователя mysql, чтобы они работали в cronjob?

Ввод учетных данных для входа в такую ​​командную строку рискованно, так как любой, кто может просматривать список процессов, может просмотреть эти учетные данные. Лучше всего поместить эти учетные данные в файл параметров, например ~ / .my.cnf, а затем указать этот файл в своей команде.

[client]
user="loganalyzer"
password="loganalyzerpassword"

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

echo $SQL | /usr/bin/mysql --defaults-file=/root/.my.cnf Syslog

Более подробную информацию о файлах опций можно найти на http://dev.mysql.com/doc/refman/5.6/en/option-files.html.

Вам нужно использовать другую команду.

Примерно так должно работать:

#!/bin/bash
mysql -uUSERNAME -pPASSWORD -e "DELETE FROM SystemEvents WHERE ReceivedAt < DATE_SUB(CURDATE(),INTERVAL 30 DAY);" syslog

Возможно, потребуется адаптация к вашим потребностям, и я не уверен на 100%, как выбирается БД.

Неправильный порядок, последняя строка, что перед трубкой, должна быть в конце строки.

Я имею в виду, что команда SQL - это последний бит.