作者: 启鑫

  • Windows 文件文本搜索:PowerShell 与 findstr

    在Windows操作系统中,常常需要快速查找文件中的指定文本内容。这可以帮助我们在处理日志文件、源代码或其他大型文件时,迅速定位到关键信息。Windows系统提供了几种方法来完成这项任务,最常用的包括使用PowerShell的Select-String命令和命令提示符中的findstr工具。

    具体选择哪个工具,取决于你对功能的需求:

    • 如果你需要更强大的正则表达式支持和更详细的输出,PowerShell的Select-String是更好的选择。
    • 如果你需要快速搜索,并且只对简单的文本匹配感兴趣,findstr则更为高效和便捷。

    1. 使用PowerShell进行文本搜索

    PowerShell是Windows自带的命令行脚本环境,它功能强大,能够执行多种任务,尤其适合处理文件内容。通过Select-String命令,用户可以轻松地在文件中查找指定的文本。

    示例:使用PowerShell的Select-String

    假设你有一个名为large_file.txt的文本文件,想要在其中查找字符串search_string。可以使用以下命令:

    Get-Content "large_file.txt" | Select-String "search_string"

    命令解释:

    • Get-Content "large_file.txt":读取文件内容。
    • Select-String "search_string":搜索并显示包含search_string的所有行。

    该命令会返回所有匹配的行,及其对应的行号,便于用户快速定位到相关内容。

    使用正则表达式进行高级搜索

    Select-String命令支持正则表达式,允许用户进行更复杂的文本匹配。例如,如果你想匹配以“log”开头的字符串,可以使用如下命令:

    Get-Content "large_file.txt" | Select-String "^log"

    这将查找所有以”log”开头的行。

    显示上下文

    如果你希望在匹配的行前后显示几行上下文,可以使用-Context参数:

    Get-Content "large_file.txt" | Select-String "search_string" -Context 2,2

    这将显示匹配行的前后各2行内容,帮助你更好地理解匹配的上下文。

    2. 使用命令提示符中的findstr

    findstr是Windows命令提示符中的一个文本搜索工具,适用于快速查找文件中的指定字符串。尽管它不像PowerShell的Select-String那么强大,但它对于简单的文本搜索来说非常高效。

    示例:使用findstr命令

    在命令提示符下,你可以使用如下命令来搜索文件large_file.txt中的search_string

    findstr "search_string" large_file.txt

    命令解释:

    • "search_string":指定你要查找的文本。
    • large_file.txt:指定要搜索的文件。

    findstr会输出包含匹配文本的所有行,并显示相应的行号。

    忽略大小写

    如果你想在搜索时忽略大小写,可以使用/i选项:

    findstr /i "search_string" large_file.txt

    这将忽略大小写进行匹配。

    显示行号

    要显示匹配文本所在的行号,可以使用/n选项:

    findstr /n "search_string" large_file.txt

    这将输出匹配文本及其所在的行号。

    PowerShell与findstr的对比

    特性PowerShell (Select-String)findstr
    正则表达式支持完全支持复杂正则表达式支持简单正则表达式
    功能丰富提供更详细的输出信息,如上下文、匹配行数等输出较为简洁,仅显示匹配行
    易用性更适合有一定脚本经验的用户,功能强大简单快速,适合快速操作
    性能处理大型文件时可能稍慢,但支持流式数据适用于快速搜索小文件
  • 使用 opkssh 实现 OpenID 身份验证与 SSH 连接

    opkssh 是一个结合 OpenID 身份验证和 SSH 连接的工具,它能简化 SSH 密钥的管理,并提升 SSH 连接的安全性。与传统的 SSH 密钥验证方式不同,opkssh 通过 OpenID 身份验证来生成 SSH 密钥,使得用户的身份验证更加灵活与安全。

    1. 安装 opkssh

    opkssh 可以在 Windows、macOS 和 Linux 系统上使用。下面是详细的安装步骤:

    在 Windows 上安装 opkssh

    1. 打开 PowerShell 或命令提示符。
    2. 执行以下命令,下载并安装 opkssh
    curl https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-windows-amd64.exe -o opkssh.exe
    1. 下载完成后,你将获得 opkssh.exe 文件。你可以将它放在任何你想要的目录下,并通过命令行运行它。

    在 macOS 上安装 opkssh

    1. 打开终端。
    2. 执行以下命令,下载并安装 opkssh
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-osx-amd64 -o opkssh; chmod +x opkssh
    1. 这将下载 opkssh 文件并授予执行权限。你可以将其移动到 /usr/local/bin/ 目录,方便在终端中全局使用。

    在 Linux 上安装 opkssh

    Linux 系统支持多种架构。根据你的系统架构(x86_64 或 ARM64),选择相应的安装命令。

    • 对于 x86_64 架构的 Linux 系统
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-amd64 -o opkssh; chmod +x opkssh
    • 对于 ARM64 架构的 Linux 系统
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-arm64 -o opkssh; chmod +x opkssh

    安装完成后,你可以将 opkssh 文件移动到 /usr/local/bin/ 目录,或将其保留在当前目录。

    2. 使用 opkssh 进行身份验证与 SSH 登录

    安装完成后,你可以开始使用 opkssh 进行身份验证和 SSH 连接。

    登录并生成 SSH 密钥

    1. 在终端或命令行中运行以下命令:
    opkssh login
    1. 该命令将打开一个浏览器窗口,要求你选择一个 OpenID 提供商并完成身份验证。你可以选择 Google、GitHub 等常见的 OpenID 提供商来进行登录。
    2. 登录成功后,opkssh 会在你的本地系统中生成一个 SSH 公钥文件,默认位置是 ~/.ssh/id_ecdsa。这个密钥对应的是你的 OpenID Token,凭此可以通过 SSH 连接到服务器。

    默认 SSH 密钥过期时间

    生成的 SSH 密钥默认会在 24 小时后过期。到期后,你需要重新运行 opkssh login 来生成新的密钥。

    使用 SSH 登录

    一旦密钥生成成功,你可以像使用传统 SSH 密钥一样使用它来登录到远程服务器。执行以下命令:

    ssh [email protected]

    使用 SFTP 进行文件传输

    你还可以使用 opkssh 生成的 SSH 密钥进行 SFTP 文件传输:

    sftp [email protected]

    3. 自定义 SSH 密钥名称

    opkssh 允许你为生成的密钥指定自定义名称,方便管理。

    登录时指定自定义密钥名称

    如果你希望使用特定名称的密钥,可以在执行 opkssh login 时指定密钥名称:

    opkssh login -i opkssh_server_group1

    使用自定义密钥进行 SSH 连接

    在使用 SSH 时,你可以通过 -i 参数指定自定义的密钥文件。假设你使用了 opkssh_server_group1 作为密钥名称,可以执行以下命令:

    ssh -o "IdentitiesOnly=yes" -i ~/.ssh/opkssh_server_group1.pub -i ~/.ssh/opkssh_server_group1 [email protected]

    这里的 -o "IdentitiesOnly=yes" 参数会确保 SSH 仅使用指定的密钥进行身份验证,避免使用其他默认密钥进行干扰。

    4. 在服务器端安装和配置 opkssh

    为了让你的服务器支持使用 opkssh 进行身份验证,你需要在服务器上安装并配置它。

    安装 opkssh 在服务器上

    1. 登录到你的服务器。
    2. 使用以下命令安装 opkssh
    wget -qO- "https://raw.githubusercontent.com/openpubkey/opkssh/main/scripts/install-linux.sh" | sudo bash

    这条命令会自动下载并安装 opkssh,并将其放置在 /usr/local/bin/ 目录中,同时配置 SSH 服务以支持 opkssh 作为附加的身份验证机制。

    允许单个用户使用 opkssh 登录

    如果你想允许某个用户(例如 [email protected])通过 OpenID 进行身份验证并作为 root 登录到服务器,可以执行以下命令:

    sudo opkssh add root [email protected] google

    允许用户组使用 opkssh 登录

    如果你希望允许某个用户组(例如 ssh-users)中的所有成员通过 OpenID 进行身份验证并作为 root 登录,可以使用以下命令:

    sudo opkssh add root oidc:groups:ssh-users google
  • 加密算法分类与特性详解

    加密算法是用于将可读数据(称为明文)转换为不可读数据(称为密文)的过程。这个过程旨在保护数据的机密性,防止未经授权的访问。加密算法在信息安全领域扮演着至关重要的角色,广泛应用于数据存储、网络通信、身份验证等各个方面。

    1. 对称加密算法 (Symmetric Cryptography)

    • 定义: 加密和解密使用相同的密钥
    • 特点:
      • 速度快: 由于加解密过程相对简单,计算速度通常较快。
      • 密钥管理复杂: 通信双方必须在安全的情况下共享密钥,密钥的生成、分发、存储和更新都比较困难。
      • 安全性依赖于密钥: 一旦密钥泄露,所有加密的数据都将暴露。
    • 常见算法:
      • 高级加密标准 (AES): 目前最广泛使用的对称加密算法,被认为是安全且高效的标准。支持多种密钥长度(128位、192位、256位)。
      • 数据加密标准 (DES): 较早的对称加密算法,密钥长度较短(56位),现在已被认为不够安全,容易受到暴力破解。
      • 三重数据加密标准 (3DES): 为了增强DES的安全性而设计,通过对数据进行三次DES加密。虽然比DES更安全,但效率较低,逐渐被AES取代。
      • Blowfish 和 Twofish: 由Bruce Schneier设计的快速且安全的对称加密算法。
      • 流密码 (Stream Ciphers): 如RC4(虽然现在已被认为不安全)。流密码逐位或逐字节地加密数据。
      • 分组密码 (Block Ciphers): 如AES、DES、3DES、Blowfish等。分组密码将数据分成固定大小的块进行加密。

    2. 非对称加密算法 (Asymmetric Cryptography)

    • 定义: 加密和解密使用不同的密钥,通常是一对相关的密钥:公钥 (Public Key)私钥 (Private Key)
    • 特点:
      • 密钥管理相对简单: 公钥可以公开分发,私钥由持有者秘密保管。
      • 安全性高: 即使公钥被泄露,只要私钥不泄露,数据仍然安全。
      • 速度较慢: 相较于对称加密,非对称加密的计算复杂度更高,加解密速度较慢。
    • 常见算法:
      • RSA (Rivest–Shamir–Adleman): 最早且广泛使用的非对称加密算法之一,基于大素数分解的数学难题。常用于数字签名、密钥交换和数据加密。
      • 椭圆曲线密码学 (ECC): 基于椭圆曲线数学的非对称加密算法。在提供与RSA相当安全性的前提下,密钥长度更短,计算效率更高,尤其适用于移动设备和资源受限的环境。
      • Diffie-Hellman 密钥交换: 一种允许双方在不安全通道上安全地协商共享密钥的协议,本身不用于数据加密,但常与其他对称加密算法结合使用。

    3. 哈希函数 (Hash Functions)

    • 定义: 一种单向函数,将任意长度的输入数据(消息)转换为固定长度的输出(哈希值或消息摘要)。
    • 特点:
      • 单向性 (One-way): 从哈希值很难(计算上不可行)反向推导出原始输入数据。
      • 确定性 (Deterministic): 相同的输入始终产生相同的哈希值。
      • 雪崩效应 (Avalanche Effect): 输入的微小变化会导致输出的哈希值发生显著变化。
      • 抗碰撞性 (Collision Resistance): 找到两个不同的输入产生相同哈希值在计算上是困难的(强抗碰撞性)或非常困难的(弱抗碰撞性)。
    • 应用: 主要用于验证数据的完整性、数字签名、密码存储等,不用于数据加密
    • 常见算法:
      • 安全散列算法 (SHA): 包括SHA-1(已被认为不安全)、SHA-2(如SHA-256、SHA-512)、SHA-3等。
      • 消息摘要算法 (MD): 如MD5(已被认为不安全)。

    选择建议

    应用场景推荐算法原因
    加密大量数据对称加密(如 AES)速度快,资源消耗小
    身份验证、密钥交换非对称加密(如 RSA、ECC)公钥体系更适合开放环境
    数据完整性校验哈希函数(如 SHA-256)快速验证内容是否被篡改
  • macOS 安装 nmap扫描工具

    Nmap (Network Mapper) 是一款强大且灵活的开源网络扫描和安全审计工具。它能够快速发现网络上的主机和服务,识别操作系统和软件版本,并能执行各种安全扫描以检测潜在的漏洞。凭借其广泛的功能和可定制性,nmap 被网络管理员、安全专业人员以及渗透测试人员广泛应用于网络发现、资产清点、安全弱点评估等多种场景。无论是简单的网络探测还是复杂的安全分析,nmap 都是一款不可或缺的利器。

    1. 下载和安装 nmap

    我们需要从 nmap 官方网站下载适用于 macOS 的安装包。

    https://nmap.org/dist/nmap-7.95.dmg

    你可以通过以下命令扫描本地网络中的一个设备:

    nmap 192.168.1.1

    如果在终端中能够成功执行 nmap 命令并看到扫描结果
    说明 nmap 的命令行工具已经成功安装。

    2. 解决 Zenmap 无法打开的问题

    安装后可能会遇到 Zenmap 图形界面无法打开的情况,使用下面的命令进行打开

    open -a Zenmap
  • 正则表达式入门指南:开启文本处理的魔法大门

    在日常的编程和数据处理中,我们经常面临复杂的文本操作需求:

    • 如何从海量文本中精准提取电子邮件地址?
    • 怎样快速验证用户输入的电话号码格式是否正确?
    • 如何批量替换文档中的特定日期格式?

    这些看似棘手的问题,都可以借助一种强大的文本模式匹配工具——正则表达式 (Regular Expression, Regex) 来优雅地解决。

    一、什么是正则表达式?

    正则表达式,通常简称为“正则”或“regex”,是一种用于描述字符串中字符组合规律的模式。它本质上是一套预定义的规则,通过这些规则,我们可以高效地在文本中进行搜索、匹配、提取、替换和验证等操作。

    正则表达式的应用范围极其广泛,几乎遍布所有主流的编程语言、文本编辑器和命令行工具,例如 JavaScript、Python、Java、C#,以及 VS Code、Sublime Text、grep、sed、Notepad++ 等。掌握正则表达式,无疑能极大地提升你的文本处理效率。

    二、正则表达式的基础语法

    正则表达式的核心在于其语法,它由普通字符和具有特殊含义的元字符组成。

    1. 普通字符 (Literals)

    最基础的构成部分是普通字符,它们在正则表达式中直接匹配自身。

    正则表达式匹配内容
    hello精确匹配 “hello”
    abc123精确匹配 “abc123”

    2. 元字符 (Metacharacters)

    元字符是正则表达式的灵魂,它们赋予了模式匹配的灵活性和强大的表达能力。理解并熟练运用元字符是掌握正则表达式的关键。

    符号含义示例
    .匹配任何单个字符(除了换行符,某些模式下可匹配)a.c 匹配 “abc”, “a1c”
    ^匹配字符串的开头^The 匹配以 “The” 开头的字符串
    $匹配字符串的结尾.com$ 匹配以 “.com” 结尾的字符串
    *匹配前一个元素零次或多次ab*c 匹配 “ac”, “abc”, “abbc”
    +匹配前一个元素一次或多次ab+c 匹配 “abc”, “abbc”,不匹配 “ac”
    ?匹配前一个元素零次或一次(即可选)colou?r 匹配 “color”, “colour”
    {n}匹配前一个元素恰好 na{3} 匹配 “aaa”
    {n,}匹配前一个元素至少 na{2,} 匹配 “aa”, “aaa”, …
    {n,m}匹配前一个元素至少 n 次,但不超过 ma{2,4} 匹配 “aa”, “aaa”, “aaaa”
    []匹配括号内的任意一个字符[aeiou] 匹配任意小写元音字母
    [^]匹配除了括号内字符之外的任意字符[^0-9] 匹配任何非数字字符
    |或(选择),匹配左右两边的任何一个模式
    ()分组,将括号内的模式视为一个整体,并可用于捕获匹配(ab)+ 匹配 “ab”, “abab”, …
    \转义字符,用于取消元字符的特殊含义,匹配其字面值\. 匹配一个句点 “.”

    3. 特殊字符序列

    为了简化常见的模式匹配,正则表达式提供了一些预定义的特殊字符序列:

    表达式含义等价于
    \d匹配任何数字[0-9]
    \D匹配任何非数字字符[^0-9]
    \s匹配任何空白字符(空格、制表符、换行符等)
    \S匹配任何非空白字符
    \w匹配任何单词字符(字母、数字、下划线)[a-zA-Z0-9_]
    \W匹配任何非单词字符[^a-zA-Z0-9_]
    \b匹配单词边界(例如,空格、标点符号、字符串开头/结尾)
    \B匹配非单词边界

    三、常见模式案例

    结合你提供的案例和更通用的模式:

    1. 匹配电子邮件地址

    [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
    • [a-zA-Z0-9._%+-]+: 匹配一个或多个字母、数字、下划线、点号、百分号、加号或减号(用户名部分)。
    • @: 匹配 “@” 符号。
    • [a-zA-Z0-9.-]+: 匹配一个或多个字母、数字、点号或减号(域名部分)。
    • \.: 匹配一个点号(需要转义)。
    • [a-zA-Z]{2,}: 匹配两个或多个字母(顶级域名部分,如 com, org, cn)。

    2. 匹配手机号

    ^1[3-9]\d{9}$
    • ^: 匹配字符串的开头。
    • 1[3-9]: 匹配以 “1” 开头,第二位数字是 3 到 9 的数字。
    • \d{9}: 匹配后面跟着的 9 位数字。
    • $: 匹配字符串的结尾。

    3. 匹配日期(常见格式:YYYY-MM-DD)

    \d{4}-\d{2}-\d{2}
    • \d{4}: 匹配四位数字(年份)。
    • -: 匹配连字符。
    • \d{2}: 匹配两位数字(月份或日期)。

    你还可以扩展匹配其他日期格式,例如 \d{4}/\d{2}/\d{2}\d{2}/\d{2}/\d{4}

    四、贪婪匹配与非贪婪匹配

    默认情况下,量词 (*, +, ?, {}) 是贪婪的 (greedy),它们会尽可能多地匹配字符。如果你希望它们尽可能少地匹配,可以使用非贪婪模式 (non-greedy),在量词后面加上 ?

    • 例如,对于字符串 <p>Hello</p>World<p>Regex</p>
      • \<p>.*\<\/p> (贪婪) 会匹配整个 <p>Hello</p>World<p>Regex</p>.
      • \<p>.*?\<\/p> (非贪婪) 会匹配 <p>Hello</p><p>Regex</p>.

    五、捕获组与非捕获组

    • (pattern): 捕获组会将括号内匹配到的文本存储起来,方便后续引用或提取。
    • (?:pattern): 非捕获组用于组合模式,但不存储匹配到的文本,可以提高效率。

    例如,要提取日期中的年、月、日:

    (\d{4})-(\d{2})-(\d{2})

    在匹配后,你可以通过捕获组的编号(通常从 1 开始)获取各个部分。

    六、前瞻和后顾断言 (Lookaround Assertions)

    这些是零宽度断言,它们匹配一个位置,而不是字符本身。

    • 正向前瞻 (Positive Lookahead): (?=pattern) 断言当前位置的后面必须紧跟着 pattern
    • 负向前瞻 (Negative Lookahead): (?!pattern) 断言当前位置的后面不能紧跟着 pattern
    • 正向后顾 (Positive Lookbehind): (?<=pattern) 断言当前位置的前面必须紧跟着 pattern
    • 负向后顾 (Negative Lookbehind): (?<!pattern) 断言当前位置的前面不能紧跟着 pattern

    例如,要匹配后面跟着 “USD” 的数字:\d+(?=USD)

    七、如何在不同环境中使用正则表达式

    Python 示例:

    import re
    
    text = "请联系我:[email protected][email protected]"
    pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
    
    results = re.findall(pattern, text)
    print(results)  # 输出 ['[email protected]', '[email protected]']

    在文本编辑器中使用:

    大多数现代文本编辑器都支持在查找和替换功能中使用正则表达式。你需要启用相应的选项(通常是一个 .* 图标或 “Use Regular Expression” 复选框)。

    八、学习建议与资源

    1. 在线测试工具:
      • Regex101:功能强大,可以实时查看匹配结果、解释正则表达式,并提供不同语言的代码示例。
      • RegExr:简洁易用,提供交互式的学习和测试环境。
    2. 练习题思路:
      • 提取网页信息: 从简单的 HTML 片段中提取所有的 <a> 标签的 href 属性值(链接)和标签内的文本(标题)。
      • 校验用户输入: 编写正则表达式来验证用户注册表单中的用户名(例如,只能包含字母、数字和下划线,长度在 6-20 个字符之间)、密码强度(例如,包含大小写字母、数字和特殊符号)。
      • 日志分析: 从服务器日志文件中提取特定时间范围内的所有 IP 地址或错误信息。
      • 数据清洗: 清理文本数据中的多余空格、特殊字符或HTML标签。
    3. 系统学习:
      • 查阅你所使用编程语言的正则表达式文档。
      • 阅读相关的在线教程和书籍。
      • 参与在线社区和论坛的讨论。

    正则表达式是一项极具价值的技能,虽然初学时可能会遇到一些挑战,但一旦掌握,它将成为你处理文本数据的强大助手。通过不断地学习和实践,你将能够灵活运用正则表达式解决各种复杂的文本处理任务,开启文本处理的魔法大门。

  • Multipass使用cloud-init 启动 Ubuntu 24.04 虚拟机

    使用 Multipass 启动一台基于 Ubuntu 24.04 的虚拟机,并通过 cloud-init.yaml 实现自动化配置。配置内容包括创建用户、禁用 root 和密码登录、启用 SSH 公钥认证,确保系统安全且易于远程管理。只需一条命令即可快速部署完成,非常适合开发和测试场景使用。

    1. 创建 cloud-config.yaml

    生成 SSH 密钥对(或准备好现有公钥):

    ssh-keygen -t ed25519 -C "liqixin@vm"

    公钥会保存在 ~/.ssh/id_ed25519.pub 中。

    创建一个名为 cloud-config.yaml 的文件:

    # cloud-config.yaml
    users:
      - name: liqixin
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    lock_passwd: true
    ssh_authorized_keys:
      - ssh-ed25519 AAAA liqixin@vm
    
    disable_root: true
    ssh_pwauth: false

    请把 ssh-ed25519 AAAA... 替换成你自己的公钥内容(~/.ssh/id_ed25519.pub 里的内容)。

    2. 启动 VM

    在 cloud-config 文件所在目录,运行以下命令:

    multipass launch 24.04 \
      --name liqixin-vm \
      --cpus 1 \
      --memory 1G \
      --disk 10G \
      --cloud-init cloud-config.yaml

    这会:

    • 下载 Ubuntu 24.04(首次执行会下载镜像)
    • 创建名为 liqixin-vm 的虚拟机
    • 启动时自动创建 liqixin 用户,并配置好免密 SSH 登录

    3. 通过 SSH 登录

    Multipass 默认会自动配置主机与 VM 的网络连接,你可以用以下方式连接:

    multipass info liqixin-vm

    输出中找到 IP 地址,例如:

    liqixin-vm:
      ...
      IPv4: 192.168.64.3

    然后用你的私钥直接 SSH 登录:

    ssh -i ~/.ssh/id_ed25519 [email protected]

    首次连接需要确认 fingerprint,之后就可以直接连了。

    4. 清理 / 删除 VM

    如果以后不需要这个 VM,可以这样清理:

    multipass delete liqixin-vm
    multipass purge