pdsh 是 Linux 环境下用于批量管理多台主机的实用工具,通过并行执行命令大幅提升运维效率,适合集群规模较大的场景。
linux pdsh 安装与配置
pdsh 的安装方式主要取决于你的操作系统,多数现代 Linux 发行版官方仓库已收录 pdsh,直接使用包管理器即可完成安装,无需额外配置。
包管理器安装
- Debian / Ubuntu:运行
sudo apt update && sudo apt install pdsh,系统会自动安装 pdsh 以及依赖的 openssh-client。 - RHEL / CentOS 7 / 8:使用
sudo yum install epel-release启用 EPEL 源,sudo yum install pdsh,CentOS 8 可用dnf install pdsh。 - Fedora:
sudo dnf install pdsh,Fedora 官方仓库通常包含较新版本。 - openSUSE:
sudo zypper install pdsh。
源码编译安装
如果官方仓库版本过旧,或者你想定制功能(如启用 SSL 支持),可以自行编译,从 pdsh 官网下载源码包,解压后执行:
./configure --with-ssh --with-dshgroups
make && sudo make install
--with-ssh 启用 SSH 模块,--with-dshgroups 支持主机组文件,编译前需确保系统已安装 libssh2-devel 等开发包。
基本配置
pdsh 默认通过 SSH 连接目标主机,因此需要提前配置好 SSH 免密登录,生成密钥对并分发公钥到所有节点:
ssh-keygen -t rsa -b 4096
ssh-copy-id user@host1
pdsh 默认读取 /etc/pdsh/machines 文件作为主机列表,每行一个主机名,你也可以通过 -w 参数临时指定,或使用 -f 加载自定义主机文件。
pdsh 命令 用法详解
pdsh 的核心用法是 pdsh -w 主机列表 '命令',理解其常用选项是高效操作的关键。
基本格式与选项
-w:指定目标主机,支持逗号分隔、范围表达式。-w host1,host2或-w node[1-100]。-R:指定远程命令类型,默认是ssh,可选rsh、exec(本地执行)。-l:指定远程登录用户名,若不指定,默认使用当前本地用户。-p:设置最大并发连接数,默认 32,可根据网络带宽和节点数量调整。-f:从文件读取主机列表,每行一个主机名。-t:设置连接超时秒数,默认 10 秒。-b:禁止广播错误,安静模式下仅显示命令输出。
常用示例
批量查看系统负载:
pdsh -w web[1-10],db[1-2] 'uptime'
输出会带上主机名前缀,方便区分。
使用主机文件:
echo "192.168.1.101" > /tmp/hosts.txt
echo "192.168.1.102" >> /tmp/hosts.txt
pdsh -f /tmp/hosts.txt 'hostname'
以指定用户执行:
pdsh -w node[1-5] -l root 'systemctl restart nginx'
控制并发数:
pdsh -w node[1-50] -p 10 'df -h'
dshbak 命令
pdsh 提供 dshbak 工具,用于合并和格式化 pdsh 的输出,将输出重定向到 dshbak 后,可自动合并相同结果,减少重复信息。
pdsh -w node[1-10] 'uptime' | dshbak
更多用法提示
- 可使用
-R exec在本地模拟多进程,测试命令逻辑。 - 通过
-b参数可抑制错误输出,适合脚本中调用。 - pdsh 支持
-q静默模式,仅输出错误信息。
pdsh 与 ssh 批量操作对比
在日常运维中,简单粗暴的 for 循环 for host in $(cat hosts); do ssh $host 'cmd'; done 也能批量执行命令,但 pdsh 在效率、灵活性和易用性上更具优势。
对比要点
| 对比项 | pdsh | 纯 SSH 循环 |
|---|---|---|
| 并发执行 | 原生支持,默认并发 32 | 需自行写后台进程或 xargs -P |
| 主机列表 | 支持范围表达式、文件、组 | 需手动解析列表 |
| 输出管理 | 自动带主机名前缀,支持 dshbak 合并 | 需自行拼接 |
| 错误处理 | 支持超时、重试机制 | 需额外脚本控制 |
| 安装复杂度 | 极简,包管理器一键安装 | 无需额外安装 |
实际场景差异
- 集群规模小于 10 台:两者差异不大,纯 SSH 循环更直观,适合快速临时任务。
- 集群规模大于 50 台:pdsh 的并发优势明显,同等时间内命令执行完毕所需时间仅为循环方式的 1/5 至 1/10(取决于网络和配置)。
- 需要频繁变更主机列表:pdsh 的组文件和范围表达式大幅减少手动输入错误。
小结
如果你只在几台机器上偶尔操作,直接使用 SSH 循环即可,但如果你管理着数十台以上的服务器,或者需要定期执行批量任务,pdsh 是更专业的选择,pdsh 的并发模型经过优化,不会因为单个节点超时而阻塞整个任务。
pdsh 实战场景
批量更新服务配置
假设你有 20 台 Nginx 服务器,需要修改 nginx.conf 并重启,你可以先在本地修改配置文件,然后通过 pdsh 分发并重启:
pdsh -w web[1-20] -l root 'cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak'
pdsh -w web[1-20] -l root 'scp your_control_host:/path/to/nginx.conf /etc/nginx/nginx.conf'
pdsh -w web[1-20] -l root 'nginx -t && systemctl reload nginx'
集群状态采集
同时收集所有节点的磁盘使用情况:
pdsh -w all -f /etc/pdsh/cluster 'df -h' | grep -v 'Filesystem' | sort
统计各节点进程数:
pdsh -w node[1-100] 'ps aux | wc -l'
日志收集与排查
快速定位多个节点上的错误日志:
pdsh -w app[1-50] 'grep -i "ERROR" /var/log/app.log | tail -5'
批量检查系统时间差(ntp 同步情况):
pdsh -w node[1-30] 'date +%s'
pdsh 报错常见问题解决
错误:pdsh: no host specified
原因:未通过 -w、-f 或默认主机文件指定目标主机。
解决:检查是否至少提供了主机列表,若想使用默认主机文件,请确认 /etc/pdsh/machines 存在且包含有效主机名。
错误:ssh: connect to host <hostname> port 22: Connection refused
原因:目标主机 SSH 服务未运行,或防火墙屏蔽了 22 端口。
解决:先在单机上测试 ssh <hostname> 确认连通性,然后检查目标主机的 sshd 服务状态和防火墙规则。
错误:pdsh: command not found
原因:pdsh 未安装,或安装后未加入 PATH。
解决:重新执行安装步骤,或使用 which pdsh 确认路径,若通过源码编译安装,默认路径是 /usr/local/bin/pdsh,可将其加入 ~/.bashrc 的 PATH 变量。
错误:pdsh: Connection timed out
原因:网络不通或节点响应超时。
解决:增大 -t 超时值,检查网络路由和防火墙设置,并发数过高也可能导致延时,尝试降低 -p 参数。
pdsh 的常见问题
pdsh 和 pssh 有什么区别?
两者都是并行执行命令的工具,但 pdsh 更轻量,通常作为系统工具集成,默认使用 SSH 协议,pssh(Parallel SSH)功能更丰富,支持交互式密码输入,但需要 Python 环境,在实际使用中,pdsh 的安装和配置更简单,适合快速部署,而 pssh 在密码管理和输出格式上更灵活,多数 Linux 发行版会同时提供,你可根据习惯选择。
pdsh 如何指定主机组?
主机组可以通过 -g 选项指定,前提是已配置好组文件,默认组文件位于 /etc/pdsh/group,格式为 groupname: host1,host2,host3。db: db1,db2,db3,然后使用 pdsh -g db 'uptime' 即可执行,组文件也支持嵌套其他组名,实现层级管理。
pdsh 报错 Permission denied (publickey) 怎么办?
这表明 SSH 密钥认证失败,最常见原因是目标主机的 ~/.ssh/authorized_keys 中未包含本机的公钥,请运行 ssh-copy-id user@host 重新分发公钥,并确认目标主机 ~/.ssh/ 目录权限为 700,authorized_keys 权限为 600,如果使用 -l 指定了不同用户,需确保该用户的主目录下存在正确的密钥文件。
pdsh 是 Linux 运维中处理批量任务的利器,安装简单、用法直接,尤其适合集群环境的日常巡检和变更操作,掌握其核心选项和常见问题应对,可大幅提升服务器管理效率。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/507519.html


