我每周都会收到以下错误电子邮件。这似乎是 cron、logrotate 或denyhosts 的问题。我不确定是哪一个。
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
有什么建议么?
答案1
/etc/logrotate.d/denyhosts 非常短,而且我似乎没有使用测试:
是的,但是它有这个:
postrotate
/etc/init.d/denyhosts restart > /dev/null
endscript
该脚本会执行如下操作
HOSTS_DENY=$(grep ^HOSTS_DENY $CONFIG | cut -d = -f 2)
test -e $HOSTS_DENY || touch $HOSTS_DENY
假设脚本是正确的,如果我不得不猜测,我会说你的配置文件中的 HOSTS_DENY 行格式不正确。
幸运的是,我们不必猜测,此命令将准确地显示错误来自何处:
/bin/sh -x /etc/init.d/denyhosts restart
答案2
对我来说,/etc/hosts.deny 或 /etc/cron.daily/logrotate 的第 91 行似乎存在错误。
确保 hosts.deny 中的条目格式有效。
答案3
我敢打赌,某个脚本的命令sh
中有两个等号(“==”),test
而不是一个等号(“=”)。 Bash 的内置命令test
允许==
或=
,但 Bourne shell(至少dash
在 Ubuntu 上)只允许=
。此外,我的/usr/bin/test
只允许一个等号。但请参阅此答案的底部,了解产生相同错误的其他示例。
我会查看logrotate.conf
是否有第 91 行可能存在该问题。
如果由于某种原因您想要重新创建错误消息以进行测试:
创建一个文件,我们将其命名为“a”,其内容如下:
echo 'In script "a"'
f="/etc/hosts.deny"
test $f == "foo"
现在做:
sh a
你应该得到:
In script "a"
test: 3: /etc/hosts.deny: unexpected operator
您还可以使用以下任一方法重现类似的错误:
sh -c "test /etc/hosts.deny +"
sh -c "test /etc/hosts.deny -"
sh -c "test /etc/hosts.deny /"
sh -c "test /etc/hosts.deny *"
编辑:请尝试以下方法来缩小搜索范围:
$ su -
$ find /etc -type f | xargs awk 'FNR==91 && /test/ {print FILENAME, $0}'
您将以su
root 身份运行find
/awk
命令。它将显示文件名和文件的第 91 行(如果该行出现单词“test”),则显示 下的每个文件的文件名和第 91 行/etc
。然后您可以查找不正确的运算符。
答案4
/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”实例位于不相关的文件中。
cron.daily/logrotate 作业指向 /usr/sbin/logrotate(一个二进制文件)——如果错误在那里,我可以在哪里检查源代码?