Python pexpect 自动交互库详解:核心命令与 SSH 实战
本文详细介绍 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 实现自动交互的内容分享完毕,希望能为读者提供参考与支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









