所以我试图解析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)是否安全。我有点坚持这个,可以真正使用一些帮助。
谢谢!
答案 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行,这让我感到疑惑。
我采用了一种稍微不同的方法,我做了最小的假设(基于对日志文件内容的有限了解):
如果这些假设是合理/真实的,那么一个简单的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,...但这不是您要求的。