从bash捕获telnet超时

时间:2018-02-02 08:31:42

标签: bash telnet

引用此问题:automating telnet session using bash scripts

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

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

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

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

只是为了解释我试图做的事情,让我们借用谷歌的帮助。我希望我的时间输出为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停止,因为远程主机发送了一个kill,而是睡眠获胜)

那么,我该如何解决这个问题呢?谢谢!

2 个答案:

答案 0 :(得分:1)

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

( 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标题/正文和时间结果,因此两者都可以被操纵。

顺便说一句,上面适用于HTTP。对于HTTPS,您必须使用openssl,但相同的系统可以使用。

答案 1 :(得分:0)

telnet用于交互式使用。我建议使用netcat

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


EOF

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

#!/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
}