我有一个名为 /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 命令是最后一点。