数据整理
参考资料
- missing-semester只是简单介绍, 正则表达式的更具体的内容参见《正则表达式必知必会》[美] Ben Forta
- 正则表达式教程
SSH
先打开wsl, 然后输入ssh tuofeilun
即可登录
(或用termius)
Claude Conversation
Prompt:
ssh myserver journalctl | grep sshd | grep "Disconnected from" | sed 's/.*Disconnected from //'
解释一下
Response:
这段代码是一个shell命令链,用于分析SSH服务器的日志并提取特定信息。我来逐步解释:
ssh myserver journalctl
: 通过SSH连接到名为”myserver”的服务器,并运行journalctl
命令。journalctl是一个用于查询和显示systemd日志的工具。| grep sshd
: 使用管道()将前一个命令的输出传递给grep,只保留包含”sshd”(SSH守护进程)的日志条目。 | grep "Disconnected from"
: 进一步筛选,只保留包含文本”Disconnected from”的日志条目。这些是记录SSH连接断开的日志。| sed 's/.*Disconnected from //'
: 使用sed(流编辑器)来处理过滤后的文本。这个sed命令使用正则表达式s/.*Disconnected from //
,它会删除每行中从开头到”Disconnected from “这部分文本(包括这部分文本)。
整体来说,这个命令链的目的是从远程服务器的系统日志中提取所有SSH断开连接的记录,并只显示每条记录中”Disconnected from”之后的部分,通常这部分包含了客户端的IP地址、用户名等信息。
这是用于快速查看谁曾经连接到服务器,以及他们是何时断开连接的实用工具。
Prompt:
.* 这两个字符起到什么作用?
Response:
.
和 *
是正则表达式中的两个特殊字符,当它们组合在一起(.*)
)时有特定的含义:
.
(点号):匹配任意单个字符,除了换行符。*
(星号):表示前面的字符可以重复零次或多次。
当组合为 .*
时,它们一起匹配任意数量的任意字符(包括零个字符)。
在命令 sed 's/.*Disconnected from //'
中,.*Disconnected from
表示:
“从行的开始位置,匹配任意数量的任意字符,一直到并包括文本 ‘Disconnected from ‘ (注意结尾的空格也包括在内)”
这就是为什么该sed命令能够删除每行中从开头到”Disconnected from “的所有内容,只保留该文本之后的部分(通常是IP地址和用户信息)。
这是正则表达式中一种常见的模式,用来”贪婪地”匹配和删除不需要的文本前缀。
Prompt:
sed、正则表达式分别有什么用?是不是只能用于终端?
Response:
======
sed(Stream Editor)
sed 是一个流文本编辑器,主要用于文本转换。它的主要功能包括:
- 文本替换(最常用)
- 选择性地打印文本行
- 删除特定的行
- 在文件中插入和追加文本
- 对文本进行重新排序
sed 处理文本的方式是逐行读取输入流,对每行应用编辑命令,然后输出结果。
正则表达式
正则表达式是一种描述文本模式的特殊字符序列,可用于:
- 搜索特定模式的文本
- 验证文本格式(如电子邮件、电话号码)
- 提取文本的特定部分
- 替换文本中的特定模式
正则表达式使用特殊字符(如 .
, *
, ^
, $
, \d
, \w
等)来表示不同的匹配规则。
不仅仅用于终端
这两种工具不仅限于终端使用:
sed:
- 主要在Unix/Linux终端中使用
- 也可以在脚本文件中使用
- Windows中可以通过安装额外工具(如Git Bash, Cygwin)使用
正则表达式:
- 在几乎所有编程语言中都可以使用(Python, JavaScript, Java, C#等)
- 在许多文本编辑器和IDE中用于搜索和替换
- 在数据库查询中使用
- 在各种应用程序中用于表单验证
- 在网页内容提取和爬虫中广泛应用
正则表达式是一个通用工具,其在各种技术领域都有应用,而sed是一个特定工具,主要用于命令行环境下的文本处理。
Prompt:
ssh myserver journalctl | grep sshd | grep "Disconnected from" | sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/' | sort | uniq -c | sort -nk1,1 | tail -n10 | awk '{print $2}' | paste -sd,
详细地解释从第三行到最后一行
Response:
我来详细解释从第三行到最后一行的命令:
第三行:
这是一个复杂的sed命令,使用了扩展正则表达式(由-E
标志启用):
-E
:启用扩展正则表达式,提供更强大的模式匹配功能- 模式解析:
.*Disconnected from
:匹配从行首到”Disconnected from “的所有字符(invalid |authenticating )?
:可选匹配”invalid “或”authenticating “(问号表示前面的组可以出现0次或1次)user (.*)
:匹配”user “后面的所有字符,直到下一个空格,这部分被捕获为第二个组(即\2)[^ ]+
:匹配一个或多个非空格字符(通常是IP地址或主机名)port [0-9]+
:匹配”port “后面的一个或多个数字( \[preauth\])?$
:可选匹配行尾的” [preauth]”
\2
:仅保留第二个捕获组的内容,即用户名
第四行: | sort | uniq -c
sort
:按字母顺序对提取出的用户名列表进行排序uniq -c
:计算连续重复出现的用户名次数,并在每行前面加上计数值- 输出格式例如:”5 john”(表示用户john出现了5次)
第五行: | sort -nk1,1 | tail -n10
sort -nk1,1
:按第一列(计数值)进行数值排序-n
:按数字而非字符串排序-k1,1
:只考虑第一列进行排序
tail -n10
:只显示排序结果的最后10行,即出现次数最多的10个用户名
第六行: | awk '{print $2}' | paste -sd,
awk '{print $2}'
:只提取每行的第二列(用户名),忽略计数值paste -sd,
:-s
:将多行合并为一行-d,
:使用逗号作为分隔符
最终结果是一个逗号分隔的字符串,包含尝试SSH连接次数最多的10个用户名。
这整个命令链的目的是找出哪些用户名被最频繁地用于尝试SSH连接(可能是潜在的暴力破解攻击),并以一个简洁的逗号分隔列表呈现。