日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python pexpect模塊及shell腳本except原理解析

瀏覽:101日期:2022-07-15 13:11:26

expect腳本

expect是什么

expect是一個免費的編程工具,用來實現自動的交互式任務,而無需人為干預。說白了,expect就是一套用來實現自動交互功能的軟件。

在實際工作中,我們運行命令、腳本或程序時,這些命令、腳本或程序都需要從終端輸入某些繼續運行的指令,而這些輸入都需要人為的手工進行。而利用expect,則可以根據程序的提示,模擬標準輸入提供給程序,從而實現自動化交互執行

由于在linux中的一些命令不太適合于腳本的自動化運行,比如fdisk,telnet,ftp連接下載等,所以必須使用except來解決交換問題。

except基礎

包含以下四個命令

命令 作用 send 用于向進程發送字符串 except 從進程接收字符串 spwan 啟動新進程 interact 允許用戶交互

send命令接收一個字符串參數,并將該參數發送到進程。 expect命令和send命令相反,expect通常用來等待一個進程的反饋,我們根據進程的反饋,再發送對應的交互命令。 spawn命令用來啟動新的進程,spawn后的send和expect命令都是和使用spawn打開的進程進行交互。 interact命令用的其實不是很多,一般情況下使用spawn、send和expect命令就可以很好的完成我們的任務;但在一些特殊場合下還是需要使用interact命令的,interact命令主要用于退出自動化,進入人工交互。比如我們使用spawn、send和expect命令完成了ftp登陸主機,執行下載文件任務,但是我們希望在文件下載結束以后,仍然可以停留在ftp命令行狀態,以便手動的執行后續命令,此時使用interact命令就可以很好的完成這個任務。

代碼舉例

#!/usr/bin/expectset timeout 30set host '101.200.241.109'set username 'root'set password '123456'spawn ssh $username@$hostexpect '*password*' {send '$passwordr'}interact

這是一段非常簡單代碼,演示了基本用法

#!/usr/bin/expect:使用expect來解釋該腳本;

set timeout 30:設置超時時間,單位為秒,默認情況下是10秒;

set host '101.200.241.109':設置變量;

spawn ssh $username@$host:spawn是進入expect環境后才可以執行的expect內部命令,如果沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命令的。它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令;

expect 'password':這里的expect也是expect的一個內部命令,這個命令的意思是判斷上次輸出結果里是否包含“password”的字符串,如果有則立即返回;否則就等待一段時間后返回,這里等待時長就是前面設置的30秒;

send '$passwordr':當匹配到對應的輸出結果時,就發送密碼到打開的ssh進程,執行交互動作;

interact:執行完成后保持交互狀態,把控制權交給控制臺,這個時候就可以手工操作了。如果沒有這一句登錄完成后會退出,而不是留在遠程終端上。

這就是對上述這段簡單簡單腳本的分析,在上述的示例中,涉及到expect中一個非常重要的概念——模式-動作;即上述expect 'password' {send '$passwordr'}這句代碼表達出來的含義。

模式-動作

結合著expect 'password' {send '$passwordr'}這句代碼來說說“模式-動作”。簡單的說就是匹配到一個模式,就執行對應的動作;匹配到password字符串,就輸入密碼

如下所示:

expect { 'password' { send '$passwordr' exp_continue } eof { send 'eof' }}

其中exp_continue表示循環式匹配,通常匹配之后都會退出語句,但如果有exp_continue則可以不斷循環匹配,輸入多條命令,簡化寫法。

傳參

很多時候,我們需要傳遞參數到腳本中,現在通過下面這段代碼來看看如何在expect中使用參數:

#!/usr/bin/expectif {$argc < 3} { puts 'Usage:cmd <host> <username> <password>' exit 1}set timeout -1set host [lindex $argv 0] set username [lindex $argv 1]set password [lindex $argv 2]spawn ssh $username@$hostexpect '*password*' {send '$passwordr'}interact

在expect中,$argc表示參數個數,而參數值存放在$argv中,比如取第一個參數就是[lindex $argv 0],以此類推。

FTP下載expect腳本

使用yum安裝expect

yum install expect

按照如下編寫expect腳本

