使用PSSH批量管理Linux服务器

日期: 2018-11-07 15:48:25 人气: - 评论: 0

PSSH是一款开源的软件,使用蟒实现,用于批量的ssh操作大批量机器; PSSH是一个可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的;比起对于循环的做法,我更推荐使用PSSH使用PSSH的前提是:必须在本机与其他服务器上配置好密钥认证访问(即通过ssh信任关系)。

下面就说下使用PSSH进行批量操作的记录:

1)安装PSSH 
可以荫直接安装:

[root @ bastion-IDC~] #yum install -y pssh

2)PSSH用法

[root@bastion-IDC ~]# pssh --help

-h执行命令的远程
主机列表文件  -H user @ ip:port文件内容格式[user @] host [:port]  
-l远程机器的用户名  
-p一次最大允许多少连接  
-o输出内容重定向到一个文件  
-e执行错误重定向到一个文件  
-t设置命令执行的超时时间  
-A提示输入密码并且把密码传递给ssh(注意这个参数添加后只是提示作用,随便输入或者不输入直接回车都可以)  
-O设置ssh参数的具体配置,参照ssh_config配置文件  
-x传递多个SSH命令,多个命令用空格分开,用引号括起来  
-X同-x但是一次只能传递一个命令  
-i显示标准输出和标准错误在每台主机执行完毕后  
-I读取每个输入命令,并传递给SSH网求允许进程命令脚本传送到标准输入侧

3)PSSH实例说明

[root@bastion-IDC ~]# cat hosts.txt    //列表文件内的信息格式是。“IP:端口”,如果本机和远程机器使用的SSH端口一致,则可以省去端口,直接用IP就行不过建议还是将端口都带上为好
192.168 .1.101:22 
192.168.1.109:22 
192.168.1.118:25791 
192.168.1.105:25791 
如上四台机器放在一个列表文件hosts.txt内,本机已经和这四台机器做了ssh无密码登陆的信任关系
注意:列表文件内的机器必须提前和本机做好SSH信任关系,如果没有做的话,那么PSSH批量执行时,轮到这台没有做信任关系的机器时就不会执行

一)批量执行命令

[root @ bastion-IDC~] #pssh -h hosts.txt -l root -i'uptime' 
[1] 16:05:48 [SUCCESS] 192.168.1.105 
03:03:25 up 79 days,13:44, 0位用户,平均负载:0.04,0.01,0.00 
[2] 16:05:48 [SUCCESS] 192.168.1.118 
03:03:32 up 75 days,15:
27,4位用户,平均负载:0.96,0.74,0.45 Stderr :地址192.168.1.118映射到localhost,但这不会映射回地址 - 可能是BREAK-IN ATTEMPT!
[3] 16:05:48 [SUCCESS] 192.168.1.109 
03:03:25 up 61 days,
21:56,2 users,load average:0.02,0.06,0.18 Stderr:Address 192.168.1.102 map to localhost,but this没有映射回地址 - 可能突破了尝试!
[4] 16:05:48 [SUCCESS] 192.168.1.101 16:03:17 
35天,23:45,1位用户,平均负载:0.03,0.04,0.01
Stderr:地址192.168.1.101映射到localhost,但这不会映射回地址 - 可能是BREAK-IN ATTEMPT!

如果添加-A参数,那么即使提前做了SSH信任关系,还是会提示输入密码!

