pexpect是一个用来启动子程序并对其进行自动控制的 Python 模块。
pexpect 可以用来和像 ssh、passwd、telnet 、rsync等命令行程序进行自动交互
下面是我用pexpect写的一个脚本,是用来执行远程主机命令,脚本是自动交互输入远程主机的密码的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
# encoding: utf-8
#filename:python_rsync.py
__author__
=
"ZhouLS"
#同要用来同步远程主机上的日志文件到本地。
import
pexpect
import
os,sys
import
time
#远程主机地址
Dir
=
"/usr/local/tomcat48080/webapps/WebApi_Develop/logs"
#本地主机地址
Ldir
=
"./logs/"
#远程主机列表,主机:密码 #也可自己定义其他方式,
hosts
=
[
'192.168.20.20:redhat'
,
'192.168.20.22:redhat'
]
#
#定义一个同步文件的方法
def
rsync(sfile):
#使用for循环取出远程主机和密码,并执行相应的远程命令,自动提交密码
for
i
in
hosts:
hostname
=
i.split(
':'
)[
0
]
passwd
=
i.split(
':'
)[
1
]
sfile
=
os.path.join(
Dir
,sfile)
dfile
=
os.path.join(Ldir,hostname)
#cmd命令可以修改为自己的命令,自己发挥,我用的rsync命令同步文件的。
cmd
=
"""rsync -azv root@%s:%s %s"""
%
(hostname,sfile,dfile)
print
cmd
#下面是自动交互程序
ssh
=
pexpect.spawn(cmd, [],
86400
)
try
:
while
True
:
#使用一个循环来进入交互式
i
=
ssh.expect([
'assword: '
,
'continue connecting (yes/no)?'
])
#接收交互的提示
if
i
=
=
0
:
#如果是assword:直接发送密码,并跳出循环
ssh.sendline(passwd)
break
elif
i
=
=
1
:
#如果提示的是yes/no)?直接发送yes并继续下一个循环
ssh.sendline(
'yes'
)
except
pexpect.EOF:
ssh.close
else
:
ssh.expect(pexpect.EOF)
ssh.close()
print
"Done"
#测试程序
if
__name__
=
=
"__main__"
:
rsync(
'command.log.2015-07-13'
)
|
以上脚本是同步文件,也可以修改下执行远程命令。
也可以把主机列表变一下,写在一个配置文件中,也可以对主机进行分组,实现批量管理远程主机。
大多数的自动化运维工具在批量管理主机上也是大致相似的原理,所以可以根据自己的需要实现自己的远程管理工具
上面的脚本也可以实现多线程运行,这个就需要大家自己探索了,我这里已实现。
本文转自 ZhouLS 51CTO博客,原文链接:http://blog.51cto.com/zhou123/1747186