linux命令之- pssh

pssh提供OpenSSH和相关工具的并行版本。包括pssh,pscp,prsync,pnuke和pslurp。该项目包括psshlib,可以在自定义应用程序中使用。pssh是python写的可以并发在多台机器上批量执行命令的工具,它的用法可以媲美ansible的一些简单用法,执行起来速度比ansible快它支持文件并行复制,远程命令执行,杀掉远程主机上的进程等等。杀手锏是文件并行复制,,当进行再远程主机批量上传下载的时候,最好使用它。pssh用于批量ssh操作大批量机器;pssh是一个可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的;比起for循环的做法,更推荐使用pssh! (注意需要安装 python 2.4 或以上版本)
各版本下载地址: https://clsn.io/files/pssh/
百度下载地址:https://pan.baidu.com/s/1co3Hwoc0yI4LAKvXoXPzfg (提取密码: d2jy)

[root@bastion-IDC ~]# wget https://clsn.io/files/pssh/pssh-2.3.1.tar.gz
[root@bastion-IDC ~]# tar zxf pssh-2.3.1.tar.gz
[root@bastion-IDC ~]# cd pssh-2.3.1
[root@bastion-IDC pssh-2.3.1]# python setup.py install

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

//列表文件内的信息格式是“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批量执行时,轮到这台没有做信任关系的机器时就不会执行。

