对于所有失败的ssh尝试,每天发送一次邮件的脚本

时间:2013-07-30 04:51:30

标签: bash ssh

这是我的第一个问题。我是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个,最后一个总是被跳过。关于我错过的任何想法?

提前致谢

1 个答案:

答案 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命令将其邮寄给自己,看看它是否有效。

希望这会有所帮助......