python sendline_python Pexpect模塊的使用

Pexpect簡介

在講解Pexpect之前,我們需要先了解一下Expect這個腳本語言,它是由TCL語言實現的,主要用于人機交互式對話的自動化控制,可以用來完成ssh、ftp、telnet等命令行程序的自動化交互。Pexpect其實就是一個用Python語言實現的類Expect功能的模塊,通過它就可以在Python中完成Expect所完成的功能。

Pexpect的基本工作流程,基本可以分為以下三個步驟:

首先用spawn來執行一個程序;

然后用expect方法來等待指定的關鍵字,這個關鍵字是被執行的程序打印到標準輸出上面的;

最后當發現這個關鍵字以后,使用send/sendline方法發送字符串給這個程序。

通常在程序中第一步只需要做一次,第二步和第三步會不停的循環來完成整個工作。當然在Pexpect中還有很多其他方法,編寫程序時可以根據自己的需求選擇使用。

Pexpect API

spawn類

class spawn(SpawnBase):

'''This is the main class interface for Pexpect. Use this class to start

and control child applications. '''

# This is purely informational now - changing it has no effect

use_native_pty_fork = use_native_pty_fork

def __init__(self, command, args=[], timeout=30, maxread=2000,

searchwindowsize=None, logfile=None, cwd=None, env=None,

ignore_sighup=False, echo=True, preexec_fn=None,

encoding=None, codec_errors='strict', dimensions=None,

use_poll=False):

通過spawn()方法用來執行一個程序,返回程序的操作句柄,后續就可以通過操作句柄來與這個程序進行交互了。

# 子程序退出時會引發pexpect.EOF異常,即如果捕捉到pexpect.EOF則說明子程序已退出

process = pexpect.spawn('ls -l')

process.expect(pexpect.EOF)

result = process.before.decode()

print(result)

command參數并不支持字符的特殊含義(比如管道符、通配符、重定向符等),在Linux系統中如果想使用這些符號的特殊含義就必須加上shell來運行。

# 示例一

process = pexpect.spawn('bash -c "ls -l | wc -l"')

process.expect(pexpect.EOF)

# 示例二

# 第一個參數為主程序,而args列表里的元素是主程序的參數

process = pexpect.spawn('bash', ['-c', 'ls -l | wc -l'])

process.expect(pexpect.EOF)

expect()方法

當使用spawn()方法啟動了一個程序并返回程序控制句柄后,就可以使用expect()方法來等待指定的關鍵字了。關鍵字可以是字符串、正則表達式、EOF、TIMEOUT或者以上類型組成的列表,用來匹配子程序返回的結果。如果只提供字符串等非列表,則匹配成功后返回0,如果提供列表,則返回匹配成功的列表元素的索引,匹配失敗會拋出異常。

process = pexpect.spawn('ls -l')

# 匹配expect字符

process.expect('expect')

before/after/match:當expect()匹配到關鍵字之后,系統會自動給這三個變量賦值,通過這三個變量可以獲取子程序運行輸出。

before:保存了到匹配到關鍵字為止,緩存里面已有的所有數據。也就是說如果緩存里緩存了100個字符的時候匹配到了關鍵字,那before就是除了匹配到的關鍵字之外的所有字符。

after:保存了匹配到了關鍵字。

match:保存的是匹配到的正則表達式的實例,和上面的after相比一個是匹配到的字符串,一個是匹配到的正則表達式實例。

process = pexpect.spawn('ls -l')

process.expect('expect')

print(process.before.decode())

print(process.after.decode())

print(process.match)

如果expect()過程中發生錯誤,那么before保存到目前為止緩存里的所有數據,after和match都是None。

如果沒匹配成功則會拋出異常,可以通過匹配異常,讓異常不在終端顯示。

process = pexpect.spawn('ls -l')

# 返回0表示匹配成功,返回1和2表示匹配到了異常

index = process.expect(['expect', pexpect.EOF, pexpect.TIMEOUT])

print(index)

send()/sendline()方法

sendline()和send()的區別就是sendline()發送的是帶回車符的字符串。

process = pexpect.spawn('nslookup')

process.expect('>')

process.sendline('www.baidu.com')

process.expect('>')

print(process.before.decode())

process.sendline('exit')

Pexpect還提供了很多其他方法,這里不再詳細闡述,使用時可參考其官方文檔。

interact()方法

interact()表示將終端控制權交給用戶(或者說將標準輸入交給用戶)。通常情況下Pexpect會接管所有的輸入和輸出,如果需要用戶介入完成部分工作的時候,interact()就派上用場了。

# 讓出控制權給用戶

process.interact()

