如何grep日志文件中的下一个变量实例?

时间:2013-01-24 17:09:57

标签: linux bash parsing grep

所以我试图解析FTP日志,看看某个用户是否安全登录。到目前为止,我已经在用户登录

后拉下了几行
cat proftpd.log.2 | grep -B 3 "USER $sillyvariable"

这是它创建的示例输出

::ffff:127.0.0.0 UNKNOWN ftp [04/Jan/2013:11:03:06 -0800] "AUTH TLS" 234 -
::ffff:127.0.0.0 UNKNOWN ftp [04/Jan/2013:11:03:06 -0800] "USER $sillyvariable" 331 -

现在这是我想要的完美示例,它显示 AUTH TLS 消息和 IP匹配。然而情况并非总是如此,因为许多用户不断登录和退出,并且大部分时间输出都是混乱的。

有没有办法我可以为USER $sillyvariable grep并找到他/她匹配的IP包含前一行中的“AUTH TLS”,这样我就知道他们安全登录了?我想你可以说我想要grep用户然后向后grep以查看它们来自哪里(匹配的IP)是否安全。我有点坚持这个,可以真正使用一些帮助。 谢谢!

2 个答案:

答案 0 :(得分:1)

$ grep -B3 'USER $sillyvariable' proftpd.log.2 |
  tac | awk 'NR==1 {IP=$1} $1==IP {print}' | tac
::ffff:127.0.0.0 UNKNOWN ftp [04/Jan/2013:11:03:06 -0800] "AUTH TLS" 234 -
::ffff:127.0.0.0 UNKNOWN ftp [04/Jan/2013:11:03:06 -0800] "USER $sillyvariable" 331 -

这使用tac来反转grep结果中的行。然后,它会查找IP地址与USER行中的IP地址匹配的所有行。最后,它再次运行tac以按原始顺序放回行。

答案 1 :(得分:0)

我意识到我参加这个聚会已经很晚了,但是我对AUTH声明的评论可能超过了3行,这让我感到疑惑。

我采用了一种稍微不同的方法,我做了最小的假设(基于对日志文件内容的有限了解):

  1. 每个IP地址只有一个用户(如果他们在防火墙后面,则可能不是真的)
  2. 对于每个AUTH条目,应该只有一个来自同一IP地址的“好”USER条目
  3. 在日志文件中包含条目的IP地址的排序列表将显示更多“USER”而非“AUTH”请求的任何IP地址,其中发出了“错误”请求
  4. 如果这些假设是合理/真实的,那么一个简单的bash脚本可以很好地为你提供你想要的东西(这是一个没有正确登录的用户列表 - 这不完全是你的要求):

    #!/bin/bash
    # first, find all the "correct" IP addresses that did the login "right", and sort by IP address:
    grep -F "AUTH TLS" $1 | awk '{print $1}' | sort > goodLogins
    
    # now find all the lines in the log file with USER and sort by IP address
    grep USER $1 | awk '{print $1}' | sort > userLogins
    
    # now see if there were user logins that didn't correspond to a "good" login:
    echo The following lines in the log file did not have a corresponding AUTH statement:
    echo
    sdiff goodLogins userLogins | grep "[<>]" | awk '{print $2 ".*USER"}' > badUsers
    grep -f badUsers $1
    echo -----
    

    请注意,这会留下三个您可能想要删除的临时文件(goodLogins,userLogins,badUsers)。我假设您知道如何使用上面的代码创建文本文件,将其设置为可执行(chmod u+x scrubLog),并使用日志文件的名称作为参数(./scrubLog proftpd.log.2)运行它。

    享受!

    PS - 我不确定“正确登录”是什么意思,但还有其他方法可以强制执行良好行为。例如,您可以阻止端口21,因此只有sftp(端口22)请求通过,您可以阻止匿名ftp,...但这不是您要求的。