运维123 - bash
type: channel
link: https://www.sddts.cn/index.php/tag/bash/
items: DMG 文件直接写入硬盘导致无法启动的问题分析与解决
items: 在 Linux 上将 macOS 安装文件写入 NVMe 硬盘
items: rip 终端进程管理工具入门指南
items: mcporter 使用教程
items: 用逗号前缀管理自定义命令行脚本
items: Claude 垃圾文件清理脚本技术文档
items: fd 文件查找工具快速入门指南
items: Linux环境变量问题技术分析
items: Linux 用户活动监控工具 psacct 与 acct 使用教程
items: Tmux 高效终端工作流配置指南

DMG 文件直接写入硬盘导致无法启动的问题分析与解决
type: item
date: 2026-04-02T01:36:42+00:00
description: DMG 文件直接写入硬盘导致无法启动的问题分析与解决一、事件概述1. 事件背景在 Linux 系统中将 macOS 12.7.6 安装文件（DMG 格式）写入 NVMe 硬盘，制作可启动的 macOS 安装盘。2. 影响范围A. 影响操作启动盘制作流程被迫中断，需要重新制作B. 影响时长问题发现耗时约 30 分钟，包括问题定位和重新制作C. 影响功能初次制作的启动盘无法被 Mac 识别3. 严重程度P2 级问题（非生产环境，但浪费时间和精力）二、事件时间线1. 问题发生（时间：初次写入完成后）A. 现象描述使用 dd 命令直接将 InstallOS.dmg 写入 /dev/sdb，写入过程显示成功，耗时约 170 秒，写入约 5GB 数据。B. 初始验证使用 file 命令检查硬盘开头，返回 zlib compressed data，而非预期的分区表格式。2. 问题发现（时间：写入验证阶段）A. 发现途径在重启前验证启动盘制作结果时，使用 file 和 hexdump 命令检查硬盘内容。B. 初步判断硬盘开头为 78 DA（zlib 压缩数据魔数），而非正确的 GPT 引导扇区（00 EE）。说明 DMG 文件的压缩数据被直接写入了硬盘。3. 根因分析（时间：问题发现后）A. 根本原因DMG 是 Apple 的磁盘镜像格式，内部使用 zlib 压缩。直接用 dd 写入只会把压缩数据复制到硬盘，Mac 无法识别正确的分区结构。B. 正确做法必须先使用 dmg2img 工具将 DMG 转换为原始镜像（IMG 格式），再写入设备。4. 解决方案实施（时间：根因确认后）A. 转换 DMG 为 IMGdmg2img /home/lab/Downloads/InstallOS.dmg /home/lab/Downloads/InstallOS.img转换过程耗时约 2 分钟，文件从 4.7GB 扩展到 5.3GB。B. 重新写入硬盘sudo dd if=/home/lab/Downloads/InstallOS.img of=/dev/sdb bs=4M oflag=direct status=progress写入耗时约 125 秒，平均速度 44.7 MB/s。5. 验证结果（时间：重新写入后）A. 分区表验证GPT 分区表正确写入，包含：分区 1：EFI System Partition（200MB vfat）分区 2：Install macOS（4.9GB HFS+）B. 文件系统验证挂载 HFS+ 分区后，确认 InstallOS.pkg 文件存在（约 5GB）。C. 最终结果启动盘制作成功，可在 Mac 上使用 Option 键选择启动。graph LR A[DMG 文件] -->|错误方式: 直接 dd| B[压缩数据写入硬盘] B --> C[Mac 无法识别] A -->|正确方式: dmg2img| D[IMG 镜像] D -->|dd 写入| E[正确分区结构] E --> F[Mac 可识别]三、问题分析1. 直接原因dd 命令按字节复制文件内容，不会处理 DMG 内部的压缩结构。直接写入 DMG 文件相当于把压缩数据块写入硬盘。2. 根本原因（技术分析）A. DMG 文件结构DMG（Disk Image）是 Apple 的磁盘镜像格式，具有以下特点：支持 zlib 压缩（默认）支持 AES 加密支持多种分区格式（GPT、APM 等）包含文件系统和元数据B. 压缩数据特征DMG 文件开头的 78 DA 是 zlib 压缩的标准魔数，表示数据已压缩。00000000 78 da 63 60 18 05 43 18 fc fb ff ff 1d 10 33 02 |x.c`..C.......3.C. GPT 分区表特征正确的 GPT 硬盘开头应该是保护性 MBR：000001c0 ff ff ee fe ff ff 01 00 00 00 f7 52 a7 00 00 00 |................|3. 深层反思A. 文档缺陷网络上关于 DMG 写入的教程多数存在误导，未说明 DMG 需要先转换。B. 工具认知dmg2img 工具在 Linux 生态中不够普及，容易被忽略。C. 验证重要性在重启前验证是非常必要的步骤，避免了使用无效启动盘的麻烦。四、解决方案1. 临时方案（不推荐）如果已经错误写入，需要重新制作：使用 dd 填充零清空硬盘：dd if=/dev/zero of=/dev/sdb bs=1M count=100重新执行正确的制作流程2. 正确方案（推荐）A. 完整制作流程# 1. 转换 DMG 为 IMG dmg2img InstallOS.dmg InstallOS.img # 2. 写入硬…

在 Linux 上将 macOS 安装文件写入 NVMe 硬盘
type: item
date: 2026-04-02T01:30:44+00:00
description: 在 Linux 上将 macOS 安装文件写入 NVMe 硬盘一、概述1. 简介本文介绍如何在 Linux 系统中将 macOS 安装 DMG 文件写入 NVMe 硬盘，创建可启动的 macOS 安装盘。2. 适用场景需要在 Mac 上重新安装 macOS 系统制作 macOS 启动安装盘用于多台机器使用 NVMe 硬盘作为安装介质3. 前置知识A. 必备技能基本 Linux 命令行操作了解磁盘设备和挂载概念B. 注意事项写入操作会完全清除目标硬盘的数据需要 root 权限执行写入命令确保正确识别目标设备，避免误写入系统盘二、环境准备1. 系统要求Linux 操作系统（Ubuntu、Debian、CentOS 等）sudo 权限目标 NVMe 硬盘已连接并识别2. 所需工具Linux 系统自带 dd 工具，无需额外安装。三、操作步骤1. 检测目标硬盘使用 lsblk 命令查看所有磁盘设备：lsblk -d -o NAME,SIZE,MODEL输出示例：NAME SIZE MODEL sda 465.9G APPLE SSD SM0512G sdb 238.5G 256G NVMe KIOXIA确认目标设备名称，本例中为 /dev/sdb。2. 确认 DMG 文件查看 DMG 文件信息：ls -lh InstallOS.dmg输出示例：-rw-rw-r-- 1 lab lab 4.7G 10月 24 2019 InstallOS.dmg3. 写入 DMG 到硬盘使用 dd 命令将 DMG 文件写入目标硬盘：sudo dd if=/path/to/InstallOS.dmg of=/dev/sdb bs=4M oflag=direct status=progress参数说明：if：输入文件（DMG 文件路径）of：输出设备（目标硬盘）bs：块大小，4M 可提高写入速度oflag=direct：绕过系统缓存，直接写入设备status=progress：显示实时进度4. 等待写入完成写入过程会显示实时进度：5007882126 bytes (5.0 GB, 4.7 GiB) copied, 170.37 s, 29.4 MB/s写入时间取决于硬盘速度，通常需要几分钟。四、工作原理1. DMG 文件格式DMG 是 Apple 的磁盘镜像格式，支持压缩和加密。写入时，dd 命令会自动处理解压缩。2. 数据流向graph LR A[DMG 文件] -->|dd 读取| B[解压缩] B -->|直接写入| C[NVMe 硬盘] C -->|可启动| D[macOS 安装盘]3. 写入后硬盘结构硬盘将被格式化为 macOS 可识别的分区结构，包含启动文件和系统镜像。五、验证结果1. 检查写入结果使用 fdisk 查看硬盘分区信息：sudo fdisk -l /dev/sdb应该能看到 macOS 特定的分区类型（如 Apple HFS 或 APFS）。2. 在 Mac 上测试将硬盘连接到 Mac，启动时按住 Option 键，应该能看到安装盘选项。六、常见问题1. 找不到目标设备问题：lsblk 没有显示目标硬盘解决方法：检查硬盘连接是否牢固尝试更换 USB 接口或 SATA 接口运行 sudo partprobe 重新扫描磁盘2. 权限不足问题：dd 命令提示权限 denied解决方法：确保使用 sudo 执行命令检查当前用户是否在 sudo 组中3. 写入速度慢问题：写入速度远低于预期解决方法：确保使用 USB 3.0 或更高版本接口尝试调整 bs 参数（如 8M、16M）检查硬盘是否处于省电模式4. 写入后无法启动问题：硬盘写入成功但 Mac 无法识别解决方法：确认 DMG 文件完整性检查 Mac 是否支持该 macOS 版本尝试重新写入七、技术要点1. 为什么使用 oflag=directoflag=direct 绕过系统页缓存，直接写入设备。这样做的好处：避免缓存占用大量内存确保数据真正写入硬盘提供更准确的进度信息2. 块大小选择块大小（bs）影响写入效率：太小（如 512B）：频繁 I/O，速度慢太大（如 1G）：占用大量内存推荐值：4M-16M 之间3. DMG 压缩比DMG 文件通常经过压缩，实际写入的数据量可能大于文件大小。本例中 4.7GB 的 DMG 解压后写入约 5GB 数据。八、总结在 Linux 上将 macOS 安装文件写入 NVMe 硬盘是一个简单的过程，核心是使用 dd 命令。关键要点：正确识别目标设备，避免误操作使用合适的参数提高写入效率写入完成后验证结果整个过程通常只需要几分钟即可完成。参考资料dd 命令官方文档macOS 恢复模式使用指南

rip 终端进程管理工具入门指南
type: item
date: 2026-03-22T13:56:13+00:00
description: rip 终端进程管理工具入门指南一、概述1. 简介A. 是什么rip 是一个用 Rust 语言编写的终端工具，提供交互式的进程查找和终止功能。通过模糊搜索界面，用户可以快速定位并杀死占用系统资源的进程。B. 为什么学比传统 ps 和 kill 命令更直观支持按 CPU、内存、端口等多维度排序实时监控模式可动态刷新进程列表跨平台支持 Linux、macOS 和 WindowsC. 学完能做什么快速定位高 CPU 或高内存消耗的进程精准终止指定端口占用的进程使用信号优雅地关闭应用程序实时监控系统进程状态2. 前置知识A. 必备技能基本终端命令操作了解进程和端口概念B. 推荐知识了解 Unix 信号机制了解系统资源监控基础二、环境准备1. 系统要求Linux：x86_64、aarch64 架构macOS：x86_64、arm64 架构Windows：x86_64 架构2. 安装步骤Homebrew（macOS/Linux）：brew install cesarferreira/tap/ripCargo：cargo install rip-cli从源码编译：cargo install --path .Nix：nix run github:cesarferreira/rip --no-write-lock-file3. 验证安装rip --version三、核心概念1. 基本术语模糊搜索（Fuzzy Search）：支持部分匹配的搜索方式信号（Signal）：发送给进程的指令，如 KILL、TERM实时模式（Live Mode）：自动刷新进程列表的模式端口模式（Ports Mode）：显示监听网络端口的进程2. 工作原理graph LR A[用户执行 rip] --> B[获取进程列表] B --> C[显示 TUI 界面] C --> D{用户操作} D -->|搜索| E[过滤进程] D -->|选择| F[标记进程] D -->|确认| G[发送信号] G --> H[终止进程] D -->|取消| I[退出界面]四、快速上手1. Hello World 示例# 启动 rip（默认按 CPU 排序） rip运行后会显示所有运行中的进程，可通过键盘进行交互操作。2. 核心功能演示# 预过滤特定名称的进程 rip -f chrome # 使用 SIGTERM 信号优雅终止 rip -s SIGTERM # 按内存使用排序 rip --sort mem # 按名称排序 rip --sort name3. 代码讲解基本使用流程执行 rip 命令进入交互界面直接输入进程名进行模糊搜索使用空格键选中/取消选中进程按回车键发送终止信号按 Esc 或 Ctrl+C 取消操作端口模式# 显示所有占用端口的进程 rip --ports # 终止占用特定端口的进程 rip --port 3000 # 端口模式配合实时刷新 rip --ports --live五、进阶内容1. 常用功能实时监控模式# 启动自动刷新模式 rip --live此模式下进程列表会定期更新，适合监控动态变化的系统状态。信号选择rip 支持多种 Unix 信号：信号编号描述KILL9强制杀死（默认）TERM15优雅终止INT2中断HUP1挂起QUIT3退出排序选项--sort cpu # 按 CPU 使用率（默认） --sort mem # 按内存占用 --sort pid # 按进程 ID --sort name # 按进程名称 --sort port # 按端口号2. 最佳实践优先使用 SIGTERM 信号，给予进程清理资源的机会对于无响应进程再使用 SIGKILL使用预过滤功能缩小搜索范围端口模式用于快速定位端口冲突问题3. 性能优化rip 使用 Rust 编写，资源占用极低模糊搜索算法高效，支持大量进程快速筛选实时模式采用智能刷新策略，避免过度消耗资源六、实战案例1. 场景描述开发环境中某个 Node.js 进程占用端口 3000，导致新服务无法启动。2. 实现步骤# 方法 1：直接使用端口模式 rip --port 3000 # 方法 2：先查找再终止 rip -f node # 方法 3：按 CPU 排序找到高消耗进程 rip --sort cpu在交互界面中：使用空格选中目标进程按回车确认终止3. 完整代码# 组合使用示例：实时监控端口 8080 rip --ports --live --sort port # 优雅终止所有 Chrome 进程 rip -f chrome -s TERM # 查看并终止高内存进程 rip --sort mem --live七、常见问题1. 安装问题Q: Homebrew 安装失败A: 确保已更新 Homebrew：brew updat…

mcporter 使用教程
type: item
date: 2026-02-28T09:22:11+00:00
description: mcporter 使用教程一、概述1. 简介A. 是什么mcporter 是一个用于调用 MCP（Model Context Protocol）服务器的 TypeScript 运行时和 CLI 工具。它提供了命令行界面来管理、测试和调用 MCP 服务器，让用户能够方便地使用各种 MCP 工具。B. 为什么学MCP 是连接 LLM 与外部服务的标准协议，掌握 mcporter 可以快速测试 MCP 服务器无需编写代码即可调用 MCP 工具，提高开发和调试效率支持多种配置来源，灵活管理 MCP 服务器C. 学完能做什么安装和配置 mcporter列出和查看已配置的 MCP 服务器使用命令行调用 MCP 工具排查配置问题二、环境准备1. 系统要求Node.js 14+ 和 npmLinux、macOS 或 Windows 操作系统网络连接（用于安装和访问远程 MCP 服务器）2. 安装步骤全局安装npm install -g mcporter如果遇到权限问题，使用 sudo：sudo npm install -g mcporter3. 验证安装mcporter --version输出示例：0.7.3列出已配置的服务器：mcporter list三、核心概念1. 基本术语MCP 服务器：提供一组工具的远程或本地服务工具（Tool）：MCP 服务器提供的具体功能接口选择器（Selector）：用于定位特定工具的语法，格式为 server.toolSSE：Server-Sent Events，mcporter 支持的通信协议之一2. 配置目录mcporter 从以下位置加载配置：平台配置路径Linux/macOS~/.mcporter/mcporter.jsonWindows%USERPROFILE%.mcporter\mcporter.json此外，mcporter 还会自动从编辑器（如 Cursor、Claude）的设置中导入服务器配置。3. 工作原理graph LR A[命令行] -->|mcporter call| B[解析器] B -->|查找服务器| C[配置文件] C -->|获取工具| D[MCP 服务器] D -->|返回结果| E[命令输出]四、快速上手1. Hello World 示例列出所有已配置的 MCP 服务器：mcporter list输出示例：mcporter 0.7.3 — Listing 7 server(s) (per-server timeout: 30s) - nagios-mcp (16 tools, 0.1s) - kali (12 tools, 0.2s) - web-search-prime (1 tool, 0.3s) [source: ~/.claude/settings.json] - web-reader (1 tool, 0.3s) [source: ~/.claude/settings.json] - zread (3 tools, 0.4s) [source: ~/.claude/settings.json] - zai-mcp-server (8 tools, 0.7s) [source: ~/.claude/settings.json] - wenyan-mcp (2 tools, 0.9s) [source: ~/.claude/settings.json] ✔ Listed 7 servers (7 healthy).2. 核心功能演示查看特定服务器的工具列表mcporter list kali --schema调用简单工具# 检查服务器健康状态 mcporter call kali.server_health调用带参数的工具# Nmap 扫描 mcporter call kali.nmap_scan target:192.168.1.100 scan_type:"-sV"3. 代码讲解mcporter 的基本调用语法为：mcporter call <服务器名>.<工具名> [参数名:值 ...]参数格式使用 key:value 的形式，多个参数用空格分隔。五、配置管理1. 配置文件格式mcporter.json 配置文件示例：{ "mcpServers": { "nagios-mcp": { "url": "http://192.168.124.47:63001/sse" }, "kali": { "url": "http://kali.mcp.op123.ren/sse" } } }2. 常见配置问题JSON 格式错误配置文件必须符合标准 JSON 格式，注意：对象最后一个属性后不能有逗号字符串必须用双引号键名必须用双引号错误示例：{ "kali": { "url…

用逗号前缀管理自定义命令行脚本
type: item
date: 2026-02-07T22:54:47+00:00
description: 用逗号前缀管理自定义命令行脚本一、概述1. 问题背景A. 痛点分析许多 Unix/Linux 用户习惯在 home 目录下创建 ~/bin 目录，存放自定义的 shell 脚本和工具，并将其添加到 PATH 环境变量中。这种方式可以方便地扩展系统命令，但存在一个隐患：自定义脚本名可能与系统命令冲突。B. 冲突风险系统命令通常采用小写字母的短名称，自定义脚本往往也遵循类似命名风格。当系统更新或安装新软件时，可能会添加与自定义脚本同名的命令，导致冲突。在 Debian 等发行版中，这个问题尤为突出。例如，一台普通的 Ubuntu 笔记本电脑就有超过 21,000 个可用命令：$ apt-file search -x '^/usr/bin/[^/]*$' | wc -l 217332. 解决思路需要一种命名约定，满足以下要求：便于输入，不需要使用 Shift 键不会被系统命令采用对 shell 和文件系统没有特殊含义二、字符可用性分析1. 字符筛选过程根据"易于输入"原则，候选字符必须在不按 Shift 键的情况下可用。经过系统分析：字符类型是否可用原因小写字母 a-z❌系统命令主要使用这些字符括号 []❌shell 通配符特殊含义反斜杠 \❌shell 转义字符冒号 :❌shell 特殊字符反引号 `❌命令替换特殊含义单引号 '❌shell 引用特殊含义斜杠 /❌路径分隔符，不能出现在文件名中点 .❌文件名中以点开头表示隐藏文件2. 最终选择经过筛选，只剩下一个字符：逗号（,）快速测试证实，逗号完全满足需求：所有工具和 shell 都将其视为普通的文件名字符没有特殊含义或副作用输入方便，无需按 Shift 键三、实施方案1. 命名约定为所有自定义脚本添加逗号前缀：# 原来的命令 myscript backup find # 使用逗号前缀 ,myscript ,backup ,find2. Tab 补全优势使用逗号前缀后，可以轻松浏览所有自定义命令。只需输入逗号并按 Tab 键：$ ,«tab» ,complete-scp ,go-thpgp ,range ,complete-ssh ,gr ,svn-store-password ,coreoff ,hss ,umount ,coreon ,mount-thpgp ,find ,mount-twt这种方式的优点：快速列出所有自定义命令避免与系统命令混淆提示符清晰，易于识别3. 实施步骤A. 创建 ~/bin 目录mkdir -p ~/binB. 添加到 PATH在 ~/.bashrc 或 ~/.zshrc 中添加：export PATH="$HOME/bin:$PATH"C. 重命名现有脚本# 将现有脚本移动到逗号前缀 mv ~/bin/myscript ~/bin/,myscript mv ~/bin/backup ~/bin/,backupD. 创建新脚本时使用逗号前缀# 创建新脚本 cat > ~/bin/,mycommand << 'EOF' #!/bin/bash # 脚本内容 echo "My custom command" EOF chmod +x ~/bin/,mycommand四、原理分析1. Shell 对逗号的处理在 POSIX shell（bash、zsh 等）中，逗号没有被赋予特殊含义。它是普通字符，可以在文件名中自由使用。graph TD A[用户输入命令] --> B{解析命令名} B --> C{是否以逗号开头} C -->|是| D[在 ~/bin 中查找] C -->|否| E[在 PATH 全路径查找] D --> F[执行自定义脚本] E --> G[执行系统命令]2. Tab 补全机制当用户输入逗号并按 Tab 键时：Shell 识别逗号为普通字符搜索 PATH 中所有以逗号开头的可执行文件显示匹配的命令列表由于系统命令从不使用逗号开头，这个列表只包含用户自定义的脚本。3. 可移植性逗号前缀方案在各种 Unix-like 系统中都经过验证：Linux（Debian、Ubuntu、RedHat 等）macOSBSD（FreeBSD、OpenBSD）其他 POSIX 兼容系统五、最佳实践1. 命令命名建议虽然使用逗号前缀可以避免冲突，但仍然建议：使用描述性名称：,backup-database 而非 ,bd保持一致性：相同功能的脚本使用相似的命名模式避免过长：虽然 Tab 补全有帮助，但过长的名称影响可读性2. 脚本组织对于大量脚本，可以考虑进一步分类：# 按功能分类 ,git/ ,git/,push-all ,git/,pull-all ,backup/ ,backup/,database ,backup/,files3. 文档说明在每个脚本…

