运维123 - 命令行
type: channel
link: https://www.sddts.cn/index.php/tag/%E5%91%BD%E4%BB%A4%E8%A1%8C/
items: CIA 泄露文档中的 Git 分支清理单行命令
items: 用逗号前缀管理自定义命令行脚本
items: dog 命令行 DNS 客户端技术分析

CIA 泄露文档中的 Git 分支清理单行命令
type: item
date: 2026-02-21T10:47:08+00:00
description: CIA 泄露文档中的 Git 分支清理单行命令一、概述1. 简介A. 来源2017 年，WikiLeaks 发布了 Vault7，这是 CIA 黑客工具和内部文档的大型集合。在这些漏洞利用工具和监控工具中，隐藏着一份非常普通的东西：一页包含 Git 技巧和诀窍的内部开发者文档。B. 核心内容这份 CIA 开发团队的文档中包含一个实用的 Git 分支清理单行命令，可以快速删除已合并的本地分支。C. 实用价值这个命令可以定期清理本地仓库中已合并但未删除的分支，保持分支列表的整洁。2. 前置知识A. 必备技能Git 基本操作命令行基础管道和重定向概念B. 推荐知识Git 分支管理流程Shell 命令组合二、问题背景1. 问题现象随着时间推移，本地 Git 仓库会积累大量已合并但未删除的分支。每个功能分支、热修复分支和实验分支在合并后都保留在那里。2. 查看已合并分支git branch --merged这个命令会列出所有已合并到当前分支的本地分支。3. 痛点分析手动逐个删除分支非常繁琐分支列表变得冗长，难以找到活动分支容易误删除重要分支三、CIA 原版命令1. 命令内容git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d2. 命令解析graph LR A[git branch --merged] -->|列出已合并分支| B[grep -v 过滤] B -->|排除当前分支和master| C[xargs -n 1 执行] C -->|逐个安全删除| D[git branch -d]3. 各部分说明A. git branch --merged列出所有已合并到当前分支的本地分支。B. grep -v "*|master"过滤掉当前分支（用 * 标记）过滤掉 master 分支防止删除这些重要分支C. xargs -n 1 git branch -d对每个剩余的分支执行删除操作使用小写 -d 参数，安全删除如果分支未合并，删除操作会失败并提示四、更新版本命令1. 更新原因大多数现代项目已从 master 分支迁移到 main 分支。需要更新命令以适应新的命名规范。2. 更新后的命令git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d3. 改进说明与远程 main 分支比较，而不是本地当前分支使用扩展正则表达式 -vE排除 main 和 develop 等常用分支支持排除其他长期分支4. 执行时机建议在部署完成后，从 main 分支执行此命令。五、配置为 Git 别名1. 创建别名将以下内容添加到 ~/.gitconfig 文件中：[alias] ciaclean = "!f() { git branch --merged origin/main | grep -vE \"^\\s*(\\*|main|develop)\" | xargs -n 1 git branch -d; }; f"2. 使用方式git ciaclean3. Shell 别名方式如果更喜欢 Shell 别名，添加到 ~/.zshrc 或 ~/.bashrc：alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'4. 执行效果执行后，分支列表从 40 个条目缩减到少数几个。graph TD A[执行前: 40 个分支] --> B[执行 git ciaclean] B --> C[删除已合并分支] C --> D[执行后: 少量活动分支]六、安全注意事项1. 安全删除机制使用小写 -d 参数而不是大写 -D-d 参数会检查分支是否已合并未合并的分支删除会失败，保护数据2. 强制删除警告如果需要强制删除未合并分支，使用：git branch -D branchname但要非常谨慎，未合并的分支可能包含重要代码。3. 排除规则确保命令正确排除了：当前分支（用 * 标记）main/master 主分支develop 开发分支其他长期维护的分支七、最佳实践1. 定期清理建议在以下时机执行清理：每次部署完成后每周定期维护合并大量 PR 后2. 团队协作将此命令分享给团队成员统一使用相同的别名在开发文档中记录3. 自动化考虑可以将其集成到 CI/CD 流程中，或设置为 Git Hook。八、命令对比1. 原版 vs 更新版特性CIA 原版更新版基准分支当前分支origin/main排除分支master…