a)批量执行命令
[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 users, load average: 0.04, 0.01, 0.00
[2] 16:05:48 [SUCCESS] 192.168.1.118
03:03:32 up 75 days, 15:27, 4 users, load average: 0.96, 0.74, 0.45
Stderr: Address 192.168.1.118 maps to localhost, but this does not map back to the address - POSSIBLE 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 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[4] 16:05:48 [SUCCESS] 192.168.1.101
16:03:17 up 35 days, 23:45, 1 user, load average: 0.03, 0.04, 0.01
Stderr: Address 192.168.1.101 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!

如果添加-A参数,那么即使提前做了ssh信任关系,还是会提示输入密码!
[root@bastion-IDC ~]# pssh -h hosts.txt -l root -i -A 'uptime'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:                          //注意这个参数添加后只是提示作用,可以在此随便输入或者不输入直接回车都可以
[1] 16:08:25 [SUCCESS] 192.168.1.105
03:06:03 up 79 days, 13:46, 0 users, load average: 0.00, 0.00, 0.00
[2] 16:08:25 [SUCCESS] 192.168.1.109
03:06:03 up 61 days, 21:59, 2 users, load average: 0.00, 0.04, 0.15
Stderr: Address 192.168.1.102 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[3] 16:08:25 [SUCCESS] 192.168.1.101
16:05:54 up 35 days, 23:47, 1 user, load average: 0.00, 0.02, 0.00
Stderr: Address 192.168.1.101 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[4] 16:08:25 [SUCCESS] 192.168.1.118
03:06:10 up 75 days, 15:29, 4 users, load average: 0.85, 0.78, 0.51
Stderr: Address 192.168.1.118 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!

[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 up 79 days, 5:58, 1 user, load average: 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 user, load average: 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 up 36 days, 40 min, 1 user, load average: 0.10, 0.03, 0.01
Wed Feb 8 16:58:31 CST 2017
Stderr: Address 192.168.1.101 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[4] 17:01:02 [SUCCESS] 192.168.1.118
03:58:47 up 75 days, 16:22, 3 users, load average: 0.20, 0.21, 0.31
Wed Feb 8 03:58:47 EST 2017
Stderr: Address 192.168.1.118 maps to localhost, but this does not map back to the address - POSSIBLE 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)批量上传文件或目录(prsync命令)
同步本机/mnt/test目录下的文件或目录到远程机器的/mnt/test路径下
[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/test目录下的文件或目录到远程机器的/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/test/file文件内容到远程服务器/mnt/test/file文件内
[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 [SUCCESS] 192.168.1.101
[4] 16:54:04 [SUCCESS] 192.168.1.118

e)批量kill远程机器上的进程(pnuke命令)
比如批量kill掉远程机器上的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

 

 

安装说明
因为最近在搭建ovirt虚拟化管理平台,在创建vm后,需要对vm进行压力测试,所以需要通过pssh来进行并发对多台vm执行stress进行压力测试。

安装pssh之前,将多台vm之间设置为ssh免密码访问
#ssh-keygen#ssh-copy-ip root@10.10.200.36#ssh-copy-ip root@10.10.200.37#ssh-copy-ip root@10.10.200.38#ssh-copy-ip root@10.10.200.39#ssh-copy-ip root@10.10.200.40#ssh-copy-ip root@10.10.200.41#ssh-copy-ip root@10.10.200.42
安装pssh
#yum install pssh
安装完成后,测试下pssh的效果,通过执行uptime命令来检测效果

创建list文件,在list文件中写入所需进行并发的主机ip

10.10.200.3610.10.200.3710.10.200.3810.10.200.3910.10.200.4010.10.200.4110.10.200.42
而后执行pssh命令

[root@37_centos6 files]# pssh -i -h list 'uptime'[1] 02:21:45 [SUCCESS] 10.10.200.39 14:21:44 up 22 min,  1 user,  load average: 0.00, 0.00, 0.00[2] 02:21:45 [SUCCESS] 10.10.200.42 02:21:45 up 22 min,  1 user,  load average: 0.00, 0.00, 0.00[3] 02:21:45 [SUCCESS] 10.10.200.41 02:21:45 up 22 min,  1 user,  load average: 0.00, 0.02, 0.00[4] 02:21:45 [SUCCESS] 10.10.200.40 02:21:44 up 22 min,  1 user,  load average: 0.00, 0.00, 0.00[5] 02:21:45 [SUCCESS] 10.10.200.37 02:21:45 up  5:09,  1 user,  load average: 0.07, 0.04, 0.00[6] 02:21:45 [SUCCESS] 10.10.200.38 02:21:44 up 22 min,  0 users,  load average: 0.05, 0.04, 0.01[7] 02:21:45 [SUCCESS] 10.10.200.36 14:21:45 up 43 min,  0 users,  load average: 0.00, 0.00, 0.00
上述uptime执行没有问题,现在来通过pssh对各台vm并发执行stress命令,对vm进行压力测试

[root@37_centos6 files]# pssh -i -h list 'stress --cpu 1 --io 4 --vm 2 --vm-bytes 128M --timeout 2h'          

查看各台主机的进程中,查看stress是否进行

[root@39_centos6 ~]# ps -ef | grep stressroot      2310     1  0 14:22 ?        00:00:00 stress --cpu 1 --io 4 --vm 2 --vm-bytes 128M --timeout 2hroot      2317  2310 94 14:22 ?        00:50:56 stress --cpu 1 --io 4 --vm 2 --vm-bytes 128M --timeout 2hroot      2318  2310 28 14:22 ?        00:15:28 stress --cpu 1 --io 4 --vm 2 --vm-bytes 128M --timeout 2hroot      2319  2310 90 14:22 ?        00:49:13 stress --cpu 1 --io 4 --vm 2 --vm-bytes 128M --timeout 2hroot      2320  2310 31 14:22 ?        00:17:01 stress --cpu 1 --io 4 --vm 2 --vm-bytes 128M --timeout 2hroot      2321  2310 85 14:22 ?        00:46:07 stress --cpu 1 --io 4 --vm 2 --vm-bytes 128M --timeout 2hroot      2322  2310 30 14:22 ?        00:16:20 stress --cpu 1 --io 4 --vm 2 --vm-bytes 128M --timeout 2hroot      2323  2310 28 14:22 ?        00:15:36 stress --cpu 1 --io 4 --vm 2 --vm-bytes 128M --timeout 2hroot      2437  2162  0 15:16 pts/0    00:00:00 grep stress

通过以上操作,就完成了pssh对个vm并发执行stress进行压力测试。
 

原文链接:https://my.oschina.net/xiaoxiezi/blog/1491630

1.先生成本机(master)密钥对

ssh-keygen -t rsa -C '' 

  直接按三次回车, 这条命令是生成无密码的密钥对,你也可以在‘’里面加邮箱。

生成的密钥对在 ~/.ssh/ 目录下面  id_rsa  和id_rsa.pub.

2.将id_rsa.pub私钥放入需要被无密码登陆的主机。

在master主机中使用命令查看,复制查询结果:

cat ~/.ssh/id_rsa.pub

3.粘贴到client主机

vim  ~/.ssh/authorized_keys

4.在client主机中开启ssh免密码登陆

vim /etc/ssh/sshd_config中

RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)

5.在master主机上执行。

ssh-copy-id  -i ~/.ssh/id_rsa.pub "-p  22   root@192.168.6.102"   ~/.ssh/authorized_keys

需要输入一次client主机密码

6.下载pssh并安装(master)

#wget https://pypi.python.org/packages/source/p/pssh/pssh-2.3.1.tar.gz

#tar -zxvf pssh-2.3.1.tar.gz

#cd pssh-2.3.1

#python setup.py install

7.在master主机建立ip库

格式:ip:端口(22端口可以省略)

#vim  iplist_config

按上面格式存储

8.执行命令

pssh  -P -h iplist_config  -i 'ls  -a'

展示root目录下的文件,替换为你需要的命令。

9.向多个ip批量复制文件

比如:将本地 /etc/sysconfig/network文件,发送到远程主机的/tmp/network 位置。

pscp -h test.txt /etc/sysconfig/network /tmp/network 

9.END.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值