回声来自shell脚本中的grep搜索

时间:2014-03-10 11:15:34

标签: linux bash shell

我有一个搜索身份验证失败的shell脚本。例如,如果给定文件包含以下行:

Mar 19 15:54:18 precise3 sshd[16516]: Failed password for lotte from 127.0.0.1 port 47384 ssh2

shell脚本将找到它并将结果写在一个单独的文件中:

date: date    username: username    client IP: ip-address

现在我有了发现身份验证失败的脚本,但是如何将失败的数据写入文件?脚本本身是:

#!/bin/bash
if egrep "sshd\[[0-9]+\]: Failed password for \w+ from [0-9.]+ port [0-9]+ ssh2$" /var/log/auth.log
then
    echo "date: date    username: username    client IP: ip-address" > /root/failedauth
else
    echo "No failed authentications found."
fi

3 个答案:

答案 0 :(得分:1)

使用awk:

awk '/Failed password/ {print "Date: "$1" "$2" "$3"\tUsername: "$9"\t\tClient IP: "$11 }' /var/log/auth.log >> /root/failedauth

上面只会找到所有失败的auth尝试并将它们记录在/ root / failedauth中 - 如果你想在没有结果的情况下回显一行,你可以这样做:

failures=$(awk '/Failed password/ {print "Date: "$1" "$2" "$3"\tUsername: "$9"\t\tClient IP: "$11 }' /var/log/auth.log)
test -n "$failures" && echo "$failures" >> /root/failedauth || echo "No failed auths found"

答案 1 :(得分:0)

首先,你的grep可以返回几个结果,所以你的脚本不能工作,或只是第一个结果。

我认为你必须将grep的结果保存在一个文件中并处理该文件的每一行。

答案 2 :(得分:0)

与Awk一起琐事。

awk '/sshd\[[0-9]+\]: Failed password for [-A-Za-z0-9_]+ from [0-9.]+ port [0-9]+ ssh2$/ {
    print "date: $1 $2 $3  user: $9  ip: $11" }' /var/log/auth.log >>/root/failedauth

如果没有失败的身份验证,脚本将不会打印任何内容。 (但failedauth文件的日期仍将更新。)