Post

数据整理

数据整理

参考资料


  • 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服务器的日志并提取特定信息。我来逐步解释:

  1. ssh myserver journalctl: 通过SSH连接到名为”myserver”的服务器,并运行journalctl命令。journalctl是一个用于查询和显示systemd日志的工具。
  2. | grep sshd: 使用管道()将前一个命令的输出传递给grep,只保留包含”sshd”(SSH守护进程)的日志条目。
  3. | grep "Disconnected from": 进一步筛选,只保留包含文本”Disconnected from”的日志条目。这些是记录SSH连接断开的日志。
  4. | 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连接(可能是潜在的暴力破解攻击),并以一个简洁的逗号分隔列表呈现。

This post is licensed under CC BY 4.0 by the author.