在我的 debian squeeze 服务器上,我在 chkrootkit 日志中收到大量这些错误:
/usr/bin/find: Prozeß "head" wurde durch das Signal 13 abgebrochen.
/usr/bin/find: Prozeß "head" wurde durch das Signal 13 abgebrochen.
意思是
head terminated by signal 13
A谷歌搜索给出了很多相同的问题,但没有解决方案。
它来自以下几行/usr/sbin/chkrootkit
:
if [ `echo abc | head -n 1` = "abc" ]; then
fileshead="`${find} ${ROOTDIR}tmp ${ROOTDIR}var/tmp ${findargs} -type f -exec head -n 1 {} \; | $egrep '#!.*php' 2> /dev/null`"
else
fileshead="`${find} ${ROOTDIR}tmp ${ROOTDIR}var/tmp ${findargs} -type f -exec head -1 {} \; | grep '#!.*php' 2> /dev/null`"
fi
当我直接以 root 身份进入时:
/usr/bin/find /var/tmp -type f -exec head -1 {} \; | grep php 2> /dev/null;date
我得到同样的错误。egrep
相反没有什么区别。
答案1
chkrootkit 在 /tmp/ 和 /var/tmp 目录中搜索 PHP 文件。最有可能的是,那里的某些文件触发了该错误。就我而言,这是一个包含大量零字节的测试文件 - 删除该文件解决了问题。
答案2
以下是 Alex 答案背后的想法的简单实现。我注释掉了主 chkrootkit shell 脚本第 1241 行的代码,并在其后面添加了替换代码:
###if [ `echo abc | head -n 1` = "abc" ]; then
### fileshead="`${find} ${ROOTDIR}tmp ${ROOTDIR}var/tmp ${findargs} -type f -exec head -n 1 {} \; | $egrep '#!.*php' 2> /dev/null`"
###else
### fileshead="`${find} ${ROOTDIR}tmp ${ROOTDIR}var/tmp ${findargs} -type f -exec head -1 {} \; | grep '#!.*php' 2> /dev/null`"
###fi
SUFF=`date "+%m%d%H%M%S.%N"`
echo > /tmp/matches.$SUFF
for F in `${find} ${ROOTDIR}tmp ${ROOTDIR}var/tmp ${findargs} -type f -print`
do
read line <$F
match=`echo "$line" | grep '#!.*php' 2> /dev/null`
if [ -n "$match" ]
then
echo "$F : $match" >> /tmp/matches.$SUFF
fi
done
fileshead=`cat /tmp/matches.$SUFF`
rm -f /tmp/matches.$SUFF
这有效,并允许 chkrootkit 完成。
答案3
问题是,head
在退出时关闭stdout
,第一个head
输出正常工作,但对标准输出的任何其他写入都会失败SIGPIPE
。
您可能想使用不同的方法
head -q -n1 $(find /somedir/ -type f)|grep someword
编辑
将如下脚本保存在某处,根据需要命名,使其可执行并head
在 chkrootkit 中替换。
#!/bin/sh
shift
test -f "$1" || exit 1
read line <$1
echo "$line"
它不完全head
兼容,因此仅在您在此处发布的 chkrootkit 部分使用它。