0

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

提前致谢

4

1 回答 1

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

希望这可以帮助...

于 2013-07-30T11:31:45.413 回答