Claude 垃圾文件清理脚本技术文档
type: item
date: 2026-02-04T22:36:21+00:00
description: Claude 垃圾文件清理脚本技术文档一、概述1. 简介A. 是什么cleanup.sh 是一个专为 Claude Code CLI 设计的自动化垃圾文件清理脚本，用于清理运行过程中产生的各类临时文件、历史记录和缓存数据，释放磁盘空间。B. 为什么需要Claude Code 在日常使用中会产生大量临时文件，包括调试日志、会话环境、任务列表、备份文件等。这些文件随着时间积累会占用大量磁盘空间，但其中大部分历史文件已无实际保留价值。定期清理这些文件可以：释放磁盘空间提升文件系统性能保持工作目录整洁C. 功能特点按保留数量策略清理各目录支持预览模式，可预先查看删除内容完整的统计报告（释放空间、删除文件数）集成日志记录功能安全的文件删除机制2. 前置知识A. 必备技能基本 Linux 命令行操作Bash 脚本基础理解B. 推荐知识了解 Claude Code 目录结构熟悉 cron 定时任务配置二、脚本架构1. 目录结构graph TB A[Claude Home] --> B[scripts/] A --> C[lib/] A --> D[logs/] A --> E[各清理目标目录] B --> B1[cleanup.sh] C --> C1[logger.sh] C --> C2[rsync-config.sh] D --> D1[operations_YYYYMMDD.log] E --> E1[debug/] E --> E2[file-history/] E --> E3[todos/] E --> E4[backups/]2. 工作原理flowchart TD A[启动脚本] --> B{检查运行模式} B -->|预览模式| C[计算待删除文件] B -->|执行模式| D[执行清理操作] C --> E[生成预览报告] D --> F[记录操作日志] E --> G[输出统计报告] F --> G G --> H[结束]3. 清理策略脚本采用基于保留数量的清理策略，各目录保留规则如下：目录保留策略保留数量清理依据debug/按文件数量3 个修改时间倒序file-history/按会话数量50 个修改时间倒序session-env/按会话数量20 个修改时间倒序todos/按文件数量200 个修改时间倒序shell-snapshots/按文件数量10 个修改时间倒序plans/按文件数量20 个修改时间倒序transcripts/按文件数量10 个修改时间倒序backups/按文件数量1 个修改时间倒序paste-cache/全部清理0 个无条件删除根目录杂项按天数30 天文件修改时间三、核心实现1. 配置管理脚本使用关联数组（Associative Array）管理配置参数：declare -A CONFIG=( [debug_keep]=3 [history_keep]=50 [session_keep]=20 [todos_keep]=200 [snapshots_keep]=10 [plans_keep]=20 [transcripts_keep]=10 [backups_keep]=1 [old_file_days]=30 )配置项命名规范：<目录前缀>_keep 表示保留数量，old_file_days 表示天数阈值。2. 空间计算calculate_space 函数使用系统命令获取文件或目录大小：sequenceDiagram participant C as calculate_space participant D as du/stat 命令 participant A as awk C->>D: 检查路径类型 alt 目录 D->>C: 返回 du -sk 结果 else 文件 D->>C: 返回 stat -c%s 结果 end C->>A: 提取数值并转换为字节 A->>C: 返回字节数核心实现：calculate_space() { local path="$1" if [ -d "$path" ]; then du -sk "$path" 2>/dev/null | awk '{print $1 * 1024}' elif [ -f "$path" ]; then stat -c%s "$path" 2>/dev/null || echo 0 else echo 0 fi }3. 按数量清理clean_by_count 函数实现基于保留数量的文件清理：flowchart TD A[开始] --> B[目录是否存在?] B -->|否| C[返回] B -->|是| D[计算清理前空间] D --> E[使用 find 统计文件数] E --> F[计算需删除数量] F --> G{需删除?}…

