Linux——优雅地获取telnet结果

前言

在Linux服务器中我们偶尔会需要用到telnet命令来帮助我们判断当前服务器到其他服务器应用的网络关系是否开通,交互式的telnet对于我们批量验证网络关系并不友好,因此本篇文章将分享一下怎么用脚本的方式来批量验证telnet的结果。希望对各位读者有所帮助

在开始之前,我们先简单说一下telnet命令,telnet命令支持2种模式:会话模式命令模式,一般情况下我们使用telnet ip port连接到某个服务上面时就会进入到会话模式,此时我们可以通过命令和远程的服务端进行交互。退出的时候使用ctrl+]退出会话模式(进入到命令模式),再输入quit退出命令模式,此时才能完全退出telnet命令。
可以看到退出telnet命令略显麻烦,下面我们来说一下如何快速的退出telnet命令,可以结合echo命令帮助我们完成。在连接成功/失败后会自动断开连接。

echo "" | telnet ip port

上面的命令虽然解决了快速退出telnet的需要,但还是不够优雅,因为这里还面临1个问题:无法控制超时时间,我们可以结合timeout命令来设置一个超时时间,例如下面的例子

echo "" | timeout --signal 9 2 telnet 39.98.74.233 80
执行结果

上面的脚本解决了处理连接超时的问题,但是结果输出略显冗余,我们还可以进一步用脚本做优化,使用$?来接收命令的执行,以下面的脚本为例,我们来简单分析一下这个脚本的执行流程。
① 定义需要扫描的ip和端口
② 使用timeout命令设置telnet命令的超时时间
③ 使用echo追加字符串来强制退出telnet
这里有个小细节,我们在前面说过telnet退出第一次后会进入到命令模式,想要完整的退出的话需要额外输入close或者quit命令,这里使用-e命令使echo具备解析转义字符的能力,而\x1d\x0d分别对应16进制下的1d0d,对应ASCII中的空格键和回车键。从而让我们可以同时退出telnet的两种模式。
eval命令用于把一长串的命令当做一个整体命令来执行,方便我们对输出结果进行统一的重定向
⑤使用$?判断telnet命令是否正常联通,输出我们想要的结果语句

PS:如果需要扫描很多组不同的IP和端口的话,建议可以再把下面的脚本优化一下,抽一个函数出来处理。

#!/bin/bash

ipList=("10.10.10.10" "10.33.33.33")
portList=("80")

for ip in ${ipList[@]}
do
    for port in $portList
    do
        eval "echo -e '\x1dclose\x0d' | timeout --signal=9 2 telnet $ip $port" >/dev/null 2>&1
        if [ $? -ne 0 ]; then
            echo "connect $ip $port fail!"
        else
            echo "connect $ip $port success."
        fi
    done
done
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 情景 telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式。虽然telnet支持许多命...
    软件测试技能栈阅读 3,006评论 0 1
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,268评论 2 33
  • 一、目录结构 目录说明/binBinary的缩写,这个目录存放最经常使用的命令;/sbins就是Super Use...
    CJ21阅读 1,732评论 0 15
  • 系统管理与维护命令 date date(选项)(参数) | 选项 | 说明 | | :-------- | ...
    蓓蓓的万能男友阅读 4,063评论 0 5
  • Firewall 工作于网络(网络防火墙)或主机(主机防火墙)的边缘(通信报文的进出口),对于进出本网络或主机的报...
    SRE1阅读 1,392评论 0 0