轻量、无 Agent、秒级并发:dsh 批量执行命令的艺术

📅 2026/8/15 11:50:45
轻量、无 Agent、秒级并发:dsh 批量执行命令的艺术
在 Linux / Unix 集群运维语境中dsh通常指Distributed Shell分布式 Shell用于在多台远程主机上同时执行相同的命令。下面从安装、配置、使用、原理、对比等方面进行系统介绍。一、什么是 dshdsh是一个轻量级命令行工具用于在多台服务器上并行执行同一个 Shell 命令并将结果收集回本地显示。它非常适合批量查看状态、批量执行脚本、批量重启服务等场景。例如你有 30 台 Web 服务器想同时查看每台机器的磁盘使用率不需要逐台 SSH 登录只需要dsh -c -g web df -hdsh会并发连接web组中的所有主机执行df -h并在每行输出前加上主机名。二、dsh 的核心能力批量执行命令一条命令同时下发到多台机器。机器分组管理通过文件定义机器组如web、db、cache。并发控制可设置最大并发连接数避免连接风暴。输出整理配合dshbak可以按主机或按输出内容分组展示。无 Agent不依赖目标机器安装额外服务仅依赖 SSH/Rsh。配置简单纯文本配置容易理解和管理。三、安装Debian / Ubuntusudo apt update sudo apt install -y dshCentOS / RHEL部分发行版默认仓库可能没有dsh可以通过 EPEL 尝试安装或从源码编译# 尝试 sudo yum install dsh # 或从源码编译安装 wget http://www.netfort.gr.jp/~dancer/software/dsh.tar.gz tar xzf dsh.tar.gz cd dsh-* ./configure make sudo make install安装完成后会包含dsh、dcs、dshbak等命令。四、快速上手1. 配置 SSH 免密登录dsh通常使用 SSH 连接远程主机因此需要提前配置 SSH 密钥认证ssh-keygen -t rsa ssh-copy-id userweb01 ssh-copy-id userweb02如果使用默认远程 Shell 是rsh需要修改为ssh否则会走不安全的 RSH 协议。2. 创建机器组mkdir -p ~/.dsh/group cat ~/.dsh/group/web EOF web01 web02 web03 EOF3. 配置 dsh 使用 SSH编辑用户级配置文件cat ~/.dsh/dsh.conf EOF remoteshell ssh showmachinenames 1 forklimit 32 EOF4. 执行第一条命令dsh -c -g web uptime输出类似web01: 14:00:01 up 10 days, 2:15, 1 user, load average: 0.00, 0.01, 0.05 web02: 14:00:01 up 10 days, 3:10, 2 users, load average: 0.02, 0.03, 0.05 web03: 14:00:01 up 8 days, 1:30, 1 user, load average: 0.10, 0.08, 0.06五、配置文件详解5.1 dsh 主配置文件dsh的配置分为全局配置和用户配置全局配置/etc/dsh/dsh.conf用户配置~/.dsh/dsh.conf常见配置项配置项示例说明remoteshellremoteshell ssh指定远程 Shell强烈建议使用sshshowmachinenamesshowmachinenames 1输出时是否显示主机名1 为显示forklimitforklimit 32最大并发连接数waiterwaiter 1等待远程命令执行完成shellshell /bin/bash本地使用的 Shell完整示例# ~/.dsh/dsh.conf remoteshell ssh showmachinenames 1 forklimit 325.2 机器列表文件dsh可以维护一个默认机器列表文件位置全局/etc/dsh/machines.list用户~/.dsh/machines.list每行一个主机名web01 web02 db01 db02也可以使用userhost形式adminweb01 adminweb025.3 机器组机器组文件存放在全局组目录/etc/dsh/group/用户组目录~/.dsh/group/一个组名对应一个文件文件名就是组名。例如创建 Web 组mkdir -p ~/.dsh/group cat ~/.dsh/group/web EOF web01 web02 web03 EOF创建数据库组cat ~/.dsh/group/db EOF db01 db02 EOF列出当前所有可用组dsh -M六、常用命令选项选项说明-c, --concurrent并发执行默认可能为顺序执行建议加上-m, --machines指定机器列表逗号分隔如-m web01,web02-g, --group指定机器组如-g web-r, --remoteshell临时指定远程 Shell如-r ssh-f, --forklimit限制并发连接数如-f 20-i, --ignore-failed忽略连接失败的主机-v, --verbose显示详细执行信息-M, --list-groups列出所有机器组-o, --output-file将输出写入指定文件-s, --sort输出按主机名排序--分隔选项与命令防止命令被误解析示例# 指定机器列表并发执行 dsh -c -m web01,web02,db01 hostname # 指定组并限制并发为 10 dsh -c -f 10 -g web systemctl status nginx # 输出到文件 dsh -c -g web df -h -o /tmp/disk_report.txt七、使用 dshbak 整理输出dshbak是dsh配套的输出格式化工具可以将多主机输出进行分组或合并。按主机分组dsh -c -g web uname -r | dshbak合并相同输出如果多台主机输出完全相同可以使用-c合并dsh -c -g web uname -r | dshbak -c输出类似---------------- 5.15.0-101-generic ---------------- web01, web02, web03这样在集群环境一致时阅读非常方便。八、实战示例1. 查看所有 Web 服务器的负载dsh -c -g web uptime2. 批量查看内存使用情况dsh -c -g web free -h3. 批量检查服务状态dsh -c -g web systemctl is-active nginx4. 批量更新软件包dsh -c -g web sudo apt-get update sudo apt-get upgrade -y5. 批量查看磁盘使用并合并相同结果dsh -c -g web df -h | grep /$ | dshbak -c6. 批量执行本地脚本先将脚本分发到目标机器再通过dsh执行dsh -c -g web bash /tmp/check_env.sh7. 命令中包含管道或重定向必须用引号将完整命令传给远程 Shelldsh -c -g web ps aux | grep nginx | wc -l九、工作原理dsh本质是一个“命令广播器”其工作流程大致如下读取配置文件确定远程 Shell 类型例如ssh。读取-m指定的主机列表或-g指定组文件中的主机列表。如果启用了-c并发模式则对每个主机创建一个子进程。每个子进程调用远程 Shell 执行命令例如ssh web01 uptime ssh web02 uptime捕获每个子进程的标准输出和标准错误。根据配置决定是否在每行输出前添加主机名前缀。主进程等待所有子进程结束汇总退出状态。因此dsh不需要在目标机器上安装任何 Agent只依赖 SSH/Rsh 即可完成批量操作。十、与同类工具对比工具特点适用场景dsh轻量、配置简单、分组方便快速批量执行命令pdsh支持多种远程模块HPC 常用大规模集群、高性能计算环境psshPython 实现附带pscp、prsync等批量命令 文件分发Ansible无 Agent、模块化、幂等、Playbook配置管理、复杂自动化流程ClusterSSH打开多个终端窗口交互式操作需要同时操作多台机器的交互场景dsh的优势在于简单直接适合日常运维中“只想快速在多台机器上跑一条命令”的场景如果要做复杂配置管理建议使用 Ansible。十一、最佳实践与注意事项务必使用 SSH 并配置密钥认证dsh默认可能使用rsh既不安全也不方便。配置remoteshell ssh并完成免密登录。控制并发数大量主机同时 SSH 连接可能造成本地端口耗尽或远程 SSH 服务压力过大。建议设置forklimit 32或更小。先用小范围测试危险命令批量重启、删除、更新等操作前先对 1~2 台机器执行确认无误后再扩大范围。注意本地 Shell 变量展开如果命令中包含$、反引号、管道等使用单引号包裹防止在本地被展开。例如dsh -c -g web echo $HOSTNAME如果使用双引号本地 Shell 会先展开$HOSTNAME导致所有机器输出本地主机名。使用dshbak提升可读性当输出量很大时使用dshbak -c合并相同结果快速发现异常机器。保留操作日志重要操作可以重定向输出到文件dsh -c -g web df -h | tee /tmp/dsh_$(date %F).log注意交互式命令不可用dsh适合执行非交互式命令。像vim、top这类交互式命令无法正常使用需要交互式场景请使用ClusterSSH。十二、常见问题1. 提示Host key verification failed原因是首次连接远程主机时 SSH 需要确认主机指纹。解决方法是提前手动连接一次或使用ssh-keyscan添加ssh-keyscan web01 ~/.ssh/known_hosts2. 输出没有主机名检查配置文件是否包含showmachinenames 13. 配置不生效注意区分全局配置/etc/dsh/dsh.conf和用户配置~/.dsh/dsh.conf。用户配置优先级更高检查文件语法是否正确。4. 找不到机器组使用dsh -M查看是否识别到组确认组文件放在~/.dsh/group/或/etc/dsh/group/下且文件名与组名一致。5. 并发执行时输出混乱这是正常现象可添加-s排序或使用dshbak整理dsh -c -g web df -h | dshbak总结dsh是一个经典的分布式 Shell 工具核心价值在于简单、快速、轻量。通过 SSH 和简单的文本配置就能实现在多台服务器上批量执行命令。虽然今天有 Ansible 等更强大的自动化工具但在临时排查、批量查看状态、快速执行脚本等场景中dsh仍然是一个非常实用的小工具。