基本使用流程
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