# 通過設置escape_character的值定義返回碼,當用戶輸入此值后,會將控制權重新交給pexpect

process.interact(escape_character='\x1d', input_filter=None, output_filter=None)

應用示例

接下來通過SSH連接遠程服務器的示例來體驗下Pexpect的使用方法。

#!/usr/bin/env python3.6

#-*- coding:utf-8 -*-

import pexpect

def main(server):

command = 'ssh -p %s %s@%s' % (server['port'], server['username'], server['hostname'])

process = pexpect.spawn(command, timeout=30)

print(f'命令: {command}')

expect_list = [

'yes/no',

'password:',

pexpect.EOF,

pexpect.TIMEOUT,

]

index = process.expect(expect_list)

print(f'匹配到: {index} => {expect_list[index]}')

if index == 0:

process.sendline("yes")

expect_list = [

'password:',

pexpect.EOF,

pexpect.TIMEOUT,

]

index = process.expect(expect_list)

print(f'匹配到: {index} => {expect_list[index]}')

if index == 0:

process.sendline(server['password'])

process.interact()

else:

print('EOF or TIMEOUT')

elif index == 1:

process.sendline(server['password'])

process.interact()

else:

print('EOF or TIMEOUT')

if __name__ == '__main__':

server = {

'hostname': '192.168.1.100',

'port': '22',

'username': 'admin',

'password': 'ABuklhsfnVyxI',

}

main(server)

以上就是python Pexpect模塊的使用的詳細內容,更多關于python Pexpect模塊的資料請關注腳本之家其它相關文章!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385885.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385885.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RocketMQ消息丟失場景及解決辦法,已拿offer入職

前言 當前我們都會說SpringBoot是Spring框架對“約定優先于配置理念的最佳實踐的產物,一個典型的SpringBoot應用本質上其實就是一個基于Spring框架的應用,而如果大家對Spring框架已經了如指掌,那么,在我們一步步揭開SpringBoot微…

java抓rtp包_Wireshark抓取RTP包,還原語音

最近在做基于SIP的VoIP通信研究,使用Wireshark軟件可以對網絡流量進行抓包。VoIP使用RTP協議對語音數據進行傳輸,語音載荷都封裝在RTP包里面。要對傳輸中的語音進行截獲和還原,需要通過Wireshark對RTP包進行分析和解碼。該過程如下&#xff1…

RocketMQ消費者是如何獲取消息的?轉瘋了!

前言 前兩天,我收到了螞蟻金服的offer,從朋友的內推開始面試到拿到最后offer經歷了4面技術、一面交叉面和一面HR面。經過了漫長的等待和幾次幾乎折磨的面試之后,終于拿到了offer。 第1章:Dubbo的簡史、后續的規劃和整體架構大圖 …

java if在內存中_java如何將對象暫存到內存中?

展開全部form表單提交文件,建議用62616964757a686964616fe59b9ee7ad9431333264623862smartupload上傳,暫存在web服務器目錄下,然后稍微一下下面的代碼,ftp上傳后,刪除暫存文件,okimport java.io.File;impor…

K8S+Docker理論與實踐深度集成

前言: 這篇文章主要介紹了26道Spring經典面試題總結(附帶答案)的相關資料,小編在網上看到的覺得挺不錯的,現在分享給大家,希望對你們有所幫助。 另外本人整理收藏了多家公司面試知識點整理 ,以及各種Java核心知識點免費分享給大…

java 注解 方法 參數_java在注解中綁定方法參數的解決方案

我們有這樣子的需求,需要記錄用戶操作某個方法的信息并記錄到日志里面,例如,用戶在保存和更新任務的時候,我們需要記錄下用戶的ip,具體是保存還是更新,調用的是哪個方法,保存和更新的任務名稱以…

Kafka的精髓全寫這本“限量筆記”里了

前言 大廠面試真題向來是求職者的最佳練兵場,華為在Java開發工程師招聘中有哪些技術性考察和傾向?那今天咱就給大家分享一下近期的華為5面面經! 注:以下所分享的華為面試問題,相關的答案我也整理出來了,且…

gcc是java的什么意思_為什么gcc支持Java而不是C#

我已經seen this question了,我想知道是否有任何技術理由可以證明gcc支持Java但不支持C#.如果我理解,Java也是一種解釋性語言.如果Mono提供C#編譯器和CIL的實現,為什么不能創建一個將C#轉換為IL然后靜態編譯的gcc c#編譯器?解決方法:如果編譯器工具鏈不支持特定語言…

MongoDB數據分布不均的解決方案

