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) 

…但是,当我从控制台作为根运行它,它的工作原理:

 # time /etc/cron.daily/99loganalyzer-expire real 1m16.391s user 0m0.012s sys 0m0.008s 

我如何传递这个mysql用户的凭据,以便他们能够在cronjob中工作?

将login凭证放入命令行中是有风险的,因为任何可以查看进程列表的人都可以查看这些凭证。 更好的select是将这些凭证放入〜/ .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%确定如何select数据库。