Python pexpect 自动交互库详解:核心命令与 SSH 实战

陈默
陈默
发布时间:2026-10-13 | 4人浏览过
原创

本文详细介绍 Python 中 pexpect 模块的实现原理与核心用法。通过 spawn、expect 和 send 三大关键命令,实现与 SSH、FTP 等子程序的自动交互。文章涵盖基础流程、特殊字符处理、控制信号发送,并重点解析 pxssh 类在 SSH 登录中的应用及完整代码示例。

pexpect 概述与应用场景

Pexpect 是一个基于 Expect 语言开发的 Python 模块,旨在启动子程序并通过正则表达式匹配输出内容,从而实现与程序的自动交互。其应用场景广泛,包括与 ssh、ftp、telnet 等网络协议的自动交互,跨机器自动安装软件包,以及命令行环境下的软件测试自动化。

整体流程主要包含以下几个步骤:

启动目标程序

程序运行过程中等待人工判断或输入

Expect 模块通过关键字匹配识别程序输出

根据匹配到的关键字,向程序发送对应的响应字符

核心命令:spawn、expect 与 send

基本使用逻辑如下:

pexpect 的核心操作围绕三个关键命令展开:

首先,使用 spawn 命令来执行指定的程序。

其次,使用 expect 命令等待程序打印到标准输出的特定关键字。

最后,当检测到指定关键字后,利用 send 方法向程序发送相应的字符串。

第一步仅需执行一次,随后程序会在循环中不断重复第二、三步,逐步完成整个交互过程。理解这一概念后,pexpect 的使用便变得简单直观。此外,pexpect 还提供了许多外围辅助方法以增强功能。

spawn() 执行与参数设置

spawn() - 执行程序

spawn() 方法用于启动一个程序,并返回该程序的操作句柄。后续所有对该程序的操作均通过此句柄进行,例如:


process = pexpect.spawn('ftp sw-tftp')

上述 spawn() 中的字符串即为要执行的程序,此处示例为建立到 sw-tftp 服务器的 ftp 连接。spawn() 的第一个参数是执行的命令,还可以指定其他参数,如 timeout=60 设置超时时间,具体细节将在后文介绍。

process 变量即为 spawn() 返回的程序操作句柄,它是后续所有操作的基础,因此至关重要。

注意:spawn() 或 pexpect 不会自动转译特殊字符。例如,| 和 * 在 Linux Shell 中具有特殊含义,但在 pexpect 中不会被解析。若需在 Linux 系统中使用这些符号的正确语义,必须通过 shell 参数运行,这是常见的易错点。

正确的使用方式如下:


process = pexpect.spawn('/bin/bash –c "ls –l | grep LOG > log_list.txt"')

expect() 关键字匹配机制

expect() - 关键字匹配

当 spawn() 启动程序并返回控制句柄后,即可使用 expect() 方法等待指定的关键字。该方法匹配成功时返回 0;若匹配关键字为列表,则返回列表中匹配项的索引(从 0 开始计数)。

send() 与 sendline() 字符串发送

send() - 发送字符串

send() 是三大关键操作之一,用于向子程序发送指定字符串,用法如下:


process.expect("ftp>")
process.send("by\n")

该方法返回成功发送的字符数量。

sendline() - 发送带换行符的字符串

sendline() 与 send() 的唯一区别在于,前者会在发送字符串后自动添加回车换行符,因此适用场景有所不同:

若只需发送字符而不需回车,使用 send()。

若发送字符后需要回车确认,使用 sendline()。

该方法同样返回发送的字符数量。

sendcontrol() 控制信号处理

sendcontrol() - 发送控制信号

sendcontrol() 用于向子程序发送控制字符,如 <kbd>ctrl+C</kbd> 或 <kbd>ctrl+D</kbd>。例如,若要发送 <kbd>ctrl+G</kbd>,代码如下:


process.sendcontrol('g')

SSH 自动化与 pxssh 封装

简单实例演示:


command = 'ssh '+username+'@'+host 
child = pexpect.spawn(command) 
ret = child.expect([pexpect.TIMEOUT,'Are you sure you want to continue connecting','[P|p]assword']+PROMPT) 
if ret == 0: 
  print('[-] Error Connecting') 
  return 
if ret == 1: 
  child.sendline('yes') 
  ret = child.expect([pexpect.TIMEOUT,'[p|P]assword']) 
  if ret == 0: 
    print('[-] Error Connecting') 
    return 
  if ret == 1: 
    send_command(password) 
    return 
if ret == 2: 
  send_command(password) 
  return 
return child

注:针对 SSH 远程登录,pexpect 衍生出了 pxssh 类,在 SSH 会话操作上进行了封装。

其常用方法包括:

login() # 建立 SSH 连接

logout() # 断开 SSH 连接

prompt() # 等待系统提示符,用于判断命令是否执行结束

更多详情可参考:https://www.jb51.net/article/156232.htm

以上关于 Python pexpect 实现自动交互的内容分享完毕,希望能为读者提供参考与支持。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表