前言 算法血拼:Google百度Alibaba字節Tencent網易360拼夕夕美團 不知不覺雙11就來了,轟轟烈烈的秋招也完美結束了,不知算法與數據結構成為了多少小伙伴進擊大廠的絆腳石? 恰好,我這兩天花了點時間,整理了些各大廠(G…

Mybatis-plus常用API全套教程

前言 前兩天,我收到了螞蟻金服的offer,從朋友的內推開始面試到拿到最后offer經歷了4面技術、一面交叉面和一面HR面。經過了漫長的等待和幾次幾乎折磨的面試之后,終于拿到了offer。 正文 下文中截圖來源于朋友一個pdf版本的面經,…

我的世界手動選擇java_如何選中路徑-我的世界怎么選擇java路?我的世界怎么選擇java路徑 愛問知識人...

2014-06-03 11:26:47首先確定你安裝了Java,如沒有自行去官網下載最近版本 如果已安裝,打開啟動器,一般的啟動器都有設置選項,在設置里選擇正確的Java路徑或者讓啟動器自行搜索 設置完畢后啟動游戲~全部2014-06-03 11:26:472014-06…

Mycat和Mysql搭建高可用企業數據庫集群

個人背景 如標題所示,我的個人背景非常簡單,Java開發經驗1年半,學歷普通,2本本科畢業,畢業后出來就一直在Crud,在公司每天重復的工作對我的技術提升并沒有什么幫助,但小鎮出來的我也深知自我努…

java過濾器如何操作數據庫_jsp – 使用Java中的過濾器驗證用戶名,密碼(與數據庫聯系)...

String sql”select * from reg where username”user”‘ and pass”pwd”‘”;這是一個非常糟糕的做法.這種方法要求用戶名和密碼都通過請求傳遞普通香草.而且,你有一個SQL注入攻擊漏洞.利用會話,在JSP / Servlet中你有HttpSession.實際上也沒有必要在使用過濾器的每個請求上…

MySQL+Tomcat+JVM,看完還怕面試官

前言 我朋友也是個寫了四年Java代碼的程序員,跟女友已經戀愛多年,最近突然結婚了。 他結婚以前,換了一家公司,咱倆就好久沒見過面了。剛好今天出門辦事碰上了,找了一家店坐一起喝酒聊天。 我聊天時打趣他&#xff1…

java因子分析_因子分析(Factor Analysis)

1 問題之前我們考慮的訓練數據中樣例的個數m都遠遠大于其特征個數n&#xff0c;這樣不管是進行回歸、聚類等都沒有太大的問題。然而當訓練樣例個數m太小&#xff0c;甚至m<多元高斯分布的參數估計公式如下&#xff1a;分別是求mean和協方差的公式&#xff0c;表示樣例&#…

MySQL+多線程+Redis+算法+網絡

開頭 我們面試的時候 &#xff0c;經常會被問這種到問題:Spring中bean的循環依賴怎么解決&#xff1f; Spring中bean的加載過程&#xff1f; spring相關的問題一直是大廠面試常問到的一個問題,也是一直困擾這我們&#xff0c;不知道從哪里下手&#xff0c;今天舉例分析大廠的一…

python 函數進度條怎么_python輸出結果刷新及進度條的實現操作

print函數python輸出主要使用print函數&#xff0c;print函數介紹&#xff1a;print(*objects, sep" ", end"", filesys.stdout, flushFalse)*objects表示要打印的值&#xff0c;表示多個無名參數或需要打印的值&#xff1b;sep" "&#xff0c;對…

MySQL優化原理分析及優化方案總結

前言 今天中午收到我司安全部發了一封郵件&#xff1a;Jackson存在安全漏洞。查了一下&#xff0c;這件事并不算很新鮮了&#xff08;已經過了5天的樣子&#xff09;&#xff0c;本文來聊聊吧。 說起來還蠻戲劇化&#xff1a;阿里云向Jackson官方提交了一個Jackson序列化安全…

MySQL千萬數據量深分頁優化

前言 提到MySQL的事務&#xff0c;我相信對MySQL有了解的同學都能聊上幾句&#xff0c;無論是面試求職&#xff0c;還是日常開發&#xff0c;MySQL的事務都跟我們息息相關。 而事務的ACID&#xff08;即原子性Atomicity、一致性Consistency、隔離性Isolation、持久性Durabili…

Mysql和Redis數據同步該怎么做

前言 算法血拼&#xff1a;Google百度Alibaba字節Tencent網易360拼夕夕美團 不知不覺雙11就來了,轟轟烈烈的秋招也完美結束了,不知算法與數據結構成為了多少小伙伴進擊大廠的絆腳石&#xff1f; 恰好&#xff0c;我這兩天花了點時間&#xff0c;整理了些各大廠&#xff08;G…