Cronjob 脚本不会传递 mysql 密码

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 中工作?

答案1

像这样将登录凭据放入命令行是有风险的,因为任何可以查看进程列表的人都可以查看这些凭据。更好的选择是将这些凭据放入选项文件(例如 ~/.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/en/option-files.html

答案2

您需要使用不同的命令。

类似这样的事情应该可以工作:

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

可能需要根据您的需要进行调整,而且我不能 100% 确定如何选择数据库。

答案3

顺序错误,最后一行,管道符之前的内容应该在行末。

我的意思是,SQL 命令是最后一点。

相关内容