Python小哥哥

python 终端模拟模块 pexpect

2019-07-15  本文已影响17人  我爱学python

简单介绍

pexpect是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。它可以用来实现与ssh, ftp, telnet等程序的自动交互,参考官方文档:https://pexpect.readthedocs.io/en/stable/

安装均可以使用pip进行

注意:windows和linux安装模块是不同的。如下:

在linux下安装:pip3 install pexpect

在windows下安装: pip3.exe install winpexpect

在windows系统里创建子程序是:

import winpexpect

child = winpexpect.winspawn('command')

另:run(), pxssh()均不可使用

在linux系统里创建子程序是:

import pexpect

child = pexpect.spawn('cmd')

模块内主要的类/函数介绍

spawn / winspawn 类

作用:可以实现更复杂的交互,通过生成子程序进行sendline(发送命令)与expect(返回操作符)进行交互。

class spawn

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

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

username=None, domain=None, password=None)

个别参数解释:

timeout:交互等待的超时值,默认30秒

maxread:设置read buffer大小,

searchwindowsize:从输入缓冲区中进行模式匹配的位置,默认从开始匹配。

logfile:指定日志的记录位置

注意:pexpect不支持管道,重定向或通配符,如果需要使用,需要重新打开一个shell

简单用法:

# 第一步创建子程序,输入执行的操作命令,我这里是以telnet远程终端为例

child = pexpect.spawn('telnet ipaddress')

# 第二步从子命令返回的结果中进行匹配,语法:expect(pattern, timeout=-1),

  pattern参数说明:可以为字符串,正则表达式,EOF,TIMEOUT,或者是以上类型的列表,若只提供字符串,匹配成功后返回0,若提供列表,匹配成功后返回列表的索引序号。未匹配成功,则会引发异常

timeout:为-1 使用默认的超时期限,设置为NONE,将阻塞至返回信息

child.expect('password:')

# 第三步匹配成功后,发送交互信息,这里发送密码

child.sendline(mypassword)

获取命令执行结果主要由3个基本属性。

child.before:输出匹配点之前的命令执行结果

child.after:输出匹配成功后的匹配点内容,如标识符:hostname#>

child.match:保存已匹配的匹配点对象,可以使用string,打印命令的执行结果。

pxssh类

是pexpect的派生类,用于建立ssh连接,比pexpect直接使用ssh时简单一些,内建3个方法:

login() 建立到目标机器的ssh连接;

logout() 释放该连接;

prompt() 等待提示符,通常用于等待命令执行结束。

pexpect.EOF 异常错误

获取pexpect错误信息,可能会有两种 EOF 异常被抛出,但是他们除了显示的信息不同,其实本质上是相同的。为了实用的目的,不需要区分它们,他们只是给了些关于你的 python 程序到底运行在哪个平台上的额外信息,这两个显示信息是:

End Of File (EOF) in read(). Exception style platform.

End Of File (EOF) in read(). Empty string style platform.

有些 UNIX 平台,当你读取一个处于 EOF 状态的文件描述符时,会抛出异常,其他 UNIX 平台,却只会静静地返回一个空字符串来表明该文件已经达到了状态。

pexpect.TIMEOUT异常错误

如果子程序没有在指定的时间内生成任何 output,那么 expect() 和 read() 都会产生 TIMEOUT 异常。超时默认是 30s,可以在 expect() 和 spawn 构造函数初始化时指定为其它时间

child.expect('password:', timeout=120) # 等待 120s

如果你想让 expect() 和 read() 忽略超时限制,即无限期阻塞住直到有 output 产生,设置 timeout 参数为 None。

代码如:

child = pexpect.spawn( "telnet 域名" )

child.expect( "login", timeout=None )

以上两个错误可以使用try语句来处理报错

try:

child=pexpect.spawn('telnet ip',timeout=5)

child.logfile = log

child.logfile_send=sys.stdout 

child.expect("New password:")

child.sendline(mypassword)

child.expect("Retype new password:")

child.sendline(mypassword)

child.expect("passwd: all authentication tokens updated successfully.")

except pexpect.EOF:

pass

except pexpect.TIMEOUT:

pass

实例:自动登陆ftp

实例:自动登陆交换机执行一条命令后退出,最好在linux系统下进行测试,在windows下使用winpexpect不好用

上一篇下一篇

猜你喜欢

热点阅读