pexpect是一個用來啓動子程序並對其進行自動控制的 Python 模塊。
pexpect 可以用來和像 ssh、passwd、telnet 、rsync等命令行程序進行自動交互
下面是我用pexpect寫的一個腳本,是用來執行遠程主機命令,腳本是自動交互輸入遠程主機的密碼的
# 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')
以上腳本是同步文件,也可以修改下執行遠程命令。
也可以把主機列表變一下,寫在一個配置文件中,也可以對主機進行分組,實現批量管理遠程主機。
大多數的自動化運維工具在批量管理主機上也是大致相似的原理,所以可以根據自己的需要實現自己的遠程管理工具
上面的腳本也可以實現多線程運行,這個就需要大家自己探索了,我這裏已實現。