Сценарій Cronjob не передасть пароль mysql


0

У мене є сценарій під назвою /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)

... проте, коли я запускаю його як корінь з консолі, він працює:

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

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

Як я можу передати облікові дані цього користувача mysql, щоб вони працювали під час роботи?


додайте > /tmp/loganalyzer.log 2>&1до кінця рядка, щоб побачити, що відбувається.
кванта

Відповіді:


3

Введення даних для входу в такий командний рядок є ризикованим, оскільки кожен, хто може переглядати список процесів, може переглядати ці облікові дані. Кращим варіантом є розміщення цих облікових даних у файлі параметрів, таких як ~ / .my.cnf, а потім посилання на цей файл у вашій команді.

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

Переконайтеся, що chmod дозволи на 0600 у файлі цих параметрів не дозволяють переглядати його будь-хто, крім власника. Тоді ваша команда mysql буде:

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

Більш детальну інформацію про файли опцій можна знайти на веб- сайті http://dev.mysql.com/doc/refman/5.6/uk/option-files.html .


Це, дійсно, кращий спосіб зробити це (я вже використовую це для мого резервного копіювання Mysql). Не знаю, чому я сам цього не зробив. Він працює через звичайний cron, я позначу це правильним, якщо він закінчується cron.daily правильно.
Девід Макінтош

1
Ще одна причина використання ~ / .my.cnf: Коли пароль змінюється, вам доведеться лише оновити 1 файл, а не купу crontab / скриптів (Мерфі сказав, що ваші колеги завжди забудуть оновити один запис: сценарій, який виконує резервні копії).

1

Потрібно використовувати іншу команду.

Щось подібне повинно працювати:

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

Можливо, потрібно адаптувати під ваші потреби, і я не на 100% впевнений у тому, як вибрано БД.


Проблема представляється розпізнаванням пароля, а не виконанням команди. Як змінюється виклик (з --password=$fooчого це -p$fooзмінити?
Девід Макінтош

Важко сказати - але я знаю, що така команда працює в кроні. Можливо, вам щось стосується, що лунає через трубу - я не знаю.
Фредерік Нільсен

0

Порядок неправильний, останній рядок, що знаходиться перед трубою, повинен бути в кінці лінії.

Я маю на увазі, команда SQL - це останній біт.


Що саме не так? Це не стосується того, що той самий файл працює, коли викликається з оболонки.
RalfFriedl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.