每周 Cron / Logrotate / Denyhosts 错误

每周 Cron / Logrotate / Denyhosts 错误

我每周都会收到以下错误电子邮件。这似乎是 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}'

您将以suroot 身份运行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(一个二进制文件)——如果错误在那里,我可以在哪里检查源代码?

相关内容