之所有要无交互, 是因为需要批量测试大量主机的网络连通性所以需将 telnet 写入脚本, 并将其测试结果保存在文件中所以, 需要无交互式进行测试
正常来说, telnet 执行结果是这样的
- $ telnet 192.168.119.166 21
- Trying 192.168.119.166 ...
- Connected to 192.168.119.166 21.
- Escape character is '^]'
- >
此时命令未退出
根据提示 Escape character is '^]' 可知退出字符为 ^] (CTRL+]) 此时输入其它字符不能使其退出, CTRL+C 都不行输入 CTRL+] 后会自动执行, 进入命令模式:
^] telnet>
此时再运行 quit 才会真正退出
显然, 这样是无法写入脚本的, 所有需要让其输出结果后自行退出有两种情景:
输出结果后立即退出
- $ echo " " | telnet 192.168.119.166 21
- Trying 192.168.119.166....
- Connected to 192.168.119.166
- Escape character is '^]'.
- Connection closed by foreign host.
上述为网路通成功的返回结果
网络不通的执行结果为:
- Trying 192.168.119.166...
- telnet: connect to address 192.168.119.166: Connection refused
输出结果后延迟退出
sleep 2 使得 telnet 输出结果后, 停留 2 秒后退出命令模式
$ sleep 2 | telnet 192.168.119.166 21
返回结果与上述一致
使用这种方式可以将标准输出和标准错误重定向到文件中, 通过分析文件的内容来判断端口打开状态
所以, 可以通过以下方式来判断 telnet 测试结果的连通性
- result=`echo ""| telnet $ip $port 2>/dev/null | grep"]" | wc -l`
- if [ $result -eq 1 ];then
- echo "$ip 的 $port 端口已开启"
- else
- echo "$ip 的 $port 端口未开启"
- fi
- --------------------------EOF-------------------------------------
题外话:
telnet 的 Escape character 可以自定义, 使用参数 - e:
- $ telnet -e p telnet 192.168.119.166 21
- Telnet escape character is 'p'.
- Trying telnet 192.168.119.166 ..
- Connected to telnet 192.168.119.166 .
- Escape character is 'p'.
- p
- telnet> quit
- Connection closed.
来源: http://www.jianshu.com/p/92adf516a62d