电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

expect腳本

expect是什么

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

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

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

except基礎(chǔ)

包含以下四個命令

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

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

代碼舉例

#!/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:設(shè)置超時時間,單位為秒,默認情況下是10秒;

set host '101.200.241.109':設(shè)置變量;

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

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

send '$passwordr':當(dāng)匹配到對應(yīng)的輸出結(jié)果時,就發(fā)送密碼到打開的ssh進程,執(zhí)行交互動作;

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

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

模式-動作

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

如下所示:

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

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

傳參

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

#!/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表示參數(shù)個數(shù),而參數(shù)值存放在$argv中,比如取第一個參數(shù)就是[lindex $argv 0],以此類推。

FTP下載expect腳本

使用yum安裝expect

yum install expect

按照如下編寫expect腳本

#!/usr/bin/expect -f set ip [lindex $argv 0] #腳本的第一個參數(shù),遠程主機的IP地址set file [lindex $argv 1] #腳本的第二個參數(shù),指定下載的文件名set timeout 10#設(shè)置超時時間10秒spawn ftp $ip #運行ftp $ip命令expect 'Name*' #如果出現(xiàn)Name字符send 'anonymous r' #則輸入anoymous(匿名用戶)并回車expect 'Password:*' #如果出現(xiàn)Password字符send 'r' #則僅輸入回車expect 'ftp>*' #如果出現(xiàn)ftp>字符send 'get $filer' #則發(fā)送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 #結(jié)束循環(huán)匹配

給腳本加上可執(zhí)行權(quán)限chmod +x expect_ftp_auto.exp

pexpect模塊

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

安裝pip install pexpect

簡單實現(xiàn)ssh自動登錄的示例如下:

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

核心組件

spawn類

spawn是pexpect的主要入口,功能是啟動和控制子應(yīng)用程序,以下是它的構(gòu)造函數(shù)

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

其中,command參數(shù)可以是任意已知的系統(tǒng)命令,比如

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

當(dāng)子程序需要參數(shù)的時候,還可以使用python列表來代替參數(shù),如

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

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

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

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

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

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

在調(diào)試代碼時,希望獲取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定義了子程序輸出的匹配規(guī)則

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

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

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

read相關(guān)方法

下面的的方法作用都是向子程序發(fā)送響應(yīng)命令

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

run函數(shù)

run時使用pexpext進行封裝的調(diào)用外部命令的的函數(shù)

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()等待系統(tǒng)提示符,用于等待命令執(zhí)行結(jié)束

import pxsshimport getpasstry: s = pxssh.pxssh() #創(chuàng)建對象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() # 匹配系統(tǒng)提示符 print s.before # 打印系統(tǒng)體術(shù)符號出現(xiàn)前的命令輸出 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自動操作

實現(xiàn)自動交互登錄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 ^] #讓出控制權(quán),用戶可以繼續(xù)當(dāng)前會話手工控制子程序,默認輸入'^]'字符跳出child.sendline(’bye’)child.close()

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 汽车润滑油厂家-机油/润滑油代理-高性能机油-领驰慧润滑科技(河北)有限公司 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | 驾驶式洗地机/扫地机_全自动洗地机_工业洗地机_荣事达工厂官网 | 二氧化碳/活性炭投加系统,次氯酸钠发生器,紫外线消毒设备|广州新奥 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 智能风向风速仪,风速告警仪,数字温湿仪,综合气象仪(气象五要素)-上海风云气象仪器有限公司 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 双舌接地线-PC68数字式高阻计-ZC36|苏海百科| 连栋温室大棚建造厂家-智能玻璃温室-薄膜温室_青州市亿诚农业科技 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 刘秘书_你身边专业的工作范文写作小秘书 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 家用净水器代理批发加盟_净水机招商代理_全屋净水器定制品牌_【劳伦斯官网】 | 刚性-柔性防水套管-橡胶伸缩接头-波纹管补偿器-启腾供水材料有限公司 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 汽车水泵_汽车水泵厂家-瑞安市骏迪汽车配件有限公司 | 首页_欧瑞传动官方网站--主营变频器、伺服系统、新能源、软起动器、PLC、HMI | 移动机器人产业联盟官网| 剪刃_纵剪机刀片_分条机刀片-南京雷德机械有限公司 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 开云(中国)Kaiyun·官方网站-登录入口 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 智慧旅游_智慧景区_微景通-智慧旅游景区解决方案提供商 | 反渗透阻垢剂-缓蚀阻垢剂厂家-循环水处理药剂-山东鲁东环保科技有限公司 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | 拉力机-万能试验机-材料拉伸试验机-电子拉力机-拉力试验机厂家-冲击试验机-苏州皖仪实验仪器有限公司 | 课件导航网_ppt课件_课件模板_课件下载_最新课件资源分享发布平台 |