Python模塊之pexpect

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')


以上腳本是同步文件,也可以修改下執行遠程命令。

也可以把主機列表變一下,寫在一個配置文件中,也可以對主機進行分組,實現批量管理遠程主機。

大多數的自動化運維工具在批量管理主機上也是大致相似的原理,所以可以根據自己的需要實現自己的遠程管理工具

上面的腳本也可以實現多線程運行,這個就需要大家自己探索了,我這裏已實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章