[root @ bastion-IDC~] #pssh -h hosts.txt -l root -i -A'uptime' 
警告:如果其他人拥有超级用户
权限或访问您的帐户,请不要输入您的密码
密码://注意这个参数添加后只是提示作用,可以在此随便输入或者不输入直接回车都可以
[1] 16:08:25 [SUCCESS] 192.168.1.105 
03:06:03 79天,13 :
46,0位用户,平均负载:0.00,0.00,0.00 [2] 16:08:25 [SUCCESS] 192.168.1.109 
03:06:03 up 61 days,21:59,2位用户,平均负载:0.00,0.04 ,0.15 
Stderr:地址192.168.1.102映射到localhost,但是这不会映射回地址 - 可能是BREAK-IN ATTEMPT!
[3] 16:08:25 [SUCCESS] 192.168.1.101 
16:05:54 35天,23:47,1位用户,平均负载:0.00,0.02,0.00
Stderr:地址192.168.1.101映射到localhost,但这不会映射回地址 - 可能是BREAK-IN ATTEMPT!
[4] 16:08:25 [SUCCESS] 192.168.1.118 
03:06:10最多75天,
15:29,4位用户,平均负载:0.85,0.78,0.51 Stderr:地址192.168.1.118映射到localhost,但是这个没有映射回地址 - 可能突破了尝试!
[root @ bastion-IDC~] #pssh -h hosts.txt -l root -i -t 10 -o /root/pssh.log'uptime'&date'[1 
] 17:01:02 [SUCCESS] 192.168.1.109 
03:58:33最多79天,5:58,1位用户,平均负载:
0.00,0.00,0.00 Wed Feb 8 03:58:33 EST 2017 
[2] 17:01:02 [SUCCESS] 192.168.1.105 
03: 58:40 up 79 days,14:39,1位用户,平均负载:
0.00,0.00,0.00 Wed Feb 8 03:58:40 EST 2017
[3] 17:01:02 [SUCCESS] 192.168.1.101 
16:58:31最多36天,40分钟,1位用户,平均负载:
0.10,0.03,0.01 Wed Feb 8 16:58:31 CST 2017 
Stderr:Address 192.168.1.101映射到localhost,但这不会映射回地址 - 可能是BREAK-IN ATTEMPT!
[4] 17:01:02 [SUCCESS] 192.168.1.118 
03:58:47上升75天,16:22,3位用户,平均负载:
0.20,0.21,0.31 Wed Feb 8 03:58:47 EST 2017 
Stderr:地址192.168.1.118映射到localhost,但这不会映射回地址 - 可能是BREAK-IN ATTEMPT!
[root @ bastion-IDC~] #ll /root/pssh.log/ 
total 16 
-rw-r - r--。1 root root 100 Feb 8 17:01 192.168.1.101 
-rw-r - r--。1 root root 99 Feb 8 17:01 192.168.1.105
-rw-R - R--。1 root root 99 Feb 8 17:01 192.168.1.109 
-rw-r - r--。1 root root 100 Feb 8 17:01 192.168.1.118

b)中批量上传文件或目录(pscp.pssh命令)
批量上传本地文件/mnt/test.file到远程服务器上的/ TMP目录:

[root @ bastion-IDC~] #pscp.pssh -l root -h hosts.txt /mnt/test.file / tmp / 
[1] 16:18:05 [SUCCESS] 192.168.1.105 
[2] 16:18: 05 [成功] 192.168.1.109 
[3] 16:18:05 [SUCCESS] 192.168.1.101 
[4] 16:18:05 [SUCCESS] 192.168.1.118

批量上传本地文件/mnt/test.file,/mnt/aa.file,/mnt/bb.file到远程服务器上的/ tmp目录目录:

[root @ bastion-IDC~] #pscp.pssh -l root -h hosts.txt /mnt/test.file /mnt/aa.file /mnt/bb.file / tmp / 
[1] 16:22:50 [成功] 192.168.1.109 
[2] 16:22:50 [SUCCESS] 192.168.1.105 
[3] 16:22:50 [SUCCESS] 192.168.1.118 
[4] 16:22:50 [SUCCESS] 192.168.1.101

或者:

[root @ bastion-IDC~] #pscp.pssh -l root -h hosts.txt /mnt/{test.file,aa.file,bb.file} / tmp / 
[1] 16:23:44 [SUCCESS] 192.168.1.109 
[2] 16:23:44 [SUCCESS] 192.168.1.105 
[3] 16:23:44 [SUCCESS] 192.168.1.101 
[4] 16:23:44 [SUCCESS] 192.168.1.118

批量上传本地目录的/ mnt /钟到远程服务器上的/ TMP目录(上传目录需要添加-r参数):

[root @ bastion-IDC~] #pscp.pssh -l root -h hosts.txt -r / mnt / zhong / tmp / 
[1] 16:19:36 [SUCCESS] 192.168.1.109 
[2] 16:19: 36 [成功] 192.168.1.105 
[3] 16:19:36 [成功] 192.168.1.101 
[4] 16:19:36 [成功] 192.168.1.118

