pssh提供OpenSSH和相关工具的并行版本。包括pssh,pscp,prsync,pnuke和pslurp。该项目包括psshlib,可以在自定义应用程序中使用。
pssh是python写的可以并发在多台机器上批量执行命令的工具,它的用法可以媲美ansible的一些简单用法,执行起来速度比ansible快它支持文件并行复制,远程命令执行,杀掉远程主机上的进程等等。
杀手锏是文件并行复制,,当进行再远程主机批量上传下载的时候,最好使用它。pssh用于批量ssh操作大批量机器;pssh是一个可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的;比起for循环的做法,更推荐使用pssh!
使用pssh的前提是:必须在本机与其他客户机上配置好密钥认证访问(即ssh无密码登录信任关系)。
下面就说下使用pssh进行批量操作的记录:
1)安装pssh
yum install -y pssh
2)pssh用法
-h 执行命令的远程主机列表文件
-H user@ip:port 文件内容格式[user@]host[:port]
-l 远程机器的用户名
-p 一次最大允许多少连接
-o 输出内容重定向到一个文件
-e 执行错误重定向到一个文件
-t 设置命令执行的超时时间
-A 提示输入密码并且把密码传递给ssh(注意这个参数添加后只是提示作用,随便输入或者不输入直接回车都可以)
-O 设置ssh参数的具体配置,参照ssh_config配置文件
-x 传递多个SSH 命令,多个命令用空格分开,用引号括起来
-X 同-x 但是一次只能传递一个命令
-i 显示标准输出和标准错误在每台host执行完毕后
-I 读取每个输入命令,并传递给ssh进程 允许命令脚本传送到标准输入
新版命令已变更为:
Usage: parallel-ssh [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
新旧命令对应:
parallel-nuke --> pnuke
parallel-rsync --> prsync
parallel-scp --> pscp
parallel-slurp --> pslurp
parallel-ssh --> pssh
3)pssh实例说明
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批量执行时,轮到这台没有做信任关系的机器时就不会执行。
a)批量执行命令
pssh -h hosts.txt -l root -i 'uptime'
如果添加-A参数,那么即使提前做了ssh信任关系,还是会提示输入密码!
pssh -h hosts.txt -l root -i -A 'uptime'
pssh -h hosts.txt -l root -i -t 10 -o /root/pssh.log 'uptime && date'
b)批量上传文件或目录(pscp)
批量上传本地文件/mnt/test.file到远程服务器上的/tmp目录:
pscp -l root -h hosts.txt /mnt/test.file /tmp/
批量上传本地文件/mnt/test.file、/mnt/aa.file、/mnt/bb.file到远程服务器上的/tmp目录:
pscp -l root -h hosts.txt /mnt/test.file /mnt/aa.file /mnt/bb.file /tmp/
或者:
pscp -l root -h hosts.txt /mnt/{test.file,aa.file,bb.file} /tmp/
批量上传本地目录/mnt/zhong到远程服务器上的/tmp目录(上传目录需要添加-r参数):
pscp -l root -h hosts.txt -r /mnt/zhong /tmp/
批量上传本地目录/mnt/zhong、/mnt/aa、/mnt/vv到远程服务器上的/tmp目录
pscp -l root -h hosts.txt -r /mnt/zhong /mnt/aa /mnt/vv /tmp/
或者:
pscp -l root -h hosts.txt -r /mnt/{zhong,aa,vv} /tmp/
c)批量下载文件或目录(pslurp)
批量下载服务器上的某文件到本地,不用担心重名问题,因为pslurp已经建立了以文件列表内的ip为名称的目录来存放下载的文件:
pslurp -l root -h hosts.txt /etc/hosts .
另外特别注意:
上面的批量下载操作,只能下载到本地的当前目录下,不能在命令中跟指定的路径:
pslurp -l root -h hosts.txt /etc/hosts /mnt/
要想下载到本机的/mnt目录下,正确的做法是先切换到/mnt目录下,然后再执行下载命令:(列表文件要跟全路径)
pslurp -l root -h /root/hosts.txt /etc/hosts ./
上面是批量下载文件,要是批量下载目录,只需要添加一个-r参数即可!
pslurp -l root -h /root/hosts.txt -r /home/ ./
d)批量同步(prsync)
同步本机/mnt/test目录下的文件或目录到远程机器的/mnt/test路径下
prsync -l root -h hosts.txt -r /mnt/test/ /mnt/test/
同步本机/mnt/test目录下的文件或目录到远程机器的/mnt路径下
prsync -l root -h hosts.txt -r /mnt/test/ /mnt/
【注意:上面批量同步目录操作是将本机对应目录数据同步到远程机器上,远程机器上对于目录下多余的文件也会保留(不会删除多余文件)】
同理,批量同步文件操作,去掉-r参数。
【注意:同步文件的时候,其实就是完全覆盖,远程机器对应文件内的文件会被全部替换!】
如下:同步本机的/mnt/test/file文件内容到远程服务器/mnt/test/file文件内
prsync -l root -h hosts.txt /mnt/test/file /mnt/test/file
prsync -l root -h hosts.txt /mnt/test/file /mnt/aaa
e)批量kill远程机器上的进程(pnuke)
比如批量kill掉远程机器上的nginx进程
pnuke -h hosts.txt -l root nginx