fd 文件查找工具快速入门指南
type: item
date: 2026-02-04T21:51:17+00:00
description: fd 文件查找工具快速入门指南一、概述1. 简介A. 是什么fd 是一个用 Rust 编写的命令行文件查找工具，旨在成为传统 Unix find 命令的简单、快速且用户友好的替代品。它不追求支持 find 的全部强大功能，而是为大多数使用场景提供合理的默认配置。B. 为什么学速度极快：并行目录遍历，比传统 find 快 10-20 倍语法简洁：fd PATTERN 即可，无需记忆复杂的 find 参数智能默认：自动忽略隐藏文件和 gitignore 中的文件彩色输出：像 ls 一样用颜色区分不同文件类型易用性强：支持正则表达式和 glob 模式匹配C. 学完能做什么快速在文件系统中查找文件和目录按扩展名、文件类型、大小等条件过滤批量执行命令处理搜索结果与 fzf、ripgrep 等工具集成使用2. 前置知识A. 必备技能基本 Linux/Unix 命令行操作了解文件系统目录结构概念B. 推荐知识正则表达式基础熟悉 shell 通配符二、环境准备1. 系统要求Linux：Ubuntu、Debian、Fedora、Arch 等macOS：10.15+Windows：10/112. 安装步骤Ubuntu/Debian：# Ubuntu 19.04+ 或 Debian Buster+ apt install fd-find # 创建软链接以便使用 fd 命令 ln -s $(which fdfind) ~/.local/bin/fdmacOS：# 使用 Homebrew brew install fd # 或使用 MacPorts port install fdWindows：# 使用 Scoop scoop install fd # 或使用 Chocolatey choco install fd # 或使用 Winget winget install sharkdp.fd从源码编译：# 使用 cargo 安装 cargo install fd-find # 或从源码构建 git clone https://github.com/sharkdp/fd cd fd cargo build cargo install --path .3. 验证安装fd --version三、核心概念1. 基本术语模式（Pattern）：用于匹配文件名的正则表达式或 glob 模式智能大小写（Smart Case）：默认不区分大小写，包含大写字母时自动区分并行遍历：同时搜索多个目录以提高速度2. 工作原理graph TB A[fd 命令] --> B{解析参数} B --> C[并行遍历目录] C --> D{应用过滤规则} D --> E{正则/glob 匹配} E --> F{检查隐藏文件} F --> G{检查 gitignore} G --> H[输出结果]3. 与 find 的对比特性fdfind基本语法fd PATTERNfind -iname 'PATTERN'速度并行遍历，极快串行遍历，较慢默认行为忽略隐藏和 gitignore 文件搜索所有文件大小写智能判断需手动指定彩色输出默认支持需额外配置四、快速上手1. Hello World 示例# 查找包含 'netfl' 的文件 fd netfl # 输出： # Software/python/imdb-ratings/netflix-details.py2. 核心功能演示简单搜索：# 搜索包含某个模式的文件 fd test # 指定搜索目录 fd passwd /etc正则表达式搜索：# 搜索以 x 开头、rc 结尾的文件 cd /etc fd '^x.*rc$' # 输出： # X11/xinit/xinitrc # X11/xinit/xserverrc列出所有文件：# 递归列出当前目录所有文件 fd # 列出指定目录的所有文件 fd . /path/to/dir五、进阶内容1. 常用功能按扩展名搜索：# 查找所有 Markdown 文件 fd -e md # 查找多个扩展名 fd -e rs -e cpp mod # 组合模式和扩展名 fd -e rs mod精确匹配文件名：# 使用 glob 模式精确匹配 fd -g libc.so /usr # 输出： # /usr/lib32/libc.so # /usr/lib/libc.so搜索隐藏文件：# 默认不搜索隐藏文件 fd pre-commit # 搜索隐藏文件 fd -H pre-commit # 输出： # .git/hooks/pre-commit.sample忽略 gitignore：# 默认遵循 .gitignore fd num_cpu # 不遵循 .gitignore fd -I num_cpu完全无限制搜索：# 搜索…

