Linux parallel-ssh(PSSH)批量工具的用法详解
PSSH(parallel-ssh,并行的ssh) 提高工作效率
PSSH 官网:https://github.com/ParallelSSH/parallel-ssh
parallel-ssh
Asynchronous parallel SSH client library.
Run SSH commands over many - hundreds/hundreds of thousands - number of servers asynchronously and with minimal system load on the client host.
Native code based client with extremely high performance - based on libssh2
C library.
我们经常需要ssh
到多个主机上执行相同的命令,为了提高效率,我们通常会自己写个脚本,循环遍历执行我们的命令,比如:
for host in `cat hosts.txt`;do ssh username@$host -p port cmd done
采用这种方式的问题是:
1)必须自己写脚本,且正确性没法保证。
2)各个主机执行任务是串行的,必须前一台主机执行完毕后,下一台主机才能执行,难以实现并行执行。
我们可以使用parallel-ssh
工具来实现并行ssh
远程执行命令,它是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,目标也是简化大量计算机的管理,项目地址:https://code.google.com/p/parallel-ssh/
pssh 包安装5个实用程序:parallel-ssh、parallel-scp、parallel-rsync、parallel-slurp、parallel-nuke 每个实用程序都并行地操作多个主机。
1)parallel-ssh 在多个主机上并行地运行命令。
2)parallel-scp 把文件并行地复制到多个主机上。(全量拷贝)
3)parallel-rsync 通过 rsync 协议把文件高效地并行复制到多个主机上。(增量拷贝)
4)parallel-slurp 把文件并行地从多个远程主机复制到中心主机上。
5)parallel-nuke 并行地在多个远程主机上杀死进程。
pssh 安装
只需要在主节点上安装pssh,系统中已经安装有python,pip
pip install parallel-ssh
源码下载、解压、安装
github 下载源码:https://github.com/ParallelSSH/parallel-ssh/releases
wget https://github.com/ParallelSSH/parallel-ssh/archive/1.9.1.tar.gz
wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz
tar -xvf parallel-ssh-1.9.1.tar.gz
cd parallel-ssh-1.9.1
python setup.py build
python setup.py install
使用它首先需要安装,ubuntu已经集成到软件包中,直接使用apt-get
安装:
sudo apt-get install pssh // Ubuntu
yum -y install pssh // Linux (CentOS)
brew install pssh // MacOS(不可用,请用上面的源码安装)
为了简便,设置以下alias:
alias pssh='parallel-ssh'
alias pscp='parallel-scp'
pssh 帮助命令
# pssh --help Usage: pssh [OPTIONS] command [...] Options: --version show program's version number and exit --help show this help message and exit -h HOST_FILE, --hosts=HOST_FILE hosts file (each line "[user@]host[:port]") -H HOST_STRING, --host=HOST_STRING additional host entries ("[user@]host[:port]") -l USER, --user=USER username (OPTIONAL) -p PAR, --par=PAR max number of parallel threads (OPTIONAL) -o OUTDIR, --outdir=OUTDIR output directory for stdout files (OPTIONAL) -e ERRDIR, --errdir=ERRDIR output directory for stderr files (OPTIONAL) -t TIMEOUT, --timeout=TIMEOUT timeout (secs) (0 = no timeout) per host (OPTIONAL) -O OPTION, --option=OPTION SSH option (OPTIONAL) -v, --verbose turn on warning and diagnostic messages (OPTIONAL) -A, --askpass Ask for a password (OPTIONAL) -x ARGS, --extra-args=ARGS Extra command-line arguments, with processing for spaces, quotes, and backslashes -X ARG, --extra-arg=ARG Extra command-line argument -i, --inline inline aggregated output and error for each server --inline-stdout inline standard output for each server -I, --send-input read from standard input and send as input to ssh -P, --print print output as we get it Example: pssh -h hosts.txt -l irb2 -o /tmp/foo uptime
编写需要远程操作的host列表hosts.txt
:
node1
node2
node3
...
node100
使用时需要指定用户名和输入用户密码(必须所有主机的用户和密码相同)以及远程主机列表,
通过-l username
选项指定用户名,使用-A
选项指定需要输入密码,使用-h
指定主机列表,比如在所有的主机执行uptime
操作:
pssh -P -l foo -A -h hosts.txt uptime
若我们当前主机的登录名为fgp
,且fgp
能够免密码登录hosts.txt
的所有主机,则可以省略用户名和密码。比如,所有的主机执行uptime
操作,并打印结果:
pssh -P -h hosts.txt uptime
主机太多了,把输出保存到文件中:
pssh -o uptime_result -h hosts.txt uptime
传输本地文件到所有的主机中:
pscp -h hosts.txt local_file.txt ~/target_file.txt
PSSH配置
配置主要有两项内容:
1)从结点的IP列表文件
2)主节点到从节点的ssh无密钥登录
IP列表文件就是将从结点的IP按行存在一个文件里,给它命名为host_list.txt,里面共有99行,第一行172.16.0.2
下面是ssh无密钥登录
由于好多很多操作需要有sudo权限,所以尽量ssh无密钥登录到从节点的root用户下,详见米扑博客:Linux ssh 切换登录用户自动转到root用户
ssh-keygen (然后按提示输入信息)
ssh-copy-id –i ~/.ssh/id_rsa.pub root@172.16.0.2 (将密钥复制到从节点,需要输入密码)
PSSH使用
命令格式:
pscp -h host_list.txt -r source_file_path destination_file_path
#例如将主节点的/home/master/1.txt拷贝到从节点的/home/slave/目录下
pscp -h host_list.txt -r /home/master/1.txt /home/slave/
#pscp是远程拷贝文件,如从主节点将文件分发到所有从节点
pssh -h host_list.txt -P "command"
#例如在从节点建立新目录/home/slave/test
pssh -h host_list.txt -P "mkdir /home/slave/test"
使用PSSH应该会的命令
pssh结合脚本使用比较高效,有以下几个命令可能会用到
sed
cat
重定向 >>与>
expect
以上是简单使用方法,掌握以上的这些操作足够完成我们大多数工作,提高工作效率。
Linux parallel-ssh(PSSH)批量工具
作为数据中心运维,每天要面对无数的Linux系统服务器,每天可能都要远程连接很多台服务器来运行每天的管理任务。
例如 收集有关磁盘使用情况或运行进程的信息。如果您只想登录到一台服务器,然后将这些命令批量发送到其他远程服务器,能实现吗?
Parallel-SSH是一款能实现此功能的便捷工具。使用Parallel-SSH,您可以在Linux服务器上批量运行运行命令,这对于使用管理着多台服务器的管理员来说是一个福音。
这里将说明如何在Ubuntu Server 18.04平台上安装和使用Parallel-SSH。
一、安装
可以使用单个命令完成Parallel-SSH的安装。打开终端窗口并使用命令:
sudo apt-get install pssh
安装完成后,您就可以开始配置使用了。
二、配置命令
我们将创建一个文件,其中包含我们希望在远程服务器上运行的所有命令。使用命令:
sudo vim pssh-commands
在该文件中,复制以下内容:
#!/bin/bash # # mimvp.com # 2018.08.08 echo # show system uptime uptime echo # show who is logged on and what they are doing who echo # show top 5 processes by RAM usage ps -eo cmd,pid,ppid,%mem,%cpu --sort=-%mem | head -n 6 exit 0
保存并关闭该文件。
注意:上面只是一个示例,您可以在上面的文件中添加所需的任何命令,例如:
ls /tmp/
cat /etc/passwd
三、创建主机文件
接下来,我们需要创建一个hosts文件。使用命令:
sudo vim pssh-hosts
在此文件中,主机将以user@IP的形式列出,每行一个,根据需要添加任意数量,如下所示:
mimvp@192.168.1.162
mimvp@192.168.1.221
保存并关闭该文件。
四、运行并行SSH
现在我们要运行命令,已准备好命令和主机文件,因此请使用以下命令以使用这些文件:
parallel-ssh -h pssh-hosts -A -P -I < pssh-command
以上命令功能如下:
-h - hostname(在本例中,我们使用的是主机文件)
-A 要求输入密码
-P 打印输出时
-I 读取输入并发送到每个ssh进程
系统将提示您输入与pssh-hosts中配置的用户关联的密码。经过身份验证后,您应该可以看到远程计算机上命令的成功输出(图A)。
您可以滚动查看命令的输出以收集有关服务器的信息。
ssh私钥批量部署认证以及pssh工具使用方法
在日常工作中,批量管理服务器是个力气活,如果人工一台一台处理,效率低下。此时,老外写的pssh工具实现了批量管理。
pssh的原理是先建立ssh私钥认证,然后用pssh工具批量管理。
下面,我写了一个批量部署ssh私钥认证的脚本。
vim batch_sshkey.sh
#!/bin/bash cd /root cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys for i in `cat ip.txt` do ip=$(echo "$i"|cut -f1 -d":") password=$(echo "$i" | cut -f2 -d":") expect -c " spawn scp /root/.ssh/authorized_keys /root/remote_operate.sh root@$ip:/tmp/ expect { \"*yes/no*\" {send \"yes\r\"; exp_continue} \"*password*\" {send \"$password\r\"; exp_continue} \"*Password*\" {send \"$password\r\";} } " expect -c " spawn ssh root@$ip "/tmp/remote_operate.sh" expect { \"*yes/no*\" {send \"yes\r\"; exp_continue} \"*password*\" {send \"$password\r\"; exp_continue} \"*Password*\" {send \"$password\r\";} } " done
vim ip.txt(前面是IP,后面是密码,用冒号:分割)
192.168.8.23:123456
192.168.8.24:456789
vim remote_operate.sh
#!/bin/bash if [ ! -d /root/.ssh ];then mkdir /root/.ssh fi cp /tmp/authorized_keys /root/.ssh/
运行 batch_sshkey.sh 即可
chmod +x batch_sshkey.sh
sh batch_sshkey.sh
下面介绍PSSH工具使用方法,使用很简单:
# yum -y install *Python* # # tar zxvf pssh-1.4.3.tar.gz # cd pssh-1.4.3 # python setup.py install
批量执行hostname命令
# pssh -h other.txt -l root -i hostname [1] 16:08:36 [SUCCESS] 192.168.110.122 22 Hadoop-namenode [2] 16:08:36 [SUCCESS] 192.168.110.123 22 hadoop-secondnamenode [3] 16:08:36 [SUCCESS] 192.168.110.203 22 EnvFactoryServer203 [4] 16:08:36 [SUCCESS] 192.168.110.202 22 EnvFactoryServer202 [5] 16:08:36 [SUCCESS] 192.168.251.43 22 SC-HOST-43 [6] 16:08:36 [SUCCESS] 192.168.251.42 22 SC-HOST-42 [7] 16:08:36 [SUCCESS] 192.168.0.106 22 PSA-Host-106 [8] 16:08:36 [SUCCESS] 192.168.0.105 22 PSA-HOST-105 [9] 16:08:36 [SUCCESS] 192.168.110.138 22 hadoop-datanode3 [10] 16:08:36 [SUCCESS] 192.168.110.252 22 zhuanxiang.liuxin [11] 16:08:36 [SUCCESS] 192.168.110.137 22 hadoop-datanode2 [12] 16:08:36 [SUCCESS] 192.168.110.140 22 hadoop-datanode5 [13] 16:08:36 [SUCCESS] 192.168.110.139 22 hadoop-datanode4 [14] 16:08:36 [SUCCESS] 192.168.110.213 22 SiteA-APP-01 [15] 16:08:36 [SUCCESS] 192.168.110.141 22 hadoop-datanode6 [16] 16:08:36 [SUCCESS] 192.168.0.100 22 SC-Host-100 [17] 16:08:36 [SUCCESS] 192.168.110.124 22 hadoop-datanode1 [18] 16:08:37 [SUCCESS] 192.168.0.101 22 SC-Host-101
批量拷贝本地文件nrpe.tgz到远端服务器
# pscp -h other.txt -l root /home/soft/nrpe.tgz /usr/local/ [1] 16:11:21 [SUCCESS] 192.168.110.123 22 [2] 16:11:22 [SUCCESS] 192.168.251.43 22 [3] 16:11:23 [SUCCESS] 192.168.110.202 22 [4] 16:11:23 [SUCCESS] 192.168.110.140 22 [5] 16:11:23 [SUCCESS] 192.168.110.138 22 [6] 16:11:25 [SUCCESS] 192.168.110.203 22 [7] 16:11:25 [SUCCESS] 192.168.110.213 22 [8] 16:11:26 [SUCCESS] 192.168.0.101 22 [9] 16:11:26 [SUCCESS] 192.168.110.122 22 [10] 16:11:27 [SUCCESS] 192.168.0.105 22 [11] 16:11:28 [SUCCESS] 192.168.110.139 22 [12] 16:11:28 [SUCCESS] 192.168.110.141 22 [13] 16:11:28 [SUCCESS] 192.168.0.100 22 [14] 16:11:28 [SUCCESS] 192.168.110.124 22 [15] 16:11:29 [SUCCESS] 192.168.110.137 22 [16] 16:11:29 [SUCCESS] 192.168.0.106 22 [17] 16:11:30 [SUCCESS] 192.168.110.252 22 [18] 16:11:30 [SUCCESS] 192.168.251.42 22
查看文件 other.txt
# more other.txt 192.168.0.100 192.168.0.101 192.168.251.42 192.168.251.43 192.168.0.105 192.168.0.106 192.168.110.213 192.168.110.122 192.168.110.123 192.168.110.124 192.168.110.137 192.168.110.138 192.168.110.139 192.168.110.140 192.168.110.141 192.168.110.252 192.168.110.202 192.168.110.20
总结
Parallel-SSH唯一问题是它无法使用sudo运行命令。
如果你有root权限,这不是问题,但你可能已经将root用户锁定在ssh登录之外,所以仍然是个问题。
换句话说,您无法使用Parallel-SSH运行sudo apt-get upgrade之类的命令。这很好,因为你可能不想使用这样的工具来运行需要root或sudo权限的命令。
相反,您可以创建处理不同任务的各种命令文件(例如收集网络信息,磁盘信息,进程信息等)。
参考推荐:
Linux 修改默认端口、增加普通用户、使用密钥等安全登录SSH
Linux shell 脚本通过expect实现自动输入密码
Linux之/etc/profile、~/.bash_profile等几个文件的执行过程
nohup、&、disown、setsid、screen、jobs 后台运行命令区别
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2020-01-07 05:36:06
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!