这是我的第一个问题。我是bash脚本的新手。我有一台服务器,我正在寻找一种方法来通知所有失败的ssh尝试,并每天给我发一次邮件。我正在使用Centos 6.3。
我当时正在编写一个脚本,以便在午夜自动发送邮件,当天所有失败的尝试。为此,我想我需要设置一个cron工作。那部分很清楚。就bah脚本而言,我的脚本如下:
chkssh(){
thismonth=$(date | awk {'print $2'})
thisdate=$(date | awk {'print $3'})
today=$thismonth" "$thisdate
cat /var/log/secure | grep ssh | grep Failed | grep "$today" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -n > /usr/local/temp/tempssh.txt
prev_ip=$(cat /usr/local/temp/tempssh.txt| head -1)
count=0
while read this_ip
do
if [ $prev_ip == $this_ip ];then
count=$((count+1))
prev_ip=$this_ip
else
echo "$count failed attempts from $prev_ip" >> /usr/local/temp/todayssh.txt
count=1
prev_ip=$this_ip
fi
done < /usr/local/temp/tempssh.txt
rm -rf /usr/local/temp/tempssh.txt
mail -r Monitor@mytestname.com -s "Daily Failed SSH reports" me@mytestname.com </usr/local/temp/todayssh.txt
这似乎是发送除了尝试ssh到服务器的最后一个ip之外的所有ip。例如,如果每次有3个ips和2个尝试,我的输出显示在前2个,最后一个总是被跳过。关于我错过的任何想法?
提前致谢
答案 0 :(得分:1)
我想我有答案。当您的变量退出循环时,您的最后一个IP及其关联计数将由其变量保留,但这些值不会写入您的todayssh.txt
文件(因为退出循环)。尝试在循环退出后添加一个语句,将$ prev_ip和$ count再次写入todayssh.txt文件 - 我认为应该给你最后的IP及其计数。
while read this_ip
do
if [ $prev_ip == $this_ip ];then
count=$((count+1))
prev_ip=$this_ip
else
echo "$count failed attempts from $prev_ip" >> /usr/local/temp/todayssh.txt
count=1
prev_ip=$this_ip
fi
done < /usr/local/temp/tempssh.txt
echo "$count failed attempts from $prev_ip" >> /usr/local/temp/todayssh.txt
然后使用mail命令将其邮寄给自己,看看它是否有效。
希望这会有所帮助......