Linux 如何grep日志文件中变量的下一个实例?
所以我试图解析FTP日志,看看某个用户是否安全地登录。到目前为止,在用户登录之后,我已经有了这条消息来拉动接下来的几行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
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行,这让我感到疑惑
我采用了一种稍微不同的方法,在这种方法中,我只做了最少的假设(基于对日志文件内容的有限了解):
#/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 -----