You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash实现交互式Telnet会话读写及Expect脚本相关疑问

解决Telnet会话实时读取问题的方案

嘿,我来帮你搞定这个Telnet会话实时读取问题的事儿!针对你的需求,不管是实时捕获问题,还是写不依赖预知内容的Expect脚本,核心思路都是用正则匹配问题的通用模式,不用提前知道具体的数字和运算式。下面分两部分给你详细说:

一、如何实时读取会话中的问题

Telnet的输出是流式的,你需要持续监听输入流,而不是一次性读取所有内容。关键是找到问题的格式规律——从你的例子看,问题都是「数字(含小数)+运算符+数字(含小数)+(请作答)」的结构,所以用正则表达式就能精准捕获这类内容,步骤大概是:

  • 持续捕获Telnet会话的输出内容;
  • 用正则表达式匹配符合问题格式的片段;
  • 一旦匹配到,就提取问题并处理计算。

不管你用Python、Perl还是Expect,这个逻辑都通用。

二、无需预知内容的Expect脚本写法

Expect本身就是为交互式会话设计的,它支持正则表达式匹配,完全不需要你提前知道具体的问题内容。给你写个示例脚本:

#!/usr/bin/expect

# 启动Telnet会话
spawn telnet your-target-host your-port

# 循环处理问题
while {1} {
    # 用正则匹配问题:支持整数/小数的乘除运算,后面跟着「(请作答)」
    expect -re {(\d+\.?\d*[*/]\d+\.?\d+)(请作答)}
    
    # 提取匹配到的运算式(比如"50*2584"或"38/3.63")
    set problem $expect_out(1,string)
    
    # 计算答案:这里用bc处理浮点数运算,避免expr不支持小数的问题
    set answer [exec echo "scale=4; $problem" | bc]
    
    # 发送答案到Telnet会话
    send "$answer\r"
    
    # 可选:处理其他无关输出(比如答案提交后的反馈),如果有的话
    # expect -re "答案正确|继续答题"
}

脚本说明:

  • expect -re 是Expect的正则匹配命令,只要输出中出现符合模式的内容,就会触发后续逻辑;
  • 正则表达式(\d+\.?\d*[*/]\d+\.?\d+)(请作答)可以匹配整数、小数的乘除运算,如果你需要支持加减,把[*/]改成[+\-*/](注意减号要转义);
  • 用bc计算浮点数是因为Expect自带的expr不支持小数运算,scale=4是保留4位小数,你可以根据需求调整;
  • 循环while {1}会持续监听新的问题,实现实时处理。

三、Python实现的备选方案

如果你更熟悉Python,用telnetlib库也能轻松实现,同样依赖正则匹配:

import telnetlib
import re
import time

HOST = "your-target-host"
PORT = 23

def calculate_problem(problem):
    # 安全计算:避免eval的风险,这里可以根据运算符拆分计算
    if '*' in problem:
        a, b = problem.split('*')
        return float(a) * float(b)
    elif '/' in problem:
        a, b = problem.split('/')
        return float(a) / float(b)
    # 如果需要加减,继续补充逻辑

with telnetlib.Telnet(HOST, PORT) as tn:
    while True:
        # 实时读取会话输出
        output = tn.read_very_eager().decode('utf-8')
        if output:
            # 匹配问题格式
            match = re.search(r'(\d+\.?\d*[*/]\d+\.?\d+)(请作答)', output)
            if match:
                problem = match.group(1)
                answer = calculate_problem(problem)
                # 发送答案,注意换行符要符合Telnet要求
                tn.send(f"{answer:.4f}\r\n")
        # 短暂休眠避免占用过高资源
        time.sleep(0.1)

注意:

  • 这里没有用eval是因为如果Telnet会话的内容不可信,eval会有安全风险;如果是你可控的环境,用eval(problem)会更简洁;
  • read_very_eager()会读取当前所有可用的输出,配合循环和短休眠就能实现实时监听。

总结一下:不管用哪种工具,核心都是通过正则表达式定义问题的通用格式,这样就不需要预知具体的问题内容,就能实时捕获并处理啦!

内容的提问来源于stack exchange,提问作者Beckett O'Brien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:13:46