用逗号前缀管理自定义命令行脚本
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. 文档说明在每个脚本…

dog 命令行 DNS 客户端技术分析
type: item
date: 2026-01-17T07:48:01+00:00
description: dog 命令行 DNS 客户端技术分析一、概述1. 简介A. 是什么dog 是一个用 Rust 编写的命令行 DNS 客户端工具，类似于传统的 dig 工具，但提供了更现代的用户体验和更强大的功能。B. 为什么值得关注彩色输出让 DNS 查询结果更易读支持标准的命令行参数语法，学习曲线更平缓支持 DNS-over-TLS 和 DNS-over-HTTPS 加密查询协议可以输出 JSON 格式，便于与其他工具集成使用 Rust 编写，性能优异且内存安全C. 能做什么查询各类 DNS 记录（A、MX、NS、TXT 等）指定自定义 DNS 服务器进行查询通过 UDP、TCP、TLS 或 HTTPS 协议进行查询以彩色或 JSON 格式输出结果测量 DNS 响应时间二、核心特性1. 基本功能dog 提供了完整的 DNS 查询功能，支持所有常见的记录类型和网络类。2. 协议支持graph LR subgraph 传统协议 UDP[UDP] TCP[TCP] end subgraph 加密协议 DoT[DNS-over-TLS] DoH[DNS-over-HTTPS] end Client[dog客户端] --> UDP Client --> TCP Client --> DoT Client --> DoH UDP --> Server[DNS服务器] TCP --> Server DoT --> Secure[安全DNS解析] DoH --> Secure3. 输出格式默认彩色输出：易于阅读，自动高亮重要信息JSON 输出：便于脚本处理和与其他工具集成短格式：仅显示第一个结果三、安装方式1. 包管理器安装根据不同平台，可通过以下方式安装：Arch Linux：dog 包macOS Homebrew：dog formulaNixOS：dogdns 包2. 预编译二进制从 GitHub Releases 页面下载适用于 Windows、macOS 和 Linux 的预编译二进制文件。3. 从源码编译graph TD A[获取源码] --> B{选择编译选项} B -->|完整功能| C[cargo build] B -->|最小体积| D[cargo build --no-default-features] C --> E[编译完成] D --> E E --> F[复制到 PATH]前置要求：Rust 编译器 1.45.0 或更高版本推荐使用 rustup 安装 Rust编译命令：cargo build cargo test发布版本编译：cargo build --release # 或使用 just just build-release编译后的二进制文件位于 target/release 目录，建议复制到 /usr/local/bin 等 PATH 目录。四、功能特性开关dog 提供三个 Cargo 功能开关，默认全部启用：1. with_idna启用国际化域名支持，允许查询非 ASCII 字符的域名。2. with_tls启用 DNS-over-TLS 支持，通过 TLS 加密 DNS 查询。3. with_https启用 DNS-over-HTTPS 支持，通过 HTTPS 加密 DNS 查询（依赖 with_tls）。示例：仅保留 IDNA 支持，禁用 TLS 和 HTTPScargo build --no-default-features --features=with_idna可通过 --version 参数查看已禁用的功能列表。五、命令行参数1. 查询选项：人类可读的主机名、名称服务器、类型或类-q, --query=HOST：要查询的主机名或域名-t, --type=TYPE：DNS 记录类型（A、MX、NS 等）-n, --nameserver=ADDR：发送数据包的名称服务器地址--class=CLASS：DNS 记录的网络类（IN、CH、HS）2. 发送选项--edns=SETTING：是否选择使用 EDNS（disable、hide、show）--txid=NUMBER：将事务 ID 设置为特定值-Z=TWEAKS：设置不常见的协议级调整3. 协议选项-U, --udp：使用 UDP 上的 DNS 协议-T, --tcp：使用 TCP 上的 DNS 协议-S, --tls：使用 DNS-over-TLS 协议-H, --https：使用 DNS-over-HTTPS 协议4. 输出选项-1, --short：短模式，仅显示第一个结果-J, --json：以 JSON 格式显示输出--color, --colour=WHEN：何时为输出着色（always、automatic、never）--seconds：不格式化…