JoeSlav
JoeSlav

Reputation: 4815

Capturing telnet timeout from bash

Referencing this question: automating telnet session using bash scripts

I am trying to capture the time it takes for a remote host to timeout. Let's say it's 10 seconds. By hand, I can launch time telnet host port input some commands and then do nothing and after 10 seconds time's output will hold my needed time.

While, in a script, the issue is that using this solution:

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

when the pipes end, it sends an EOF and telnet closes immediately. I can solve this by adding a sleep n as my last piped command, but then everything hangs for that timeout (which can be more than the actual server timeout).

Just to explain what I'm trying to do let's borrow Google's help. I want my time output to be 5 minutes, which is what Google seems to use as timeout. Instead:

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

Gives 0 - wrong (EOF is sent immediately)

{ 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

Gives 10 - wrong

{ 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

Gives 1 - wrong

{ 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

Gives 900 - wrong (here I would expect the telnet to stop given the remote host sends a kill, but instead the sleep wins)

So, how can I solve this? Thanks!

Upvotes: 3

Views: 2212

Answers (2)

hek2mgl
hek2mgl

Reputation: 158280

telnet is meant for interactive use. I recommend to use netcat:

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


EOF

Alternatively you may use /dev/tcp if your script runs in 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
}

Upvotes: 2

JoeSlav
JoeSlav

Reputation: 4815

Although I don't overly like it, this seems to work:

( 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

The above outputs both the HTTP headers/body and the time results, so both can be manipulated.

By the way, the above works for HTTP. For HTTPS you have to use openssl, but the same system works.

Upvotes: 2

Related Questions