基本使用流程
pexpect 的使用說來說去,就是圍繞3個關鍵命令做操作:
- 首先用 spawn 來執行一個程序
- 然后用 expect 來等待指定的關鍵字,這個關鍵字是被執行的程序打印到標准輸出上面的
- 最后當發現這個關鍵字以后,根據關鍵字用 send 方法來發送字符串給這個程序
login() #建立ssh連接 logout() #斷開ssh連接 prompt() #等待系統提示符,用於等待命令執行結束
下面是其定義:
Pexpect 是一個用來啟動子程序並對其進行自動控制的 Python 模塊,它可以用來和像 ssh、ftp、passwd、telnet 等命令行程序進行自動交互。
從書中我摘取了相關實例並配有注釋,用來記錄pexpect常用方法:
下面這個實例功能是:以ssh遠程登錄,登錄成功后執行命令‘ls -lh’

import pexpect
import sys
#通過spawn類啟動和控制子應用程序
child = pexpect.spawn('ssh root@192.168.1.22')
#將pexpect的輸入輸出信息寫到mylog.txt文件中
fout = file('mylog.txt','w')
child.logfile = fout
#將pexpect的輸入輸出信息輸出到標准輸出
#child.logfile = sys.stdout
#expect方法用來判斷子程序產生的輸出,判斷是否匹配相應字符串
child.expect('password:')
#字符串匹配則使用sendline進行回應-----send:發送命令,不回車、sendline:發送命令,回車、sendcontrol:發送控制符,如:sendctrol('c')等價於‘ctrl+c'、sendeof:發送eof
child.sendline('123456')
child.expect('#')
child.sendline('ls -lh')
child.expect('#')
pexpect之spawn類
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類來進行遠程連接並進行操作的實例:
from pexpect import pxssh
import getpass
try:
s = pxssh.pxssh() #創建pxssh對象
hostname = raw_input('hostname:')
username = raw_input('username:')
password = getpass.getpass('password:') #接收密碼輸入
s.login(server=hostname,username=username,password=password) #建立ssh連接
s.sendline('uptime') #運行uptime命令
s.prompt() #匹配系統提示符
print s.before #打印出現系統提示符前的命令輸出
s.sendline('ls -lh') #運行命令
s.prompt() #匹配系統提示符
print s.before #打印出現系統提示符前的命令輸出
s.sendline('df -h') #運行命令
s.prompt() #匹配系統提示符
print s.before #打印出現系統提示符前的命令輸出
s.logout() #斷開ssh連接
except pxssh.ExceptionPxssh as e:
print 'pxssh failed on login'
print str(e)
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)
轉載自
https://www.cnblogs.com/MacoLee/p/5629837.html
https://www.cnblogs.com/lisenlin/p/9058557.html
https://blog.csdn.net/zhongbeida_xue/article/details/78679601