我每周都会收到以下错误电子邮件。这似乎是 cron、logrotate 或拒绝主机的问题。我不确定是哪个。
Subject: Cron <root@vps> test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
/etc/cron.daily/logrotate:
test: 91: /etc/hosts.deny: unexpected operator
有什么建议么?
我每周都会收到以下错误电子邮件。这似乎是 cron、logrotate 或拒绝主机的问题。我不确定是哪个。
Subject: Cron <root@vps> test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
/etc/cron.daily/logrotate:
test: 91: /etc/hosts.deny: unexpected operator
有什么建议么?
是的,但它有这个:
那个脚本会做类似的事情
假设脚本是正确的,如果我不得不猜测我会说您的配置文件中的 HOSTS_DENY 行格式不正确。
幸运的是,我们不必猜测,这个命令会准确地告诉你错误来自哪里:
在我看来,/etc/hosts.deny 或 /etc/cron.daily/logrotate 的第 91 行似乎有错误。
确保 hosts.deny 中的条目格式正确。
我敢打赌,某个命令中有一个
sh
带有双等号(“==”)的脚本,test
而不是一个(“=”)。Bash 的内置test
允许==
或=
,但 Bourne shell(至少dash
在 Ubuntu 上)只允许=
. 另外,我/usr/bin/test
只允许单个相等。但是,请参阅此答案的底部以获取产生相同错误的其他示例。我会查看
logrotate.conf
它是否有可能存在该问题的第 91 行。如果由于某种原因,您想重新创建错误消息以进行测试:
创建一个文件,我们称之为“a”,内容如下:
现在做:
你应该得到:
您还可以使用以下任何方法重现类似的错误:
编辑:尝试以下方法来缩小搜索范围:
你将
su
root,然后运行find
/awk
命令。对于/etc
. 然后您可以查找不正确的运算符。在 /etc/logrotate.d/denyhosts 怎么样?
/etd/logrotate.d/denyhosts 很短,在我看来并没有使用测试:
/var/log/denyhosts {
create 0640 root root
missingok
weekly
rotate 7
compress
postrotate
/etc/init.d/denyhosts restart > /dev/null
endscript
}
/etc 中文件第 91 行的“test”唯一实例位于不相关的文件中。
/usr/sbin/logrotate(二进制文件)的 cron.daily/logrotate 作业点——如果存在错误,我在哪里可以检查源代码?
只是为了理智,你可能想使用:
看看测试程序是你认为的那样。一种防御性编程方法是在 cron 作业中使用命令的完整路径。这可以确保调用正确的二进制文件,并防止攻击者在您的 PATH 中替换另一个类似名称的命令。
以下是一些故障排除提示。我认为贾斯汀绝对是在正确的轨道上。问题可能出在您的拒绝主机设置中。但是让我们追踪它。
您最初从 logrotate 得到错误。所以运行 logrotate:
假设你得到一个错误,至少你有一个可重现的案例。现在让我们看看问题出在 logrotate 还是denyhosts 上。让我们使用我们在 logrotate 中看到的 denyhosts 命令:
如果这给你一个错误,你真的很接近追踪这个了。尝试从行尾删除 "> /dev/null" 以获取更多信息。在此处发布输出以寻求帮助。
但是,如果上述两个技巧都没有让您出错,但您仍然从 cron 作业中收到错误,那么您就有问题了。在尝试调试某些东西之间等待一周很糟糕。
在 /etc/crontab 中添加另一行。复制 cron.weekly 行,并将其粘贴到所有其他行的下方。然后对其进行编辑,使所有“何时”条目都是星号。
将其更改为:
然后它将一分钟运行一次,一整天,一整周。这显然不是您想留在那里的东西,但它有助于故障排除。
如果您在 cron 作业中看到从命令行运行脚本时看不到的错误,则几乎总是您的环境有所不同。首先检查路径。
卸载拒绝主机包后我遇到了同样的问题。确认您确实安装了该软件包:
如果安装了软件包,您将有“ii”作为前两个字符。例如,我安装了 openssh-server 并得到以下结果:
就我而言,我认为在删除包时没有成功删除 logrotate 配置,所以我手动 rm'd 它。