Linux环境变量问题技术分析
type: item
date: 2026-01-30T13:53:13+00:00
description: Linux环境变量问题技术分析一、概述1. 问题背景在日常Linux运维和开发工作中，环境变量相关的问题是导致脚本执行失败的主要原因之一。这类问题通常表现为：命令在交互式终端中正常执行，但通过 crontab、SSH 远程执行或自动化工具执行时却报错找不到命令。2. 核心问题脚本在命令行测试正常，放入 crontab 后报错找不到命令SSH 远程执行命令时环境变量与本地登录不同Docker 容器中环境变量传递问题Bash 与 Sh 语法兼容性问题3. 影响范围自动化脚本执行失败定时任务无法正常运行容器化应用启动异常跨平台脚本兼容性问题二、问题分析1. Login Shell 与 Non-Login ShellA. 核心区别Linux Shell 分为两种模式：Login Shell（登录式 Shell）和 Non-Login Shell（非登录式 Shell），它们加载环境变量的顺序不同。B. 环境变量加载顺序graph TD subgraph Login Shell A1["/etc/profile"] --> A2["~/.bash_profile"] A2 --> A3["~/.bashrc"] A3 --> A4["/etc/bashrc"] end subgraph Non-Login Shell B1["~/.bashrc"] --> B2["/etc/bashrc"] end C["用户登录"] --> Login D["SSH远程执行命令"] --> Non-Login E["Crontab执行"] --> Non-Login F["脚本调用"] --> Non-LoginC. 关键差异Login Shell 加载顺序：① /etc/profile ② ~/.bash_profile ③ ~/.bashrc ④ /etc/bashrcNon-Login Shell 加载顺序：① ~/.bashrc ② /etc/bashrc/etc/profile 中包含 pathmunge 函数，负责将 /usr/sbin、/usr/local/sbin 等路径添加到 PATH 变量中。Non-Login Shell 由于跳过了 /etc/profile 的加载，导致这些路径缺失。2. 实际场景分析A. SSH 远程执行命令# 直接登录后执行（Login Shell） ssh user@ip ip a # 正常执行 # 远程直接执行命令（Non-Login Shell） ssh user@ip "ip a" # 报错：bash: ip: command not found原因分析：Login Shell：PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbinNon-Login Shell：PATH=/usr/local/bin:/usr/binip 命令位于 /usr/sbin 下，Non-Login Shell 的 PATH 中不包含该路径。B. Crontab 定时任务脚本在命令行测试正常，放入 crontab 后报错找不到命令。这是因为：命令行执行使用当前用户的完整环境变量Crontab 执行时的环境变量被 sudo 修改（如果使用 sudo）sudo 默认会重置环境变量3. Bash 与 Sh 的区别A. 命令差异命令/特性BashSh (POSIX)source内建命令不支持（用 . 代替）语法扩展支持数组等仅 POSIX 标准 B. 系统链接差异CentOS：/usr/bin/sh → /usr/bin/bash（sh 等同于 bash）Ubuntu：/usr/bin/sh → /usr/bin/dash（sh 是独立的 dash）这就是为什么在 CentOS 上用 sh 执行的脚本在 Ubuntu 上可能报语法错误。三、解决方案1. Crontab 环境变量问题A. 使用 sudo -E 参数# 在 crontab 中使用 sudo -E /path/to/script.sh-E 参数（--preserve-env）可以保留当前用户的环境变量。B. 脚本中显式加载环境变量#!/bin/bash # 在脚本开头添加 source /etc/profile source ~/.bashrcC. 脚本使用 login shell#!/bin/bash --login2. SSH 远程执行问题A. 创建全局环境变量文件在 /etc/profile.d/ 下创建自定义环境变量文件：# /etc/profile.d/my_bashenv.sh pathmunge () { if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; …

