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

通过Telnet访问设备时,能否格式化输出JSON或数组?

解决交互式Telnet会话中REST API返回结果格式化的问题

一、用rlwrap的过滤功能实现实时格式化

rlwrap支持通过-z选项绑定外部过滤器,针对JSON返回做实时格式化,完全适配交互式场景:

  1. 编写简单的过滤脚本(命名为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
  1. 给脚本添加执行权限:chmod +x json-format.sh
  2. 启动带过滤的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:57:16