![成功登录IP地址列表](https://linux22.com/image/954926/%E6%88%90%E5%8A%9F%E7%99%BB%E5%BD%95IP%E5%9C%B0%E5%9D%80%E5%88%97%E8%A1%A8.png)
我知道我需要查看 /var/log/auth.log,但我似乎无法仅 grep 成功的 IP 地址。我希望以以下格式输出到另一个文件:
Accepted from <username /> from <ipaddress /> port <port /> at <datetime />
其目的是由开发 nginx 网络服务器运行一个 cron 作业,该作业将运行一个 cron 作业来记录并只允许使用公钥通过 ssh 登录的最新 IP 访问页面(如果这提供了一些上下文)。
答案1
您可以使用:
grep -Po 'sshd.*\KAccepted publickey for [a-z]+ from [0-9.]+ port [0-9]+' /var/log/auth.log >> /path/to/outfile
在哪里grep
的选项-P
将启用 Perl 风格的正则表达式PCRE 函数(使用\K
)并且-o
仅打印匹配的捕获部分。
sshd
将确保该行仅与日志中的 SSH 相关的身份验证行匹配...\K
将从打印中排除其左侧的内容,以便您不会在输出中看到它。
Accepted
将根据身份验证日志语法匹配成功的身份验证。
publickey
将仅匹配该身份验证方法,但您可以包含其他方法,例如password
通过“或”|
修饰符将它们拆分,例如[publickey|password]
匹配两者或匹配任何字母表达式(单词/方法),您可以使用[a-z]+
甚至匹配任何一个或多个字符.+
。
[a-z]+
应该匹配字母小写(用户名),[0-9.]+
应该匹配数字和点(IP),并且[0-9]+
应该匹配数字(端口)...注意+
是一个量词,它将匹配至少一个或多个前面的表达式。
因此,整个 RegEx 应该匹配如下行:
2024-01-16T17:26:34.896742+03:00 localhost sshd[1140156]: Accepted password for ubuntu from 127.0.0.1 port 54208 ssh2
...像这样打印:
Accepted password for ubuntu from 127.0.0.1 port 54208
...并且 shell 附加重定向将附加输出到路径中>>
命名的文件,如果不存在则创建它。outfile
/path/to/outfile
请注意,如果在 CRON 中用作 cronjob,则建议指定可执行文件的完整路径,/bin/grep
而不是仅仅grep
因为后者将依赖于您的搜索路径来解析,并且这可能与 CRON 可用的搜索路径变量不同,尤其是当作为用户调用root
或添加到系统范围的 crontab 时。
为了进一步处理和格式化,您还可以使用其他更丰富的文本处理工具,例如 AWK:
awk '
/sshd.*Accepted .+ for [a-z]+ from [0-9.]+ port [0-9]+/ {
print "Accepted from <" $7 " /> from <" $9 " /> port <" $11 " /> at <" $1 " />"
}
' /var/log/auth.log >> /path/to/outfile
... 打印一些您喜欢的格式的内容:
Accepted from <ubuntu /> from <127.0.0.1 /> port <54208 /> at <2024-01-16T17:26:34.896742+03:00 />
答案2
写这篇文章的时候我非常累,我知道可能有更好的方法。但这是我的尝试。
我猜你想在每行末尾打印找到的每行的时间戳。我使用 很快地写了这个awk
,我认为可能有更好的方法来实现这一点,但是通过使用awk
我们可以获取位置列。 awk
假设 [[空格]] 是字段分隔符。
如果我们执行awk
如下代码:
awk '/Accepted publickey/ {print}' /var/log/auth.log
是/Accepted publickey/
我们正在寻找的精确匹配,并且{print}
没有任何字段将整行打印到屏幕上,因此我们得到如下一行:
Jan 15 21:11:07 terrance-ubuntu sshd[468972]: Accepted publickey for terrance from 127.0.0.1 port 52736 ssh2: RSA SHA256:<MyReallyLongKey>
awk
默认情况下,将空格作为字段分隔符。如果您想要其他内容(例如冒号) ,:
则可以在-F:
之前指定它'/Accepted publickey/'
。使用空格作为字段分隔符,则字段1
将是 Jan,2
将是 15,3
将是 21:11:07,依此类推。
您可以awk
指定要打印的字段{print $1,$2}
等等。
抓取您在问题中输入的内容,字段将是 1、2、3,然后是 6 - 13。此外,awk
可以按您想要的顺序打印出字段(用逗号分隔),也可以在“引号”中写入文本:
awk '/Accepted publickey/ {print $6,$7,$8,$9,$10,$11,$12,$13,"at",$3,"on",$1,$2}' /var/log/auth.log
我知道这条awk
线很难看,但它会产生如下的线:
Accepted publickey for terrance from 127.0.0.1 port 52736 at 21:11:07 on Jan 15
然后使用该命令将其写入 root 拥有的日志中tee -a
。
tee
手段read from standard input and write to standard output and files
和-a
附加到文件的方法。
因此,您的命令可能如下所示:
awk '/Accepted publickey/ {print $6,$7,$8,$9,$10,$11,$12,$13,"at",$3,"on",$1,$2}' /var/log/auth.log | sudo tee -a /var/www/security/ssh_ips.log
答案3
grep -i ssh /var/log/auth.log | grep -i accept | tr -s " " | cut -d" " -f11 | sort -u
这将列出来自 auth.log 的所有 ssh 登录 ip,并进行排序。