美文网首页Python小哥哥
python 终端模拟模块 pexpect

python 终端模拟模块 pexpect

作者: 我爱学python | 来源:发表于2019-07-15 15:39 被阅读17次

    简单介绍

    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不好用

    相关文章

      网友评论

        本文标题:python 终端模拟模块 pexpect

        本文链接:https://www.haomeiwen.com/subject/vzmnkctx.html