批量上传本地目录的/ mnt /钟,到/ mnt / AA,到/ mnt / VV到远程服务器上的/ TMP目录

[root @ bastion-IDC~] #pscp.pssh -l root -h hosts.txt -r / mnt / zhong / mnt / aa / mnt / vv / tmp / 
[1] 16:21:02 [SUCCESS] 192.168。 1.105 
[2] 16:21:02 [SUCCESS] 192.168.1.109 
[3] 16:21:02 [SUCCESS] 192.168.1.101 
[4] 16:21:02 [SUCCESS] 192.168.1.118

或者:

[root @ bastion-IDC~] #pscp.pssh -l root -h hosts.txt -r / mnt / {zhong,aa,vv} / tmp / 
[1] 16:22:00 [SUCCESS] 192.168.1.109 
[ 2] 16:22:00 [SUCCESS] 192.168.1.105 
[3] 16:22:00 [SUCCESS] 192.168.1.101 
[4] 16:22:00 [SUCCESS] 192.168.1.118

c)中批量下载文件或目录(pslurp命令)
批量下载服务器上的某文件到本地,不用担心重名问题,因为PSSH已经建立了以文件列表内的IP为名称的目录来存放下载的文件

[root @ bastion-IDC~] #pslurp -l root -h hosts.txt / etc / hosts。
[1] 16:32:01 [SUCCESS] 192.168.1.109 
[2] 16:32:01 [SUCCESS] 192.168.1.105 
[3] 16:32:01 [SUCCESS] 192.168.1.101 
[4] 16:32:01 [SUCCESS] 192.168.1.118 
[root @ bastion-IDC~] #ll 
total 123 
drwxr-xr-x。2 root root 4096 Feb 8 16:32 192.168.1.101 
drwxr-xr-x。2 root root 4096 Feb 8 16:32 192.168.1.105 
drwxr-xr-x。2 root root 4096 Feb 8 16:32 192.168.1.109 
drwxr-xr-x。2 root root 4096 Feb 8 16:32 192.168.1.118 
[root @ bastion-IDC~] #ll 192.168.1.101 
total 4 
-rw-r - r--。1 root root 224 Feb 8 16:32 hosts 
[root @ bastion-IDC~] #ll 192.168.1.109 
total 4 
-rw-r - r--。1 root root 252 Feb 8 16:32 hosts
[root @ bastion-IDC~] #ll 192.168.1.105 
总计4 
-rw-r - r--。1 root root 252 Feb 8 16:32 hosts 
[root @ bastion-IDC~] #ll 192.168.1.118 
total 4 
-rw-r - r--。1 root root 212 Feb 8 16:32 hosts

另外特别注意:
上面的批量下载操作,只能下载到本地的当前目录下,不能在命令中跟指定的路径:

[root @ bastion-IDC~] #pslurp -l root -h hosts.txt / etc / hosts / mnt / 
[1] 16:34:14 [FAILURE] 192.168.1.109退出错误代码1 
[2] 16:34 :14 [FAILURE] 192.168.1.105退出错误代码1 
[3] 16:34:14 [FAILURE] 192.168.1.101退出错误代码1 
[4] 16:34:14 [FAILURE] 192.168.1.118退出错误代码1

要想下载到本机的到/ mnt目录下,正确的做法是先切换到的/ mnt目录下,然后再执行下载命令:(列表文件要跟全路径)

[root @ bastion-IDC~] #cd / mnt / 
[root @ bastion-IDC mnt] #pslurp -l root -h /root/hosts.txt / etc / hosts ./ 
[1] 16:34:34 [SUCCESS ] 192.168.1.109 
[2] 16:34:34 [SUCCESS] 192.168.1.105 
[3] 16:34:34 [SUCCESS] 192.168.1.118 
[4] 16:34:34 [SUCCESS] 192.168.1.101 
[root @ bastion -IDC mnt] #ll 
总共16 
drwxr-xr-x。2 root root 4096 Feb 8 16:34 192.168.1.101 
drwxr-xr-x。2 root root 4096 Feb 8 16:34 192.168.1.105 
drwxr-xr-x。2 root root 4096 Feb 8 16:34 192.168.1.109 
drwxr-xr-x。2 root root 4096 Feb 8 16:34 192.168.1.118

