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

Linux 如何grep日志文件中变量的下一个实例?,linux,bash,parsing,grep,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:0

所以我试图解析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消息和IPs匹配。然而,情况并非总是如此,因为许多用户不断地登录和注销,而且大多数时候输出都是混乱的

是否有一种方法可以搜索
用户$sillyvariable
并找到他/她匹配的IP,其中包含前一行中的“AUTH TLS”,以便我知道他们安全登录?我想你可以说我想对用户进行grep,然后向后grep,看看他们来自的连接(匹配的IP)是否安全。我被这件事缠住了,真的需要一些帮助。 谢谢


这使用
tac
来反转grep结果中的行。然后,它会查找IP地址与
USER
行中的IP地址匹配的所有行。最后,它再次运行
tac
,将这些行恢复到原来的顺序。

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

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

  • 每个IP地址有一个用户(如果他们在防火墙后面,则可能不是真的)
  • 对于每个身份验证条目,应该有一个来自同一IP地址的“良好”用户条目
  • 对于发出“错误”请求的任何IP地址,在日志文件中有条目的IP地址的排序列表将显示更多的“用户”请求,而不是“身份验证”请求
  • 如果这些假设是合理的/正确的,那么一个简单的bash脚本可以很好地为您提供您想要的内容(这是一个未正确登录的用户列表-这不是您想要的):

    #/bin/bash
    #首先,找到登录“正确”的所有“正确”IP地址,并按IP地址排序:
    grep-F“AUTH TLS”$1 | awk'{print$1}'| sort>goodLogins
    #现在在日志文件中找到所有包含USER的行,并按IP地址排序
    grep用户$1 | awk'{print$1}'| sort>userLogins
    #现在查看是否存在与“良好”登录不一致的用户登录:
    echo日志文件中的以下行没有相应的AUTH语句:
    回声
    sdiff goodLogins userLogins | grep“[]”| awk'{print$2“.*USER”}>badUsers
    grep-f bad用户$1
    回音-----
    
    请注意,这会留下三个临时文件(goodLogins、userLogins、badUsers),您可能希望删除它们。我假设您知道如何使用上述代码创建文本文件,将其设置为可执行(
    chmod u+x scrubLog
    ),并以日志文件的名称作为参数运行它(
    /scrubLog proftpd.log.2

    享受吧


    PS-我不知道你所说的“正确登录”是什么意思,但还有其他方法来实施良好的行为。例如,您可以阻止端口21,这样只有sftp(端口22)请求通过,您可以阻止匿名ftp。。。但这不是你要问的。

    你能做两个greps吗?第一个查找用户,第二个查找前一行,只查找匹配的行。如果你愿意做这类事情,在Perl中这将是相当简单的。如果你还没有…,学习这门语言可能是一个很好的练习。弗洛里斯,你能给我举个例子吗?我理解你的逻辑,但我不太清楚怎么做。谢谢。@JonahBishop我目前是一名Jr.系统管理员,愿意学习任何可能对我有长远帮助的东西,你能给我一个基本的例子说明如何做到这一点吗?我尝试在PHP中使用strrpos(),但事情变得太复杂了。我想应该有个更简单的办法。你是个天才,我的朋友。我以前从未听说过
    tac
    。非常感谢您,感谢您正确编辑我的帖子,堆栈溢出上的长时间潜伏者,并最终在今天创建了一个帐户,因为我无法在这里找到一个解决方案。再次感谢!如果日志文件中有另一行“潜入”,则不确定这是否有效。。。如果AUTH语句不在前面三行中怎么办?我认为一旦找到用户的IP地址,就需要重新处理整个日志文件。但也许我误解了问题陈述-OP接受了这一正确答案…@Floris同意,
    -B3
    不可靠。一个健壮的解决方案可能会更加棘手。您还必须确保前面的身份验证与此用户行匹配,并且中间没有其他用户行。实际上,我正在查找身份验证未显示的实例,以便我可以向自己发送一个用户登录错误的警报。因此,我看到的唯一缺陷是,如果你抓住我的流量,我就不能做出像B*或B*/*这样的东西。然而,我不相信它会超过一百行。如果有一个解决方案,只要有它
    grep-B'整个文件'
    ,那就太棒了。非常感谢你,我总是喜欢找到解决问题的其他解决方案,这一个非常棒。通过“正确登录”,我的意思是让认证TLS在同一分钟内匹配其IP和日期戳,以减少误报。至于封锁21号港口,这是我向我的雇主提出的第一个建议,但我们无法实施该规则,原因不明。再次感谢!
    $ 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 -
    
    #!/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 -----