如何隐藏telnet连接日志并保持会话交互性?
隐藏Telnet连接日志并保持交互会话的方法
方案一:使用bash结合stdbuf与sed过滤输出
telnet的初始连接提示(Trying...、Connected to...、Escape character is...)属于标准输出(stdout),直接用管道过滤会导致telnet进入缓冲模式,无法实时交互。我们可以用stdbuf关闭telnet的输入输出缓冲,再通过sed过滤掉前3行内容:
#!/bin/bash # 关闭telnet的IO缓冲,过滤前3行输出,同时保持stdin从终端读取 stdbuf -i0 -o0 -e0 telnet 1.2.3.4 7777 | sed '1,3d'
说明:
stdbuf -i0 -o0 -e0:强制telnet的输入、输出、错误流都使用无缓冲模式,确保交互实时性sed '1,3d':删除输出的前3行,正好对应那三条连接日志- 此方案依赖
coreutils包(多数Linux发行版默认预装)
方案二:使用Expect脚本精确控制交互
如果需要更精准的控制(比如匹配特定提示行而非固定行数),可以用Expect脚本捕获并忽略连接提示,之后进入交互模式:
#!/usr/bin/expect # 启动telnet会话 spawn telnet 1.2.3.4 7777 # 匹配并忽略连接提示行,遇到login提示后进入交互模式 expect { "Trying *" { exp_continue } # 忽略Trying提示 "Connected to *" { exp_continue } # 忽略Connected提示 "Escape character is *" { exp_continue } # 忽略Escape字符提示 default { interact } # 进入交互模式,接管终端输入输出 }
说明:
spawn:启动telnet进程expect:捕获指定的输出行,exp_continue表示继续等待下一个匹配interact:将终端控制权交还给用户,保持正常交互- 此方案需要安装
expect包(可通过apt install expect或yum install expect安装)
为什么直接重定向不行?
- 使用
1>/dev/null会将所有标准输出(包括后续的login:提示和交互内容)都丢弃,导致无法看到远程系统的反馈 - 使用
2>/dev/null无效,因为telnet的连接提示是输出到stdout而非stderr
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

