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
相关产品推荐
相关产品推荐

