bash - 从 bash 捕获 telnet 超时

标签 bash telnet

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

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

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

{ echo "command"; } | time telnet host port

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

为了解释我正在尝试做的事情,让我们借用 Google 的帮助。我希望我的时间输出为 5 分钟,谷歌似乎将其用作超时。相反:

{ 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 停止,因为远程主机发送了一个 kill,但 sleep 获胜)

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

最佳答案

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

( 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 - 从 bash 捕获 telnet 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48578664/

相关文章:

bash - Bash 脚本的变量语法错误(作业)

java - 如何使用Java套接字调用Telnet通信?

c# - 使用事件处理程序接收到的 TCP 客户端数据

arrays - 在 Bash 脚本中查找字符串在数组中的位置

regex - bash: oneliner 将输出中的十六进制数转换为十进制数

linux - 检查脚本双重执行

linux - 如果任何命令返回非零值,则中止 shell 脚本

tcp - telnet 连接收到的前 4 个字符串是什么?

java - 在 java 中解析 IBM 3270 数据

java - Telnet基本IO操作