Linux 用户活动监控工具 psacct 与 acct 使用教程
type: item
date: 2026-01-26T21:52:05+00:00
description: Linux 用户活动监控工具 psacct 与 acct 使用教程一、概述1. 简介A. 是什么psacct 和 acct 是 Linux 系统中用于监控用户活动的开源工具。这些工具在后台运行，持续跟踪系统中每个用户的活动以及所消耗的资源。B. 为什么学多用户服务器管理需要了解用户行为安全审计和问题排查的基础工具资源管理和容量规划的数据来源系统管理员必备的监控技能C. 学完能做什么查看用户登录时长和连接时间统计追踪用户执行的所有命令监控系统资源消耗情况生成用户活动报告用于审计2. 前置知识A. 必备技能基本 Linux 命令操作了解 Linux 用户和权限概念熟悉 systemctl 服务管理命令B. 推荐知识Linux 进程管理基础系统日志和日志轮转概念二、环境准备1. 系统要求Linux 发行版：RHEL/CentOS/Fedora 或 Ubuntu/Debianroot 或 sudo 权限磁盘空间：至少 500MB 用于日志存储2. 安装步骤RHEL/CentOS/Fedora 系统：sudo yum install psacct # 或在新系统上使用 dnf sudo dnf install psacctUbuntu/Debian 系统：sudo apt install acct其他发行版：# Alpine Linux sudo apk add psacct # Arch Linux sudo pacman -S acct # OpenSUSE sudo zypper install acct3. 启动服务RHEL 系统需要手动启动：# 查看服务状态 sudo systemctl status psacct # 启动服务 sudo systemctl start psacct # 设置开机自启 sudo systemctl enable psacct # 再次查看状态确认 sudo systemctl status psacctDebian 系统会自动启动服务。4. 验证安装# 检查进程日志文件是否创建 ls -lh /var/account/pacct # 查看当前登录统计 ac三、核心概念1. 基本术语psacct/acct：进程 accounting 工具包pacct：进程 accounting 数据文件wtmp：用户登录登出记录文件连接时间：用户登录系统的累计时长2. 工作原理graph TB A[用户登录] --> B[系统记录 wtmp] A --> C[用户执行命令] C --> D[acct 记录进程信息] D --> E[写入 pacct 文件] B --> F[ac 命令读取] E --> G[sa 命令读取] E --> H[lastcomm 命令读取] F --> I[生成统计报告] G --> I H --> I3. 核心命令功能命令功能说明ac显示用户登录/登出统计（连接时间）lastcomm显示用户之前执行的命令accton开启或关闭进程 accountingsa汇总已执行命令的信息last/lastb显示最后登录的用户列表四、快速上手1. 查看总连接时间ac输出示例：total 11299.15这个数字表示所有用户累计连接小时数。2. 按日期查看连接时间ac -d输出示例：Oct 28 total 234.50 Oct 29 total 189.23 Oct 30 total 198.67 Oct 31 total 456.12 Nov 1 total 267.45 Nov 2 total 201.34 Nov 3 total 423.45注意某些日期的异常峰值，需要调查原因。3. 按用户查看连接时间ac -p输出示例：rockylinux 425.61 tecmint 702.29 root 10171.54 total 11299.44可以看到 root 用户的登录时间远超其他用户。4. 查看特定用户连接时间ac ravi输出示例：total 110.31五、进阶内容1. 命令执行统计A. 查看所有命令摘要sa输出包含以下列：第一列：实际执行时间（挂钟时间，分钟）第二列：CPU 时间（系统+用户时间，分钟）第三列：平均 CPU 使用量（以 1k 为单位）第四列：命令名称带星号（*）的命令表示以超级用户权限运行。B. 查看特定用户信息sa -u显示每个用户执行的命令及资源消耗。C. 查看进程统计sa -m显示总进程数和 CPU 分钟数。如果这些数字持续增长，需要调查系统状况。D. 按使用率排序sa -c按百分比显示资源使用情况，帮助识别消耗最多资源的命令。2. 命令历史查询A. 查看用户最后执行的命令lastcomm ravi输出显示用户 ravi 执行的最后命令。B. 限制输出行数l…

