我有一个名为/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数据库。