Python Pexpect庫(kù)的簡(jiǎn)單使用方法
簡(jiǎn)介
最近需要遠(yuǎn)程操作一個(gè)服務(wù)器并執(zhí)行該服務(wù)器上的一個(gè)python腳本,查到可以使用Pexpect這個(gè)庫(kù)。記錄一下。
什么是Pexpect?Pexpect能夠產(chǎn)生子應(yīng)用程序,并控制他們,并能夠通過(guò)期望模式對(duì)子應(yīng)用的輸出做出反應(yīng)。Pexpect允許你的腳本產(chǎn)生子應(yīng)用、控制他們像一個(gè)人類在輸入命令一樣。
Pexpect使用在自動(dòng)交互的應(yīng)用,例如SSH、SFTP、PASSWD、TELNET。它可以被應(yīng)用在使用自動(dòng)設(shè)置腳本為不同的服務(wù)器自動(dòng)地重復(fù)的安裝軟件包。也可以被應(yīng)用在自動(dòng)的軟件測(cè)試。
Pexpect的主要特點(diǎn)是需要Python的基本庫(kù)pty,這個(gè)庫(kù)只有在類Unix系統(tǒng)上才有
Pexpect關(guān)于SSH的使用
注:測(cè)試,我們直接用虛擬機(jī)本機(jī)ssh本機(jī)
環(huán)境
1. win10 物理機(jī)
2. Vmware Centos 虛擬機(jī)
3. Xshell
4. 虛擬機(jī)python安裝pexpect:pip install pexpect
在虛擬機(jī)創(chuàng)建一個(gè) python文件
#-*- coding:UTF-8 -*-
import pexpect
# 定義ssh連接
def ssh(user,host,password,command):
#創(chuàng)建子應(yīng)用,命令是 ssh -l root 127.0.0.1 python /home/python/test.py
child = pexpect.spawn('ssh -l %s %s %s'%(user,host,command))
# 期待開(kāi)啟的子程序的顯示,子程序的不同顯示會(huì)匹配到不同key然后我們定義不同的操作
# 0 : 連接超時(shí)
# 1 :ssh有時(shí)候提示你是否確認(rèn)連接
# 2 :提示輸入密碼
# 3 :匹配到#號(hào),表示命令已經(jīng)執(zhí)行完畢。沒(méi)用到
i = child.expect([pexpect.TIMEOUT, 'Are you sure you want to continue connecting','password:',r"([^-]>|#)"])
# 如果登錄超時(shí),renturn none
if i == 0: # Timeout
print "Timeout"
return None
# 提示是否確認(rèn)連接
if i == 1:
child.sendline ('yes') # 我們輸入yes
child.expect ('password: ')# 輸入yes后 子程序應(yīng)該提示輸入密碼,我們?cè)俅纹诖齪assword
i = child.expect([pexpect.TIMEOUT, 'password: '])
#超時(shí)
if i == 0: # Timeout
return None
# 不考慮其他情況,走到此處時(shí),要么timeout 已經(jīng)return ,要么等待輸入密碼
#輸入密碼
child.sendline(password)
# 返回子程序
return child
if __name__ =='__main__':
try:
# 配置數(shù)據(jù)
host='127.0.0.1'
user="root"
password = '********'
command = 'python /home/python/test.py'
#command="ls -l"
child = ssh(user,host,password,command)
#這句是將子程序的命令行拉到末端
test = child.expect(pexpect.EOF)
#child中before就是我們要的數(shù)據(jù),有時(shí)候還會(huì)在 after中
print child.before
print child.after
except Exception,e:
print str(e)
# 最終的顯示結(jié)果是 test.py中打印的hahaha結(jié)果,
[root@localhost python]# python test_pexpect.py
hahaha
<class 'pexpect.exceptions.EOF'>
我們嘗試一下開(kāi)兩個(gè)虛擬機(jī)的情況
上面的代碼只需要更改ip user password即可
# ip 192.168.233.133 # user root # 在另一臺(tái)虛擬機(jī)的相同位置創(chuàng)建/home/pyhton/test.py 內(nèi)容如下 if __name__=="__main__": print "another virual machine hahaha" # 打印結(jié)果 [root@localhost python]# python test3.py another virual machine hahaha <class 'pexpect.exceptions.EOF'>
Pexpect 關(guān)于 SFTP的使用
與ssh相同,就是使用python在當(dāng)前機(jī)器上輸入sftp ip 然后期望結(jié)果,輸入密碼,并發(fā)送get下載文件即可。
注:使用的時(shí)候發(fā)現(xiàn)一點(diǎn)注意:在每次執(zhí)行sendline之前 都需要重新期望一下當(dāng)前的sftp>,或者在每次輸入sendline之后重新期望一下sftp>。也就是期望到這行,否則輸入的命令都沒(méi)有反應(yīng),我理解是遠(yuǎn)程連接的服務(wù)器有輸出時(shí)候當(dāng)前的位置可能不在sftp>這里所以在sendline的任何東西都是無(wú)意義的。如果這個(gè)解釋不對(duì)望高人指點(diǎn)一下,
# --*-- coding:utf-8 --*--
import pexpect
import os
import time
def sftp(ip , password , command):
# 創(chuàng)建子應(yīng)用
child = pexpect.spawn("sftp %s"%(ip))
i = child.expect([pexpect.TIMEOUT,'password:'])
# 超時(shí)
if i == 0 :
print "Timeout"
return None
# 準(zhǔn)備輸入密碼
if i == 1 :
# 輸入密碼
child.sendline(password)
j = child.expect([pexpect.TIMEOUT,'sftp>'])
# 超時(shí)
if j == 0:
print "Timeout"
return None
# 匹配到進(jìn)入sftp命令模式
if j==1:
print 'Before sftp get command'
print child.before
print "-----------------"
#發(fā)送命令
child.sendline(command)
child.expect(['sftp>'])
print "After sftp get command"
print child.before
print "-----------------"
child.sendline("bye")
#child.expect(['sftp>'])
print "After sftp bye"
print child.before
print "-----------------"
print child.after
return child
if __name__=='__main__':
ip = "192.168.233.133"
command = "get /home/python/test.txt"
password = "********"
child = sftp(ip , password , command)
print child.before
print child.after
if os.path.exists("./test.txt"):
print "Make sure transfer successfully"
else :
print "Can not find the transfer file"
# ----------------------------結(jié)果-----------------------------------------------
'''
Before sftp get command
Connected to 192.168.233.133.
-----------------
After sftp get command
get /home/python/test.txt
Fetching /home/python/test.txt to test.txt
/home/python/test.txt 100% 73 25.2KB/s 00:00
-----------------
After sftp bye
get /home/python/test.txt
Fetching /home/python/test.txt to test.txt
/home/python/test.txt 100% 73 25.2KB/s 00:00
-----------------
sftp>
get /home/python/test.txt
Fetching /home/python/test.txt to test.txt
/home/python/test.txt 100% 73 25.2KB/s 00:00
sftp>
Make sure transfer successfully
'''
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)詩(shī)歌游戲(類繼承)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)詩(shī)歌游戲,根據(jù)上句猜下句、猜作者、猜朝代、猜詩(shī)名,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
Python獲取當(dāng)前頁(yè)面內(nèi)所有鏈接的四種方法對(duì)比分析
這篇文章主要介紹了Python獲取當(dāng)前頁(yè)面內(nèi)所有鏈接的方法,結(jié)合實(shí)例形式對(duì)比分析了Python常用的四種獲取頁(yè)面鏈接的方法,并附帶了iframe框架內(nèi)鏈接的獲取方法,需要的朋友可以參考下2017-08-08
python編輯用戶登入界面的實(shí)現(xiàn)代碼
這篇文章主要介紹了python編輯用戶登入界面的實(shí)現(xiàn)代碼,非常不錯(cuò),代碼簡(jiǎn)單易懂,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Python中remove漏刪和索引越界問(wèn)題的解決
這篇文章主要介紹了Python中remove漏刪和索引越界問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
通過(guò)Python編程將CSV文件導(dǎo)出為PDF文件的方法
CSV文件通常用于存儲(chǔ)大量的數(shù)據(jù),而PDF文件則是一種通用的文檔格式,便于與他人共享和打印,將CSV文件轉(zhuǎn)換成PDF文件可以幫助我們更好地管理和展示數(shù)據(jù),本文將介紹如何通過(guò)Python編程將CSV文件導(dǎo)出為PDF文件,需要的朋友可以參考下2024-06-06
機(jī)器學(xué)習(xí)之KNN算法原理及Python實(shí)現(xiàn)方法詳解
這篇文章主要介紹了機(jī)器學(xué)習(xí)之KNN算法原理及Python實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了機(jī)器學(xué)習(xí)KNN算法原理以及Python相關(guān)實(shí)現(xiàn)步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-07-07

