最近在看《Python自動化運維技術與最佳實戰》這本書,學到了一個運維中用到的模塊:pexpect
下面是其定義:
Pexpect 是一個用來啟動子程序並對其進行自動控制的 Python 模塊,它可以用來和像 ssh、ftp、passwd、telnet 等命令行程序進行自動交互。
從書中我摘取了相關實例並配有注釋,用來記錄pexpect常用方法:
下面這個實例功能是:以ssh遠程登錄,登錄成功后執行命令‘ls -lh’

1 import pexpect 2 import sys 3 4 #通過spawn類啟動和控制子應用程序 5 child = pexpect.spawn('ssh root@192.168.1.22') 6 7 #將pexpect的輸入輸出信息寫到mylog.txt文件中 8 fout = file('mylog.txt','w') 9 child.logfile = fout 10 11 #將pexpect的輸入輸出信息輸出到標准輸出 12 #child.logfile = sys.stdout 13 14 #expect方法用來判斷子程序產生的輸出,判斷是否匹配相應字符串 15 child.expect('password:') 16 #字符串匹配則使用sendline進行回應-----send:發送命令,不回車、sendline:發送命令,回車、sendcontrol:發送控制符,如:sendctrol('c')等價於‘ctrl+c'、sendeof:發送eof 17 child.sendline('123456') 18 child.expect('#') 19 child.sendline('ls -lh') 20 child.expect('#')
當然,ssh登錄還可以使用pexpect的run函數實現:
#events是一個字典,定義了expect和sendline的對應關系 pexpect.run('ssh root@192.168.1.22',events={'password:','123456'})
針對ssh遠程登錄,pexpect又派生出了pxssh類,在ssh會話操作上再做一層封裝
其常用方法是:
login() #建立ssh連接 logout() #斷開ssh連接 prompt() #等待系統提示符,用於等待命令執行結束
下面是使用pxssh類來進行遠程連接並進行操作的實例:

1 from pexpect import pxssh 2 import getpass 3 4 try: 5 s = pxssh.pxssh() #創建pxssh對象 6 7 hostname = raw_input('hostname:') 8 username = raw_input('username:') 9 password = getpass.getpass('password:') #接收密碼輸入 10 11 s.login(server=hostname,username=username,password=password) #建立ssh連接 12 13 s.sendline('uptime') #運行uptime命令 14 s.prompt() #匹配系統提示符 15 print s.before #打印出現系統提示符前的命令輸出 16 17 s.sendline('ls -lh') #運行命令 18 s.prompt() #匹配系統提示符 19 print s.before #打印出現系統提示符前的命令輸出 20 21 s.sendline('df -h') #運行命令 22 s.prompt() #匹配系統提示符 23 print s.before #打印出現系統提示符前的命令輸出 24 25 s.logout() #斷開ssh連接 26 27 except pxssh.ExceptionPxssh as e: 28 print 'pxssh failed on login' 29 print str(e)