Tmux 高效终端工作流配置指南
type: item
date: 2026-01-19T23:00:32+00:00
description: Tmux 高效终端工作流配置指南一、概述1. 简介A. 是什么Tmux 是一个终端复用器，允许用户在单个终端窗口中创建、访问和控制多个终端会话。B. 为什么学永久保存终端会话，SSH 断线不丢失工作状态多窗口、多面板高效切换灵活的会话管理和工作流编排C. 学完能做什么搭建个人化的终端工作环境实现工具的快速调用和切换在嵌套 SSH 会话中流畅操作二、核心概念1. 基本术语会话（Session）：tmux 的最高级别组织单位窗口（Window）：会话中的单个标签页面板（Pane）：窗口中的分割区域前缀键（Prefix）：触发 tmux 命令的组合键2. 工作原理graph TB A[终端] --> B[Tmux Server] B --> C[Session 1] B --> D[Session 2] C --> E[Window 1] C --> F[Window 2] E --> G[Pane 1] E --> H[Pane 2] F --> I[Pane 3]3. 进化历程终端工具的发展推动了 tmux 配置的迭代：早期：简单的分屏功能中期：集成 lazygit 等 Git 工具现在：集成 AI 助手弹窗、现代文件管理器等graph LR A[分屏] --> B[+lazygit] B --> C[+AI助手] C --> D[+Yazi] D --> E[完整工具链]三、配置原则1. 前缀键优化默认的 Ctrl-b 按键位置不佳，推荐改用反引号键：反引号键在手位更自然的位置减少手指伸展距离提高频触效率配置示例：# 设置前缀键为 Ctrl-` unbind C-b set -g prefix C-` bind C-` send-prefix2. Popup 快捷调用将常用工具配置为 popup 弹窗，随叫随到：按键触发，显示工具界面关闭后自动回到原工作流不占用固定面板空间sequenceDiagram participant U as 用户 participant T as Tmux participant P as Popup U->>T: 按下快捷键 T->>P: 创建弹窗 P->>U: 显示工具界面 U->>P: 使用工具 U->>P: 关闭弹窗 P->>T: 销毁弹窗 T->>U: 返回原界面3. SSH 嵌套会话处理在多层 SSH 连接中使用 tmux 需要避免按键冲突：外层和内层使用不同的前缀键或者使用按键绑定切换活动会话推荐方案：外层 tmux：Ctrl-`内层 tmux：Ctrl-a或者使用 Ctrl-a a 切换到内层四、配置示例1. 基础配置# 前缀键 set -g prefix C-` unbind C-b bind C-` send-prefix # 索引从 1 开始 set -g base-index 1 setw -g pane-base-index 1 # 鼠标支持 set -g mouse on # 自动重命名窗口 setw -g automatic-rename on # 状态栏 set -g status-interval 1 set -g status-justify left set -g status-bg black set -g status-fg white2. Popup 工具配置# Lazygit popup bind g display-popup -E -w 80% -h 80% lazygit # Yazi 文件管理器 popup bind y display-popup -E -w 80% -h 80% yazi # HTOP 监控 popup bind h display-popup -E -w 80% -h 80% htop # AI 助手 popup bind a display-popup -E -w 80% -h 80% claude-code3. 面板管理# 分割面板 bind | split-window -h -c "#{pane_current_path}" bind - split-window -v -c "#{pane_current_path}" # 在面板间移动 bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R # 调整面板大小 bind -r H resize-pane -L 5 bind -r J resize-pane -D 5 bind -r K resize-pane -U 5 bind -r L resize-pane -R 54. 会话管理# 快速切换会话 bind -r C-s choose-ses…