从 bash 捕获 telnet 超时

Posted

技术标签:

【中文标题】从 bash 捕获 telnet 超时【英文标题】:Capturing telnet timeout from bash 【发布时间】:2018-07-12 17:13:14 【问题描述】:

引用这个问题:automating telnet session using bash scripts

我正在尝试捕获远程主机超时所需的时间。 假设它是 10 秒。 手动,我可以启动time telnet host port 输入一些命令然后什么都不做,10 秒后time 的输出将保持我需要的时间。

而在脚本中,问题在于使用此解决方案:

 echo "command";  | time telnet host port

当管道结束时,它会发送一个 EOF 并且 telnet 会立即关闭。我可以通过添加sleep n 作为我最后一个管道命令来解决这个问题,但随后一切都会因超时而挂起(可能超过实际的服务器超时)。

为了解释我想要做什么,让我们借用 Google 的帮助。我希望我的时间输出为 5 分钟,这似乎是 Google 用作超时的时间。而是:

 echo "GET / HTTP/1.1"; echo "Host: www.google.com"; echo "Connection: keep-Alive"; echo ""; echo "";  | time telnet www.google.com 80 2>&1

给出0 - 错误(立即发送EOF)

 echo "GET / HTTP/1.1"; echo "Host: www.google.com"; echo "Connection: keep-Alive"; echo ""; echo ""; sleep 10;  | time telnet www.google.com 80 2>&1

给出10 - 错误

 echo "GET / HTTP/1.1"; echo "Host: www.google.com"; echo "Connection: keep-Alive"; echo ""; echo ""; sleep 1;  | time telnet www.google.com 80 2>&1

给出1 - 错误

 echo "GET / HTTP/1.1"; echo "Host: www.google.com"; echo "Connection: keep-Alive"; echo ""; echo ""; sleep 900;  | time telnet www.google.com 80 2>&1

给出900 - 错误(这里我希望 telnet 停止,因为远程主机发送了杀戮,但睡眠获胜)

那么,我该如何解决呢?谢谢!

【问题讨论】:

【参考方案1】:

telnet 用于交互使用。我推荐使用netcat:

time netcat -q-1 www.google.com 80 <<EOF
GET / HTTP/1.1
Connection: keep-alive
Host: www.google.com


EOF

如果您的脚本在bash 中运行,您也可以使用/dev/tcp

#!/bin/bash
host="www.google.com"
port=80    
time 
    exec 3<>"/dev/tcp/$host/$port"
    cat <<EOF - >&3
GET / HTTP/1.1 
Host: $host
Connection: keep-alive


EOF
    cat <&3

【讨论】:

感谢指点!该命令实际上是否给了您 5 分钟作为 time 的结果?对我来说,它会立即中断。顺便说一句,它的“GET / HTTP/1.1” 为什么要5分钟? 因为在我们的 Google 示例中,这就是 Google 正在做的事情。如果您发送这些命令,Google 会回复,然后等待 5 分钟,然后关闭连接。 “5分钟”是我想要衡量的。如果您尝试 telnet,您会看到此行为:pastebin.com/uzad7QRm。也许这是一些 netcat 选项.. 非常感谢。这种方法将无法使用 openssl 测试 HTTPS,但它绝对比使用 expect 更好!【参考方案2】:

虽然我不太喜欢它,但这似乎有效:

( time  echo "set timeout 400"; echo "spawn telnet www.google.com 80"; 
         echo 'send "GET / HTTP/1.1\r"'; echo "send \"Host: www.google.com\r\""; 
         echo 'send "Connection: keep-alive\r"'; echo 'send "\r"'; 
         echo "expect  eof exit timeout exit ";  | expect ) 2>&1

上面输出了HTTP headers/body和时间结果,所以两者都可以操作。

顺便说一下,以上内容适用于 HTTP。对于 HTTPS,您必须使用 openssl,但同样的系统可以工作。

【讨论】:

以上是关于从 bash 捕获 telnet 超时的主要内容,如果未能解决你的问题,请参考以下文章

Bash Expect Telnet:处理服务器关闭的过早连接

如何从 bash 获取 telnet 命令的输出?

在启动的 telnet 会话中使用期望脚本

在 bash 中读取 telnet 延迟的答案

在 Bash 脚本中将 Telnet 命令传递给 SSH

用于测试多个地址和端口的 Bash 脚本 telnet