我每周都收到以下错误邮件。 这似乎是与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
有什么build议么?
/etc/logrotate.d/denyhosts很短,似乎并没有使用testing:
是的,但它有这样的:
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
假设脚本是正确的,如果我不得不猜测我会说你的configuration文件中的HOSTS_DENY行是不正确的。
幸运的是,我们不必猜测,这个命令会告诉你错误来自哪里:
/bin/sh -x /etc/init.d/denyhosts restart
对我来说,看起来像/etc/hosts.deny或/etc/cron.daily/logrotate的第91行有错误。
确保hosts.deny中的条目格式有效。
我敢打赌,在某个地方有一个sh脚本,在test命令中有一个双等号(“==”),而不是一个单一的(“=”)。 Bash的内buildtest允许==或= ,但是Bourne shell(至less在Ubuntu上)只允许= 。 另外,我的/usr/bin/test只允许单个的相等。 但是对于产生相同错误的其他示例,请参阅此答案的底部。
我会看看logrotate.conf ,看看它是否有一个线91可能有这个问题。
如果出于某种原因,您想重新创buildtesting的错误消息:
创build一个文件,我们称之为“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 *"
编辑 :尝试以下缩小search范围:
$ su - $ find /etc -type f | xargs awk 'FNR==91 && /test/ {print FILENAME, $0}'
你会su到root,然后运行find / awk命令。 它会显示文件名和文件的第91行,如果该行出现“test”一词,则表示/etc下的每个文件。 那么你可以查找不正确的操作符。
如何在/etc/logrotate.d/denyhosts?
/etd/logrotate.d/denyhosts非常短,似乎并没有使用testing:
/var/log/denyhosts {
create 0640 root root
missingok
weekly
rotate 7
compress
postrotate
/etc/init.d/denyhosts restart > /dev/null
endscript
}
/ etc中文件的第91行上的“testing”的唯一实例是不相关的文件。
cron.daily / logrotate作业指向/ usr / sbin / logrotate(二进制文件) – 如果有错误,我可以在哪里检查源代码?
为了理智,你可能想要使用:
foo:~# which test /usr/bin/test
看看testing程序是你认为的。 一种防御性的编程方法是在cron作业中使用命令的完整path。 这可以确保正确的二进制文件被调用,并且可以防止攻击者在PATH的早期replace另一个类似命名的命令。
这里有一些故障排除技巧。 我认为贾斯汀绝对是正确的。 问题可能是在你的拒绝主机设置。 但是让我们来追踪下来
你最初从logrotate得到错误。 所以运行logrotate:
logrotate /etc/logrotate.conf
假设你有一个错误,至less你有一个可重复的情况。 现在让我们看看问题是在logrotate还是拒绝主机。 让我们使用我们在logrotate中看到的denyhosts命令:
/etc/init.d/denyhosts restart > /dev/null
如果这给你一个错误,你真的接近跟踪这个。 尝试从行尾取下“> / dev / null”以获取更多信息。 在这里发布输出以获得帮助。
但是,如果上述两个技巧都没有给你一个错误,但是你仍然从cron作业中得到错误,你就有问题了。 等待一个星期之间的尝试debugging东西很烂。
将另一行添加到/ etc / crontab。 复制cron.weekly行,并将其粘贴到所有其他行的下面。 然后编辑它,以便所有“when”条目都是星号。
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
将其更改为:
* * * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
然后整整一周,整整一整天都会运行一次。 这显然不是你想要离开的地方,但它可以帮助你排除故障。
如果在命令行运行脚本时看不到cron作业中的错误,则几乎总是在您的环境中发生变化。 首先检查path。
卸载denyhosts软件包后,出现同样的问题。 确认你确实已经安装了软件包:
mlambie@prime:~$ dpkg -l | grep denyhosts rc denyhosts 2.6-6.1ubuntu1 a utility to help sys admins thwart SSH crac
如果安装了软件包,则会有“ii”作为前两个字符。 例如,我安装了openssh-server并得到这个结果:
mlambie@prime:~$ dpkg -l | grep openssh-server ii openssh-server 1:5.3p1-3ubuntu7 secure shell (SSH) server, for secure access
在我的情况下,我认为logrotateconfiguration在删除软件包时没有被成功删除,所以我手动删除了它。