简介:NetTerm 5.4 绿色版是一款面向网络管理员、运维人员及需要连接Unix主机的程序员的远程登录工具,绿色免安装形态便于在本地网或拨号入网环境中快速部署使用。它除常规终端登录外,还集成FTP服务器,并具备按IP地址分辨与网址监控能力,可辅助完成主机访问管理与连接排查;支持从Unix主机进行全透明打印,借助Unix页面文件与透射功能将页面上传至主机再回传计算机,方便在本地编辑主机文件,减少对主机端简陋编辑器的依赖。压缩包约1.87MB,文件总数及类型明细上游未提供,以实际解压内容为准;体积小巧,适合随身携带和快速启用。已有143人学习下载,可供需要轻量级终端与文件传输能力的读者参考实践,重点体验远程登录、FTP传输、打印透射与本地编辑主机文件等典型场景。
1. NetTerm5.4 绿色版:老机房还在用它连串口和 Telnet 的三个理由
前阵子帮某公司的设备维护同事收拾一台工控机,桌面上还躺着一个 NetTerm5.4 绿色版的文件夹,双击 exe 就起来,不装服务、不往系统目录写东西,插上串口线就能敲命令。这类场景很典型:产线上的老 PLC、交换机、路由器、串口控制台,界面上只有一块黑底绿字的窗口,但要求极精确——字符编码差一位,中文就成乱码;流控没配对,长命令就丢字符。NetTerm5.4 绿色版解决的就是这件事:一个免安装的终端仿真器,把 Telnet、SSH、串口、RLogin 几种会话塞进同一个窗口,会话配置跟着文件夹走,整个目录拷到 U 盘就能带走。适合做设备调试、机房运维、老系统维护的人,也适合偶尔要连一次串口控制台的开发者;不适合需要批量密钥轮换、审计合规的团队,那是另一类工具的地盘。
2. 终端仿真与协议选型:VT100、ANSI、Xterm 到底差在哪儿
2.1 控制序列才是终端仿真的核心,不是那个黑框
很多人把终端工具当成"能打字的窗口",真正决定体验的是它怎么解释控制序列。远端程序并不直接告诉终端"把光标挪到第 5 行第 10 列",它发的是一串以 ESC(0x1B)开头的字节流,比如ESC[5;10H是定位、ESC[2J是清屏、ESC[1;31m是切红色前景、ESC[?25l是隐藏光标。终端仿真器的工作就是把这些字节翻译成窗口里的绘制动作。VT100 是这套体系的基准,定义了光标定位、屏幕擦除、字符属性、滚动区域这些最基础的能力;ANSI 通常指 VT100 加 16 色 SGR 扩展;VT220 在 VT100 之上补齐了功能键序列和更完整的字符集切换;Xterm 又是另一套更宽的扩展,支持 256 色、鼠标上报、窗口标题设置。
关键在于:老设备固件里写死的就是一张解析表,它只认这个表里的序列。你在客户端把仿真类型选成 Xterm,对面那台十几年前的嵌入式设备发过来的还是 VT100 子集,本身不会出错;但如果设备发的是 Wyse 风格序列,而你把客户端设成 VT100,就会出现"界面能连、全屏程序全乱"的经典现象——vi打开后花屏、top刷新一次糊一次、函数键按下去冒出一串^[[[A。我一般的判断顺序是:先看设备手册写的终端类型,没有手册就连上去发echo $TERM看远端环境变量,再拿tput clear试一下清屏正不正常。三步基本能锁定。
还有一个容易被忽略的参数是行列数。VT100 默认 80×24,某些设备的全屏菜单是按 80×24 画死的,你把窗口拉到 160 列宽,设备那边依然按 80 列换行,看起来就像文字跑到屏幕外面去了。在会话设置里锁定 80×24 或 132×43,比在窗口上拖拽拖半天管用得多。
2.2 四种会话类型的边界:Telnet、SSH、串口、RLogin
NetTerm5.4 的会话类型不止一种,选型错了后面全是坑。下面这张表是我实际排障时对着看的版本:
| 会话类型 | 典型用途 | 是否加密 | 常用端口 | 主要注意点 |
|---|---|---|---|---|
| Telnet | 内网老设备、带外管理口、BBS 类服务 | 明文 | 23 | 账号口令全程明文,只在隔离网段用 |
| SSH | Linux 主机、网络设备命令行 | 加密 | 22 | 老设备可能只支持旧算法,协商会失败 |
| 串口 | 设备 Console、PLC、单板调试口 | 不涉及网络 | COM1~COMn | 线序、流控、波特率三件事必须对 |
| RLogin | 早期 Unix 主机 | 明文 | 513 | 现在很少见,碰到基本是遗留系统 |
选型的判断很简单:能走网络且有 SSH 的就走 SSH;设备只有 Console 口就老实接串口线;只有 Telnet 的,把它放在管理 VLAN 里,别暴露到业务网段。这不是矫情,Telnet 会话里敲的每一个字符,包括口令,在网络上是裸奔的,抓包工具一抓一个准。绿色版便携的代价是它没有集中化的凭证管理,账号口令要么每次手敲,要么存在本地会话里——后者意味着那台机器的文件夹本身就是敏感资产,拷贝和传递要按你们公司的软件资产与信息安全流程走。
2.3 绿色版的目录布局与配置落盘位置
便携版最值钱的地方是"配置跟着文件夹走",但前提是你知道配置到底落在哪。常见的目录结构大致是这样:
NetTerm54/ ├── netterm.exe # 主程序 ├── *.dll # 运行时依赖 ├── netterm.ini # 全局设置:字体、颜色、默认仿真类型 ├── sessions/ # 会话(地址簿)条目,一台设备一份 ├── logs/ # 会话日志输出目录 ├── fonts/ # 终端字体,等宽点阵或 TrueType └── scripts/ # 宏与登录脚本要确认配置真的写在本目录而不是用户目录,有个笨但有效的办法:改一个显眼的设置(比如背景色),退出程序,然后看这个文件夹里哪个文件的修改时间变了。如果整个目录一个文件都没动,说明它把配置写到了用户配置目录,换机器就会"配置全丢"。这时候要么在设置里把配置路径指回程序目录,要么在退出前手动导出会话清单。绿色版最怕的就是这个——你以为它是便携的,其实只有程序便携,状态没便携。
3. 从零建一个能用的会话:连接参数、串口时序与键盘映射
3.1 Telnet/SSH 会话的必填项与建议值
新建会话时真正需要想清楚的参数没几个,但每一个都能让你卡半小时:
| 参数 | 建议值 | 说明 |
|---|---|---|
| 主机地址 | IP 或可解析的主机名 | 设备多的话统一用 IP,避免 DNS 变更后集体失效 |
| 端口 | Telnet 23 / SSH 22 / 自定义 | 改过端口的设备务必记在会话名里 |
| 终端类型 | vt100(默认)、vt220、xterm | 与设备手册一致优先,其次按 2.1 的排查顺序试 |
| 屏幕尺寸 | 80×24 或 132×43 | 有全屏菜单的设备锁 80×24 |
| 本地回显 | 关 | 开着会出现"敲一个字符显示两个" |
| 换行方式 | CR/LF 按设备习惯 | 表现为回车后光标不换行,或每次多空一行 |
| 连接超时 | 10~30 秒 | 内网可以短,跨网段留长 |
| 保活 | 开启,间隔 30~60 秒 | 防 NAT 或防火墙把空闲连接踢掉 |
我一般会先把"终端类型 + 屏幕尺寸 + 本地回显"这三项固定成模板,后面每加一台设备只改 IP 和端口。会话命名上带上前缀,比如PLC-LINE3-10.21、SW-CORE-10.1,等设备攒到几十台的时候,你会感谢当时多敲的那几个字。
3.2 串口会话:波特率、数据位与流控的配法
串口是这套工具里最难"猜"的部分,因为它不给你任何错误提示——配错了就是没输出,或者输出一堆乱码。参数就五个:波特率、数据位、校验位、停止位、流控。
| 参数 | 绝大多数设备 | 说明 |
|---|---|---|
| 波特率 | 9600 | 网络设备 Console 口最常见的值;部分新设备 115200 |
| 数据位 | 8 | 7 位只在极老的设备上出现 |
| 校验位 | None | 有校验的基本是工业仪表 |
| 停止位 | 1 | 组合起来就是常说的 8N1 |
| 流控 | None 或 RTS/CTS | 长距离、高波特率时必须开硬件流控 |
判断波特率对不对有个快招:接上后按几下回车。乱码说明波特率接近但不对(常见是 9600 对 19200);完全没反应大概率是线序问题——串口调试最常见的就是把直连线和交叉线搞混,TX 接了 TX,谁也不说话。设备 Console 口一般需要交叉(null modem)连接,也就是一端的 TX 接另一端的 RX。另外注意有些设备的口是 RS-232 电平,有些是 TTL 电平,中间需要电平转换,直接怼上去不但不通,还可能伤口。
流控这件事值得单独说。不开流控时,如果设备一次吐几百行日志,而你的串口缓冲来不及消费,就会丢字符,表现为日志里偶发少几个字、命令被截断。这种丢字符是静默的,不会报错,排查起来极其费劲。所以只要条件允许,硬件流控 RTS/CTS 就开着;如果线缆只有三根线(TX/RX/GND),那就只能不开流控,同时把设备的日志输出节奏放慢。
3.3 键盘映射:把 Backspace 和方向键掰回正轨
键盘映射是"玄学"重灾区。同一个 Backspace 键,有的终端发 0x08(BS),有的发 0x7F(DEL),远端readline收到哪个才删字符,取决于stty erase的设置。表现就是:按退格没反应,或者屏幕上出现^H,或者干脆把整行清空。
| 按键 | 常见序列 | 什么时候会出问题 |
|---|---|---|
| Backspace | 0x08 / 0x7F | 远端stty erase与发送值不一致 |
| Delete | ESC[3~ | 老终端不认,需要改成ESC[3~之外的退格 |
| 方向键 | ESC[A/B/C/D或ESC OA/B/C/D | 应用模式与普通模式切换 |
| Home/End | ESC[H/ESC[F或ESC[1~/ESC[4~ | 在vi里跳不到行首行尾 |
解决思路不是一个个试,而是在远端先看一眼当前设置:stty -a能看erase绑的是^H还是^?,echo $TERM能看终端类型。客户端这边把 Backspace 调成与erase一致,方向键按$TERM对应的序列选,基本一次到位。如果远端是 busybox 这类精简环境,stty选项可能不全,那就以客户端为准,反向去适配。
3.4 字符集:中文乱码的三种成因
中文显示问题几乎每个用老终端的人都踩过。乱码看着都一样,成因其实分三类:
第一类是编码不匹配。设备发 GBK,客户端按 UTF-8 解码,就是标准的"锟斤拷"式乱码;反过来发 UTF-8 按 GBK 解,是一堆问号和方块。判断方法很简单:把客户端字符集在 GBK / UTF-8 / ISO-8859-1 之间切一遍,哪个能读就是哪个。第二类是字体不含字形。编码对了,但选的终端字体是纯 ASCII 点阵字体,中文只能显示成空白或方框,换一款等宽的中文字体即可。第三类是全角半角宽度算错。中文占两个字符宽度,但终端按一列一个字符来排,结果表格对不齐、进度条错位。这类不是编码问题,是终端对宽字符的支持程度问题,换仿真类型或换字体通常能缓解。
实际工作中我的顺序是:先确认远端 locale(echo $LANG、locale),再定客户端字符集,最后挑字体。三层都对上了,中文才不会出问题。
4. 日志、宏与批量会话:把重复劳动压下去
4.1 会话日志的落盘策略与轮转
设备调试最有价值的产出不是当场解决了问题,而是留下了现场。会话日志建议在建立会话时就打开,写入logs/下按会话命名的文件,追加模式,带时间戳。这里有几个实操细节:
一是别用覆盖模式。同一个会话反复连,覆盖模式只会留下最后一次,出问题要复现的时候正好没数据。二是路径别写绝对路径。绿色版拷到别的机器上,绝对路径直接失效,日志要么写不进去要么写到奇怪的地方,用相对路径.\logs\更稳。三是日志要轮转。串口接的设备一天能吐几十兆,不轮转的话单文件很快就会大到打不开——我一般按天切,文件名带日期后缀,保留最近两周。
关于内容,得提醒一句:会话日志里可能包含口令明文(Telnet 登录、设备enable密码),这类日志不要随手往外发,也别丢进公共共享目录。要是必须共享排障记录,先做一遍关键字替换。
4.2 宏与脚本:自动登录和命令序列的写法
宏的价值在于把"连上去、等提示符、敲用户名、等、敲密码、等、进配置模式"这串动作固定下来。写宏最容易翻车的是延时——网络设备启动慢的时候,提示符可能十几秒才出来,延时设短了,用户名就敲到了登录 banner 前面,整个序列全乱。
稳妥的做法是基于"等待输出出现某段文本"来推进,而不是基于固定时间。伪代码大概是这个意思:
连接 -> 等待 "login:" -> 发送用户名 -> 等待 "Password:" -> 发送口令 -> 等待 "#" 或 ">" -> 发送后续命令序列 每一步等待设置上限(如 30 秒),超时就中止并记录# 用伪代码形式说明等待式宏的推进逻辑,实际宏语法以工具支持为准 def run_macro(session, steps, timeout=30): for expect_text, send_text in steps: # 等待远端输出中出现 expect_text,而不是死等固定秒数 if not session.wait_for(expect_text, timeout=timeout): session.log(f"等待 {expect_text!r} 超时,中止宏") return False session.send(send_text + "\r") # 设备侧普遍认 CR 作为回车 return True steps = [ ("login:", "operator"), ("Password:", "******"), ("#", "show interface status"), ]这段逻辑里三个参数最关键:expect_text要和设备真实提示符一致(大小写、冒号、空格都算),timeout要给足启动时间,send_text末尾必须补回车符。很多设备只认\r不认\n,发\n过去它当没看见,表现就是"宏跑了但什么都没发生"。另外口令别硬编码在共享的宏文件里,那等于把密码写在了明面上。
4.3 会话清单外置:用 CSV + Python 管理几十台设备
设备一多,手工在地址簿里加会话就成了纯体力活,而且极容易写错 IP。我的习惯是把设备清单放在一个 CSV 里,当成唯一事实来源,再用脚本生成启动脚本和做连通性预检。
name,host,port,proto,emulation,note PLC-LINE3,192.168.10.21,23,telnet,vt100,产线三号控制柜 SW-CORE,192.168.10.1,22,ssh,vt100,核心交换机 GW-EDGE,192.168.10.254,23,telnet,vt100,边界网关import csv import socket # 1) 生成按会话名拉起的批处理,省去每次翻地址簿 # 2) 对每个会话做一次 TCP 连通性预检,提前暴露不通的设备 with open("sessions.csv", newline="", encoding="utf-8") as f: rows = list(csv.DictReader(f)) lines = ["@echo off"] for r in rows: name, host, port = r["name"], r["host"], int(r["port"]) # 端口探测:超时 2 秒,连不上就把设备标记出来 try: with socket.create_connection((host, port), timeout=2): status = "OK" except OSError as e: status = f"FAIL({e.__class__.__name__})" print(f"{name:12s} {host:16s}:{port:<5d} {status}") # 生成一行调用命令;实际参数名按你们客户端支持的方式调整 lines.append(f'start netterm.exe /session:"{name}"') with open("launch_all.bat", "w", encoding="gbk") as f: f.write("\r\n".join(lines))逻辑说明:第一段把 CSV 读成字典列表,CSV 作为唯一数据源,改设备只改这一处;中间用socket.create_connection做两秒超时的 TCP 探测,能区分"设备没开"和"端口不对";最后生成批处理,encoding="gbk"是为了让批处理里的中文会话名在 Windows 控制台下不乱码。参数上,timeout别设太大,几十台设备串行探测时 2 秒已经够用;/session:这类命令行参数以实际程序支持为准,不支持的话就把生成的命令改成手工复制粘贴的清单,一样省事。
5. 避坑与排查:六类高频翻车现场
5.1 连不上、连上卡住:先怀疑网络和模式,别急着改设备
现象一:会话建立成功,但敲回车没有任何反应。原因通常不在网络,而在会话模式。终端有"行模式"和"字符模式"之分,行模式下你敲的字符先攒在本地,等回车才一次性发出去;如果本地回显又开着,屏幕上会出现敲一下显示两个字符的怪象。解决是把模式切到字符模式、关掉本地回显,再试一次。如果仍无反应,用telnet 主机 端口从命令行裸连一次做对照——命令行能通说明是客户端配置问题,命令行也不通就是网络或设备问题,这一步能省掉大量瞎猜。
现象二:SSH 连接在协商阶段就断开。原因多半是算法不匹配。老设备只支持较旧的密钥交换和加密算法,新客户端默认不启用,双方谈不拢就断。解决不是去关掉安全选项,而是先确认设备固件能不能升级;升不了,再在客户端针对性放开旧算法,并且只对这一台设备放开,别全局降级。同时把这类设备单独放到一个管理网段,别跟办公网混在一起。
5.2 显示与输入错乱:三个参数决定一切
现象三:方向键按下去出现^[[A这种字符。原因是终端类型与远端期望不一致,远端没把这段序列当方向键解析,直接原样回显了。解决是先echo $TERM看远端认为你是什么终端,再把客户端仿真类型改成同一个值;如果远端环境变量没设,就在登录脚本里显式export TERM=vt100。
现象四:中文全是乱码或方块。按 3.4 的三层顺序排查:字符集、字体、宽字符支持。九成情况是编码不匹配,切换 GBK / UTF-8 就能定位;剩下的一成是字体不含中文字形,换等宽中文字体即可。注意别在会话中途切字符集,已经滚上去的历史内容不会重排,看起来还是乱的,容易误判成"没生效"。
5.3 串口与长连接:静默丢数据最难查
现象五:串口能收到启动日志,但发命令设备没反应。先查流控。开了硬件流控但线缆只有三根线,RTS/CTS 悬空会被当成"对方忙",导致发送被永久阻塞——表现就是"能收不能发"。解决是把流控改成 None 试一次,能发就说明是线的问题。其次查线序,Console 口一般要交叉连接,直连线接上去 TX 对 TX,双方都听不见对方说话。
现象六:会话挂在那儿十几分钟没动,回来发现已断开。原因是中间的网络设备把长时间空闲的 TCP 连接回收了。解决办法是开保活,间隔设 30~60 秒,让链路上始终有微量流量。另外串口场景下还有一种"假死":设备在等流控信号,客户端在等设备输出,双方僵住,敲个回车或者拔插一次串口线通常能解开——但真正要解决还是得把流控配对。
顺带提一句合规的事:绿色版便携、免安装,很容易在团队里私下拷来拷去,软件授权该走的流程还是要走,别让一个调试工具变成资产管理的盲区。
6. 进阶:把会话配置当代码管,附一套上线前验证清单
配置攒到几十上百条之后,真正的风险不是"配不对",而是"不知道谁改了什么"。我的做法是把这个绿色版目录里跟设备相关的部分(会话清单 CSV、宏脚本、字体与颜色配置)单独拎出来放进版本管理,程序本体和日志目录加进忽略列表。这样每次改动都有 diff,谁把某台设备的端口从 23 改成 2323 一眼就能看见。
配套一个极简的对比脚本,改动前后各跑一次,输出新增、删除、修改的会话:
import csv, sys def load(path): with open(path, newline="", encoding="utf-8") as f: # 以会话名为键,整行内容为值,便于逐字段比对 return {r["name"]: r for r in csv.DictReader(f)} old, new = load(sys.argv[1]), load(sys.argv[2]) for name in sorted(set(old) | set(new)): if name not in old: print(f"+ 新增 {name}") elif name not in new: print(f"- 删除 {name}") elif old[name] != new[name]: # 逐字段列出差异,避免整行输出看不清改了哪一项 diff = {k: (old[name][k], new[name][k]) for k in new[name] if old[name].get(k) != new[name][k]} print(f"~ 修改 {name}: {diff}")参数说明:两个入参分别是改动前和改动后的 CSV 路径;输出用+ - ~三个前缀区分新增、删除、修改;diff只列出变化的字段,比整行打印可读得多。这个脚本很小,但它在"某台设备突然连不上、怀疑是有人改了配置"的时候,能几十秒内给出答案。
上线前的验证清单,我一般固定跑这五项:
| 检查项 | 做法 | 通过标准 |
|---|---|---|
| 端口可达 | 脚本批量 TCP 探测 | 全部 OK,失败项有明确归属 |
| 仿真类型 | 连上后echo $TERM | 与设备手册一致 |
| 键盘行为 | 退格、方向键、Home/End 各按一次 | 无^H、无^[[原样回显 |
| 中文显示 | 远端cat一个含中文的文件 | 无乱码、表格对齐 |
| 日志落盘 | 断开后检查日志文件 | 有内容、时间戳正确、路径为相对路径 |
这套清单没什么技术含量,但它救过我一次:某次批量导入会话后,有一台设备的端口少写了一位,靠肉眼看根本发现不了,是端口探测那一项把它揪出来的。从那以后我每次动会话清单,都强制把探测和 diff 各跑一遍,再连一台设备手工验一次键盘和中文——机器能查的交给脚本,机器查不出来的(比如退格键到底顺不顺手)自己按两下。希望帮到你。
本文还有配套的精品资源,点击获取