下面的我的bash脚本没有以HTML代码的形式提供所需的输出。
True
它给出的输出看起来像这样......
is
当我需要输出看起来像这样:
#!/bin/sh
if [ $# -eq 0 ]
then
echo "Usage : flog LOGFILE"
exit 1
fi
logfile=$1
sed -i 's/invalid/<UNKNOWN>/g' $logfile
grep "Failed password for" $logfile | cut -d" " -f4 | sort | uniq -c | sort -k1,1nr -k2,2 > templog
sed -i 's/</\$lt;/g;s/>/\>/g;s/^/<br \/>/g;' templog
echo "<html>" > flog.html
echo "<body><h1>Failed Login Attempts Report as of `date` </h1>" >> flog.html
cat templog >> flog.html
echo "/body" >> flog.html
echo "</html>" >> flog.html
cat flog.html
任何人都可以帮助我吗?我需要改变什么?我知道这可能是一个形成不良的问题,但我给了他一个机会。
答案 0 :(得分:2)
问题出在您的部分:
logfile=$1
sed 's/invalid/<UNKNOWN>/g' $logfile
grep "Failed password for" $logfile | cut -d" " -f4 | sort | uniq -c | sort -k1,1nr -k2,2 > templog
sed 's/</\$lt;/g;s/>/\>/g;s/^/<br \/>/g;' templog
首先:使用引号。这可能不是您当前问题的根源,但它很可能在将来会出现问题。所以:
logfile="$1"
您的问题的主要问题可能是cut -d" " -f4
,更具体地说是4
。这选择了第四个字段,显然是时间。我可以建议它可能是5
,但我不知道你的输入是什么样的。这肯定不是你在评论中回答的内容。
所以,它会建议:
uidfield=5
logfile="$1"
sed -i 's/invalid/<UNKNOWN>/g' "$logfile" |
grep "Failed password for" |
cut -d" " -f$uidfield |
sort |
uniq -c |
sort -n |
sed -i 's/</\</g;s/>/\>/g;s/^/<br \/>/g;' > templog
并使用uidfield=5
玩,直到找到正确的字段。
另一句话:在s/^/<br \/>/g
中,g
有点过头了,因为每行只有一行开头。