Bash脚本中Telnet结合Tee后未立即终止的技术疑问
为什么
tee能让Telnet正常运行而不立即终止? 这事儿得从Telnet的运行逻辑和管道对进程环境的影响说起,咱们一步步拆解:
1. 原脚本中Telnet立即退出的原因
当你直接后台运行telnet ipaddr port &时:
- 由于Bash脚本以非交互式方式运行,脚本的标准输入(stdin)默认是
/dev/null(空设备,读取会立即返回EOF)。 - Telnet启动后,检测到自己的stdout是终端(没有重定向),会进入交互模式。在这个模式下,Telnet会监听stdin的输入;一旦读取到EOF(从
/dev/null读数据就会触发),它就认为用户要退出,主动关闭连接并终止进程。 - 你看到的“Connection closed by foreign host”其实是Telnet主动发起关闭后,远程主机的响应结果。
2. 加上tee后Telnet正常运行的关键差异
当改成telnet ipaddr port | tee -a out.txt &时,核心变化有两点:
- stdout被重定向到管道:Telnet的标准输出不再直接连到终端,而是通过管道传给
tee命令。这会触发Telnet切换到非交互/批处理模式。 - 非交互模式下的stdin处理逻辑改变:在批处理模式中,Telnet不会因为stdin收到EOF就立即终止。它的核心逻辑变成“持续接收远程主机的输出,直到远程主动关闭连接”,不再依赖stdin的输入来维持运行。
- 其实
tee只是负责把输出同时写到文件和终端,真正让Telnet不退出的是模式切换——哪怕你换成cat > out.txt,效果也是一样的。
可以试试这些验证命令
telnet ipaddr port > out.txt &:和加tee的效果类似,Telnet会正常运行到远程关闭,因为stdout被重定向到文件触发了非交互模式。telnet ipaddr port < /dev/null:即使前台运行,只要stdin是/dev/null,Telnet进入交互模式后会立即退出,和原脚本后台运行结果一致。
内容的提问来源于stack exchange,提问作者pepero
相关产品推荐
相关产品推荐

