通过Telnet访问设备时,能否格式化输出JSON或数组?
解决交互式Telnet会话中REST API返回结果格式化的问题
一、用rlwrap的过滤功能实现实时格式化
rlwrap支持通过-z选项绑定外部过滤器,针对JSON返回做实时格式化,完全适配交互式场景:
- 编写简单的过滤脚本(命名为
json-format.sh):
#!/bin/bash while read -r line; do # 根据实际返回特征判断是否为JSON(这里以开头是{或[为例) if echo "$line" | grep -qE '^\{|\['; then echo "$line" | python3 -m json.tool # 用Python内置工具格式化,无需额外安装jq else echo "$line" # 非JSON内容直接输出 fi done
- 给脚本添加执行权限:
chmod +x json-format.sh - 启动带过滤的Telnet会话:
rlwrap -z ./json-format.sh telnet <设备IP> <端口>
返回的单行JSON会自动被格式化带缩进,设备提示符、错误信息等内容不受影响。
二、专用Telnet客户端替代方案
- telnet-ssl:部分发行版默认自带,支持通过命令行参数绑定输出过滤器,用法和rlwrap类似,直接指定JSON格式化命令即可实现实时处理。
- minicom:虽主打串口连接,但支持Telnet模式,开启颜色显示(
-c on)后配合过滤脚本,也能实现格式化效果,只是操作比rlwrap稍繁琐。
三、轻量Python脚本替代rlwrap+Telnet
如果不想依赖外部工具,可以写个极简脚本,集成历史记录、Telnet连接和JSON格式化:
import telnetlib import readline import json # 配置设备参数 HOST = "<设备IP>" PORT = <端口> # 初始化命令历史记录 readline.set_history_length(1000) readline.read_history_file(".telnet_api_history") try: tn = telnetlib.Telnet(HOST, PORT) print("已连接设备") while True: cmd = input("> ") if cmd.lower() == "exit": break tn.write((cmd + "\n").encode('ascii')) output = tn.read_until(b"\n").decode('ascii').strip() # 尝试格式化JSON,失败则直接输出原内容 try: parsed_json = json.loads(output) print(json.dumps(parsed_json, indent=2)) except json.JSONDecodeError: print(output) finally: readline.write_history_file(".telnet_api_history") tn.close()
运行脚本即可获得带命令历史、自动格式化JSON的交互式会话。
关于jq在交互式会话的问题
jq默认处理标准输入流,但交互式Telnet会话中,输出混杂了设备提示符、命令输入和返回结果,jq无法精准识别JSON内容,容易把非JSON数据当成输入处理导致报错。上面的方案通过判断内容特征选择性格式化,完美避开了这个问题。
内容的提问来源于stack exchange,提问作者the digitalmouse
相关产品推荐
相关产品推荐

