如何使用telnetlib3仅获取Telnet命令的纯净执行结果?
实现仅获取
show all-outlets-status命令的清晰结果 完全可行,你可以通过跟踪命令执行状态、过滤无关内容来提取目标命令的输出。修改后的代码如下:
#!/usr/bin/env python3 import asyncio import telnetlib3 async def shell(reader, writer): rules = [ ('login as:', '.....'), ('password:', '......'), ('PE-08I-532236$ ', 'show all-outlets-status'), ('PE-08I-532236$ ', 'exit'), (') >', 'logout'), ] ruleiter = iter(rules) expect, send = next(ruleiter) capturing_output = False target_output = [] while True: outp = await reader.read(1024) if not outp: break if expect in outp: # 发送命令时,如果是目标命令,开启捕获状态 if send == 'show all-outlets-status': capturing_output = True writer.write(send) writer.write('\r\n') try: expect, send = next(ruleiter) except StopIteration: break # 处理捕获的输出 if capturing_output: # 过滤掉命令回显和下一个提示符 if 'show all-outlets-status' in outp: # 移除命令本身的回显行 outp = outp.replace('show all-outlets-status\r\n', '') if 'PE-08I-532236$ ' in outp: # 遇到下一个提示符,停止捕获 capturing_output = False # 移除提示符部分 outp = outp.split('PE-08I-532236$ ')[0] # 收集有效输出 if outp.strip(): target_output.append(outp.strip()) # 打印整理后的目标命令结果 print('\n'.join(target_output)) async def main(): reader, writer = await telnetlib3.open_connection('10.0.0.59', 23, shell=shell) await writer.protocol.waiter_closed if __name__ == '__main__': asyncio.run(main())
关键修改说明:
- 新增
capturing_output布尔变量,标记是否处于捕获目标命令输出的状态 - 新增
target_output列表,用于存储过滤后的有效结果 - 当发送
show all-outlets-status命令时,开启捕获状态 - 捕获过程中,过滤掉命令回显和后续的提示符,只保留命令的实际输出内容
- 最后统一打印整理后的清晰结果,不再输出所有服务器返回的内容
内容的提问来源于stack exchange,提问作者Fabio Marzocca
相关产品推荐
相关产品推荐

