如何使用并行 ssh (PSSH) 在多个 Linux/Unix/BSD 服务器上并行执行命令
最近我偶然发现了一款名为并行 ssh (PSSH) 的漂亮小工具,它可以在多个 Linux / UNIX / BSD 服务器上运行单个命令。您可以使用这款 SSH IT 自动化工具轻松提高工作效率。
有关 pssh 的更多信息
pssh 是一个用于在某些主机上并行执行 ssh 的命令行工具。它的特点包括:
- 将输入发送到所有进程
- 输入 ssh 密码
- 保存输出到文件
- IT/系统管理员任务自动化,例如修补服务器或查找错误日志
- 超时及更多
让我们看看如何在 Linux 和类 Unix 系统上安装和使用 pssh。
并行 ssh(PSSH)安装
您可以根据您的 Linux 和 Unix 版本安装 pssh。安装软件包后,您可以获得 openssh 工具的并行版本。安装中包括:
- pssh 命令 – 并行 ssh
- pscp 命令 – 并行 scp
- prsync 命令 – 并行 rsync
- pnuke 命令 – 并行核
- pslurp 命令 – 并行 slurp
请注意, Linux 发行版之间的命令名称可能不同。以下是它在 Ubuntu Linux 20.04 LTS 上的样子。因此,请根据您的发行版或 Unix 变体进行调整:
$ dpkg -L pssh | grep bin
/usr/bin
/usr/bin/parallel-nuke
/usr/bin/parallel-rsync
/usr/bin/parallel-scp
/usr/bin/parallel-slurp
/usr/bin/parallel-ssh
在 Debian/Ubuntu Linux 上安装 pssh
输入以下apt-get 命令/ apt 命令来安装 pssh:
$ sudo apt install pssh
或者
$ sudo apt-get install pssh
图 01:在 Debian/Ubuntu Linux 上安装 pssh
在 Apple MacOS/OS X 上安装 pssh
首先,在 macOS 上安装 Homebrew,然后输入以下 brew 命令:
$ brew install pssh
图 02:在 MacOS Unix 上安装 pssh
在 FreeBSD unix 上安装 pssh
输入以下任一命令:
# cd /usr/ports/security/pssh/ && make install clean
或
# pkg install pssh
图 03:在 FreeBSD 上安装 pssh
在 RHEL/CentOS/Fedora Linux 上安装 pssh
首先打开 EPEL repo并输入以下命令yum 命令:
$ sudo yum install pssh
示例输出:
图 4:在 RHEL/CentOS/Red Hat Enterprise Linux 上安装 pssh
在 Fedora Linux 上安装 pssh
键入以下 dnf 命令:
$ sudo dnf install pssh
图 05:在 Fedora 上安装 pssh
在 Arch Linux 上安装 pssh
键入以下命令:
$ sudo pacman -S python-pip
$ pip install pssh
使用公钥-私钥对设置无密码 SSH
建议您设置 ssh 密钥以实现自动化。要生成密钥对,请运行 ssh-keygen 命令:
$ ssh-keygen
接下来,使用 ssh-copy-id 命令将公钥传输到远程主机:使用
ssh 命令进行测试:有关无密码 SSH 主题的更多信息,
请参阅我之前的教程Linux/Unix 服务器上的基于 SSH 公钥的身份验证和在 Linux/Unix 系统上设置 SSH 密钥。
$ ssh-copy-id user@server-ip
$ ssh-copy-id vivek@dellm6700
$ ssh-copy-id root@192.168.2.30
$ ssh-copy-id root@192.168.2.45
$ ssh-copy-id root@192.168.2.46
$ ssh vivek@dellm6700
$ ssh root@192.168.2.30
如何使用 pssh 命令
首先,您需要创建一个名为 hosts 文件的文本文件,pssh 会从中读取主机名。语法非常简单。主机文件中的每一行都采用 [user@]host[:port] 格式,可以包含以“#”开头的空白行和注释行。这是我使用“ cat ”/“more”/“less”或“ bat command ”显示的示例文件,名为 ~/.pssh_hosts_files:
运行date 命令所有主机:
示例输出:
$ cat ~/.pssh_hosts_files
vivek@dellm6700
root@192.168.2.30
root@192.168.2.45
root@192.168.2.46
$ pssh -i -h ~/.pssh_hosts_files date
[1] 18:10:10 [SUCCESS] root@192.168.2.46 Sun Feb 26 18:10:10 IST 2017 [2] 18:10:10 [SUCCESS] vivek@dellm6700 Sun Feb 26 18:10:10 IST 2017 [3] 18:10:10 [SUCCESS] root@192.168.2.45 Sun Feb 26 18:10:10 IST 2017 [4] 18:10:10 [SUCCESS] root@192.168.2.30 Sun Feb 26 18:10:10 IST 2017
在每个主机上运行 uptime 命令或 uname 命令:
$ pssh -i -h ~/.pssh_hosts_files uptime
示例输出:
[1] 18:11:15 [SUCCESS] root@192.168.2.45 18:11:15 up 2:29, 0 users, load average: 0.00, 0.00, 0.00 [2] 18:11:15 [SUCCESS] vivek@dellm6700 18:11:15 up 19:06, 0 users, load average: 0.13, 0.25, 0.27 [3] 18:11:15 [SUCCESS] root@192.168.2.46 18:11:15 up 1:55, 0 users, load average: 0.00, 0.00, 0.00 [4] 18:11:15 [SUCCESS] root@192.168.2.30 6:11PM up 1 day, 21:38, 0 users, load averages: 0.12, 0.14, 0.09
您现在可以自动执行常见的系统管理任务,例如修补所有服务器:
$ pssh -h ~/.pssh_hosts_files -- sudo yum -y update
让我们分解一下针对 RHEL/Fedora 和 CentOS/Rocky/Alma Linux 主机运行的命令:
- pssh:pssh 命令的名称。
- -h ~/.pssh_hosts_files:包含主机列表的文件路径。
- --:一个分隔标志,告知 pssh 命令已结束并且新命令已开始。
- sudo yum -y update:在每个主机上运行的命令。
这是另一个用于安装 Debian 或 Ubuntu Linux 计算机的安全更新的命令:
双破折号“ -- ”表示“命令行标志结束”。它告诉 ssh 或任何其他有效的 shell 命令不要尝试解析命令行选项后面的内容。有关更多信息,请参阅shell 命令中的双破折号是什么意思。
$ pssh -h ~/.pssh_hosts_files -- sudo apt-get -y update
$ pssh -h ~/.pssh_hosts_files -- sudo apt-get -y upgrade
如何使用 pssh 将文件复制到所有服务器?
语法是:
$ pscp -h ~/.pssh_hosts_files src dest
要将 $HOME/demo.txt 复制到所有服务器上的 /tmp/,请输入:
$ pscp -h ~/.pssh_hosts_files $HOME/demo.txt /tmp/
示例输出:
[1] 18:17:35 [SUCCESS] vivek@dellm6700 [2] 18:17:35 [SUCCESS] root@192.168.2.45 [3] 18:17:35 [SUCCESS] root@192.168.2.46 [4] 18:17:35 [SUCCESS] root@192.168.2.30
或者使用prsync命令进行高效的文件复制:
$ prsync -h ~/.pssh_hosts_files /etc/passwd /tmp/
$ prsync -h ~/.pssh_hosts_files *.html /var/www/html/
如何在多个主机上并行终止进程?
使用 pnuke 命令在多台主机上并行终止进程。语法是:
$ pnuke -h .pssh_hosts_files process_name
在主机上终止 nginx 和 firefox:
$ pnuke -h ~/.pssh_hosts_files firefox
$ pnuke -h ~/.pssh_hosts_files nginx
使用 parallel-slurp 从多个主机并行下载文件
假设您需要从三台主机复制/下载 /etc/hosts 文件到您当前运行 parallel-slurp/pslurp 的机器。创建一个名为 my-hosts.txt 的文件,如下所示:
pi@192.168.2.237 vivek@192.168.2.20 vivek@192.168.2.236
现在将这三个主机的 /etc/hosts 复制到 /tmp/output/:
运行它:
或者此命令会将my-hosts.txt文件中列出的每个主机的/etc/hosts
文件复制到目录 /tmp/output/。这些文件将重命名为my-hosts.txt文件中所述机器上的主机。使用 cd 命令进行验证:
请注意,pslurp/parallel-slurp 为my-hosts.txt文件中所述的每个主机创建一个目录/文件夹,其中包含下载文件。在本例中,它是主机:
$ mkdir -p /tmp/output/
$ parallel-slurp -h my-hosts.txt -L /tmp/output/ /etc/hosts hosts
$ pslurp -h my-hosts.txt -L /tmp/output/ /etc/hosts hosts
$ cd /tmp/output/
$ ls -l
$ ls -R
$ cd /tmp/output/192.168.2.236/
$ ls -l
$ cat hosts
结论
pssh 是一款非常好的工具,可以在多台服务器上并行执行 SSH 命令。如果您有 5 或 7 台服务器或虚拟机,它非常有用。不过,如果您需要做一些复杂的事情,您应该研究一下 Ansible 和 co。有关更多信息,请参阅此处的官方网站。
参见
有关使用 man 命令或 help 命令的更多信息,请参阅 pssh/pscp 命令手册页:
$ man pssh
$ man pscp