#!/usr/bin/expect -f set ip [lindex $argv 0] #腳本的第一個參數,遠程主機的IP地址set file [lindex $argv 1] #腳本的第二個參數,指定下載的文件名set timeout 10#設置超時時間10秒spawn ftp $ip #運行ftp $ip命令expect 'Name*' #如果出現Name字符send 'anonymous r' #則輸入anoymous(匿名用戶)并回車expect 'Password:*' #如果出現Password字符send 'r' #則僅輸入回車expect 'ftp>*' #如果出現ftp>字符send 'get $filer' #則發送get $file命令expect { '*Failed*' { send_user ' Download failedr';send 'quitr'} #如果返回的字符串有Failed,則說明下載失敗,send_user回顯信息 Download failed '*send*' { send_user ' Download okr';send 'quitr'} #如果返回的字符串有send,則說明下載失敗,send_user回顯信息 Download ok }expect eof #結束循環匹配

給腳本加上可執行權限chmod +x expect_ftp_auto.exp

pexpect模塊

pexpect可以理解為linux下的expect的python封裝,通過pexpect可以實現ssh,ftp,passwd,telnet等命令的進行自動交互

安裝pip install pexpect

簡單實現ssh自動登錄的示例如下:

import pexpectchild = pexpect.spwan(’scp foo user#expample.com:.’) #spwan啟動scp程序child.expect(’Password:’) #expect方法等待子程序產生的輸出,判斷是否匹配定義的字符串 #‘Password:’child.sendline(mypassword) #匹配后則發送密碼進行回應

核心組件

spawn類

spawn是pexpect的主要入口,功能是啟動和控制子應用程序,以下是它的構造函數

class pexpect.spwan(command,args=[],timeout=30,maxread=2000,searchwindowsize=None,logfile=None,cwd=None,env=None,ignore_sighup=True)

其中,command參數可以是任意已知的系統命令,比如

child=pexpect.spawn(’user/bin/ftp’)

當子程序需要參數的時候,還可以使用python列表來代替參數,如

child = pexpect.spwan(’user/bin/ssh user@example.com’)

參數timeout為等待結果的超時時間,maxread為從終端控制臺一次讀取的最大字節數,searchwindowsize參數為匹配的緩沖區字符串的位置,默認是從開始位置匹配

需要注意的是,pexpext不會解析shell命令中的元字符,包括重定向> 管道|或者通配符,此時可以將三個特殊元字符的命令作為/bin/bash的參數進行調用

child =expect.spwan(’/bin/bash -c 'ls -l | grep LOG> logs.txt'’)child.expect(pexpect.EOF)

可以通過將命令的參數以PYTHON列表的方式進行替換,從而使得語法更加清晰,下面的代碼等同于上面的代碼

shell_cmd=’ls -l | grep LOG >logs.txt’child=pexpext.spwan(’/bin/bash’,[’-c,shell_cmd])child.expect(pexpect.EOF)

在調試代碼時,希望獲取pexpect的輸入與輸出信息,以便了解匹配的情況,一種時寫到日志中,另一種時輸出到標準輸出

寫到日志中

chidl-pexpect.spwan(’some_command’)fout=file(’mylog.txt,’w’)child.logfile=fout

輸出到標準輸出的方法

child=pexpect.swpan(’some_command’)chuld.logfile=sys.stdout

以下為SSH遠程登錄舉例,登錄成功后顯示/home目錄的文件并且記錄輸入與輸出

import pexpectimport syschild=pexpect.spawn(’ssh root@172.31.208.129’)fout=open(’mylog.txt’,’w’)child.logfile=fout#child.logfile=sys.stdoutchild.expect(’password:’)child.sendline(’abc@123’)child.expect(’#’)child.sendline(’ls /home’)child.expect(’#’)

expect方法

expect定義了子程序輸出的匹配規則

方法定義:expect(pattern,timeout=-1,searchwindowsize=-1)

其中,參數pattern表示字符串,pexpext.EOF(指向緩沖區,無匹配項)、pexpect,TIMEOUT(匹配等待超時),正則表達式或者列表

參數timeout指定了等待匹配結果的超時時間,單位為秒,當超時被觸發的時候,expect將匹配到pexpext.TIMEOUT,參數searchwindowsize為匹配的緩沖字符串的位置,默認時從開始的位置匹配

read相關方法

下面的的方法作用都是向子程序發送響應命令

send(self,s) #發送命令,不回車sendline(self,s=’ ’),#發送命令,回車snedcontrol(self.char) #發送控制字符sendeof() #發送eof

run函數

run時使用pexpext進行封裝的調用外部命令的的函數

from pexpect import *run(’scp foo user@example.com:.’,events={’(?i)password’:mypassword])

pxssh類

針對ssh會話操作上再做一次封裝

class pexpext.pxssh.pxssh(timeout=30,maxread=2000,searchwindwosize=None,logfile=None,cwd=None,env=None)

常用方法

login()建立ssh連接 logout() 斷開連接 promp()等待系統提示符,用于等待命令執行結束

import pxsshimport getpasstry: s = pxssh.pxssh() #創建對象s hostname = raw_input(’hostname: ’) username = raw_input(’username: ’) password = getpass.getpass(’password: ’) #接收密碼輸入 s.login (hostname, username, password) #建立ssh連接 s.sendline (’uptime’) # 運行uptime命令 s.prompt() # 匹配系統提示符 print s.before # 打印系統體術符號出現前的命令輸出 s.sendline (’ls -l’) s.prompt() print s.before s.sendline (’df’) s.prompt() print s.before s.logout()except pxssh.ExceptionPxssh, e: print 'pxssh failed on login.' print str(e)

FTP自動操作

實現自動交互登錄FTP操作

import pexpectimport syschild = pexpect.spawnu(’ftp ftp.openbsd.org’) #運行ftp命令child.expect(’(?i)name .*: ’) #(?!)表示后面的字符串正則表達式忽略大小寫child.sendline(’anonymous’) # 輸入ftp賬號信息child.expect(’(?i)password’) #匹配密碼提示child.sendline(’pexpect@sourceforge.net’) child.expect(’ftp> ’)child.sendline(’bin’) #啟用二進制傳輸child.expect(’ftp> ’)child.sendline(’get robots.txt’) child.expect(’ftp> ’)sys.stdout.write (child.before) #輸出匹配的'ftp'之前的輸入與輸出操作print('Escape character is ’^]’.n')sys.stdout.write (child.after)sys.stdout.flush()child.interact() # Escape character defaults to ^] #讓出控制權,用戶可以繼續當前會話手工控制子程序,默認輸入'^]'字符跳出child.sendline(’bye’)child.close()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精东传媒成人av电影| 日本亚洲不卡| 国产一区二区精品福利地址| 欧美激情91| 99视频精品全部免费在线视频| 91精品啪在线观看国产18| 免费久久精品| 日韩精品午夜视频| 日韩综合在线| 高清av一区| 99国产一区| 久久国产免费看| 久久一区二区三区喷水| 久久一二三区| 国产在视频一区二区三区吞精| 天堂网av成人| 久久国产免费看| 成人免费电影网址| 午夜精品福利影院| 日韩影院二区| 日韩高清一区在线| 久久久久国产| 国产欧美一区二区三区精品观看| 亚洲黄色免费看| 久久亚洲欧洲| 成人看片网站| 精品一区二区三区中文字幕 | 国产成人精品一区二区三区视频 | 亚洲男人在线| 欧美日韩激情| 国产欧美高清| 亚洲少妇在线| 日韩在线短视频| 麻豆久久一区二区| 日韩av一区二区在线影视| 合欧美一区二区三区| 国产一区调教| 欧美国产三级| 国产精品久久久亚洲一区| 免费看欧美美女黄的网站| 欧美日韩精品一区二区视频| 精品视频91| 久久免费精品| 国产一级成人av| 日本中文字幕不卡| 中文视频一区| 手机精品视频在线观看| 亚州av乱码久久精品蜜桃| 偷拍精品精品一区二区三区| 国产精品成人a在线观看| 狠狠久久伊人中文字幕| 久久精品九色| 国产一区三区在线播放| 91视频久久| 成人精品天堂一区二区三区| 999久久久91| 欧美日韩亚洲在线观看| 蜜臀久久99精品久久一区二区| 色欧美自拍视频| 91精品xxx在线观看| 亚洲高清二区| 欧美专区18| 欧美日韩 国产精品| 国产精品xxxav免费视频| 久久精品理论片| 青青久久av| 亚洲美女久久| 清纯唯美亚洲综合一区| 国产精品三级| 日韩精品午夜| 亚洲一区二区av| 国产精品黄网站| 91精品蜜臀一区二区三区在线| 久久激情网站| 日韩中文字幕无砖| 国产一区二区三区亚洲综合| 久久久久99| 日本vs亚洲vs韩国一区三区二区| 精品无人区麻豆乱码久久久 | 精品国产18久久久久久二百| 欧美中文一区二区| 日韩中文字幕| 99久久99久久精品国产片果冰| 在线看片日韩| 日韩欧美一区二区三区免费观看| 中文字幕乱码亚洲无线精品一区| 精品国产一区二| 欧美日韩在线网站| 国产精品igao视频网网址不卡日韩 | 成人亚洲一区二区| 在线国产一区| 国产一区调教| 97久久亚洲| 黄色日韩在线| 久久久久久夜| 亚洲人妖在线| 久久久久久久久久久妇女| 国产精品日韩精品中文字幕| 合欧美一区二区三区| 久久国产免费看| 婷婷激情一区| 麻豆91精品| 都市激情国产精品| 国产美女视频一区二区| 亚洲欧美久久| 欧美日韩水蜜桃| 欧美日韩免费观看视频| 国产精品99久久免费观看| 免费久久精品视频| 欧美特黄一区| 日韩国产综合| 国内不卡的一区二区三区中文字幕| 亚州欧美在线| 日本在线不卡视频一二三区| 尹人成人综合网| 99国产精品免费视频观看| 精品欧美日韩精品| 精品精品99| 日韩欧美一区二区三区免费看| 久久精品九色| 日韩免费av| 亚洲高清激情| 伊人成人在线视频| 午夜亚洲精品| 亚洲综合福利| 日韩av中文字幕一区| 91欧美日韩在线| 国产另类在线| 日韩av有码| 色88888久久久久久影院| 婷婷丁香综合| 日韩一区免费| 久久精品一区二区三区中文字幕| 高清日韩欧美| 伊人久久亚洲美女图片| 天堂俺去俺来也www久久婷婷| 国产精品一区高清| 激情综合婷婷| 99精品99| 国产欧美日韩一级| 精品一区二区三区中文字幕视频 | 免费看欧美美女黄的网站| 日韩av不卡在线观看| 久久精品二区亚洲w码| 国产一区清纯| 国产精品一区二区三区www| 亚洲成人av观看| 91国内精品| 91九色精品| 国产精品.xx视频.xxtv| 亚洲激情婷婷| 久草精品视频| 亚洲一区二区三区无吗| 精品黄色一级片| 综合国产精品| 亚洲a一区二区三区| 国产精品第一| 中文字幕av一区二区三区四区| 国产在线一区不卡| 日韩和欧美的一区| 久久香蕉国产| 岛国av在线播放| 久久av网址| 日韩高清三区| 亚洲一区二区三区四区电影| 秋霞影院一区二区三区| 久久精品国产精品亚洲毛片| 日本少妇精品亚洲第一区| 日韩视频在线一区二区三区 | 亚洲少妇一区| 欧美成a人免费观看久久| 麻豆一区在线| 国产精品久久久亚洲一区| 神马午夜在线视频| 天堂av一区| 亚洲美洲欧洲综合国产一区 | 亚洲精品国产偷自在线观看| 久久精品xxxxx| 欧美日韩亚洲在线观看| 国产精品黄色| 国产乱人伦丫前精品视频| 中文字幕日韩亚洲| 亚洲一区欧美| 亚洲精品麻豆| 日韩精品一区二区三区中文| 亚洲午夜免费| 亚洲+小说+欧美+激情+另类| 亚洲日本欧美| 国产乱人伦精品一区| 美腿丝袜亚洲三区| 国产成人精品999在线观看| 久久一区精品| 国产欧美一区二区三区精品酒店| 国产精品igao视频网网址不卡日韩| 777久久精品| 免费视频一区二区三区在线观看| 麻豆久久久久久久| 日韩毛片在线| 亚洲欧美日本视频在线观看| 免费日韩av片|