上面是批量下载文件,要是批量下载目录,只需要添加一个-r参数即可!

[root @ bastion-IDC mnt] #pslurp -l root -h /root/hosts.txt -r / home / ./ 
[1] 16:39:05 [SUCCESS] 192.168.1.109 
[2] 16:39:05 [SUCCESS] 192.168.1.105 
[3] 16:39:05 [SUCCESS] 192.168.1.101 
[4] 16:39:05 [SUCCESS] 192.168.1.118 
[root @ bastion-IDC mnt] #ll 192.168.1.101 
共8 
drwxr -xr-X。6 root root 4096 Feb 8 16:39 home 
-rw-r - r--。1 root root 224 Feb 8 16:38 hosts 
[root @ bastion-IDC mnt] #ll 192.168.1。* 
192.168.1.101:total 

drwxr-xr-x。6 root root 4096 Feb 8 16:39 home 
-rw-r - r--。1 root root 224 Feb 8 16:38 hosts 
192.168.1.105:total 

drwxr-xr-x。4 root root 4096 Feb 8 16:39 home 
-rw-r - r--。1 root root 252 Feb 8 16:38 hosts
192.168.1.109:
总共8 
drwxr-xr-x。4 root root 4096 Feb 8 16:39 home 
-rw-r - r--。1 root root 252 Feb 8 16:38 hosts 
192.168.1.118:total 

drwxr-xr-x。3 root root 4096 Feb 8 16:39 home 
-rw-r - r--。1 root root 212 Feb 8 16:38 hosts

d)批量同步(prsync命令)
同步本机的/ mnt /测试目录下的文件或目录到远程机器的到/ mnt /测试路径下

[root @ bastion-IDC~] #prsync -l root -h hosts.txt -r / mnt / test / / mnt / test / 
[1] 16:46:41 [SUCCESS] 192.168.1.109 
[2] 16:46 :41 [SUCCESS] 192.168.1.105 
[3] 16:46:41 [SUCCESS] 192.168.1.118 
[4] 16:46:41 [SUCCESS] 192.168.1.101

同步本机的/ mnt /测试目录下的文件或目录到远程机器的到/ mnt路径下

[root @ bastion-IDC~] #prsync -l root -h hosts.txt -r / mnt / test / / mnt / 
[1] 16:47:40 [SUCCESS] 192.168.1.109 
[2] 16:47:40 [SUCCESS] 192.168.1.105 
[3] 16:47:45 [SUCCESS] 192.168.1.101 
[4] 16:47:46 [SUCCESS] 192.168.1.118

注意:
上面批量同步目录操作是将本机对应目录数据同步到远程机器上,远程机器上对于目录下多余的文件也会保留(不会删除多余文件)

同理,批量同步文件操作,去掉-r参数,
注意:同步文件的时候,其实就是完全覆盖,远程机器对应文件内的文件会被全部替换
如下:
同步本机的到/ mnt /测试/文件文件内容到远程服务器的/ mnt /测试/文件文件内

[root @ bastion-IDC~] #prsync -l root -h hosts.txt / mnt / test / file / mnt / test / file  
[1] 16:53:54 [SUCCESS] 192.168.1.109 
[2] 16:53 :54 [SUCCESS] 192.168.1.105 
[3] 16:53:54 [SUCCESS] 192.168.1.101 
[4] 16:53:54 [SUCCESS] 192.168.1.118 
[root @ bastion-IDC~] #prsync -l root - h hosts.txt / mnt / test / file / mnt / aaa 
[1] 16:54:03 [SUCCESS] 192.168.1.109 
[2] 16:54:03 [SUCCESS] 192.168.1.105 
[3] 16:54:03 [成功] 192.168.1.101 
[4] 16:54:04 [SUCCESS] 192.168.1.118

E)批量杀远程机器上的进程(pnuke命令)
比如批量杀掉远程机器上的nginx的进程

[root @ bastion-IDC~] #pnuke -h hosts.txt -l root nginx 
[1] 17:09:14 [SUCCESS] 192.168.1.109  
[2] 17:09:14 [SUCCESS] 192.168.1.105  
[3] 17:09:15 [SUCCESS] 192.168.1.118  
[4] 17:09:15 [SUCCESS] 192.168.1.101