从 bash 捕获 telnet 超时
Capturing telnet timeout from bash
参考这个问题: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 停止,因为远程主机发送了一个 kill,但睡眠赢了)
那么,我该如何解决呢?谢谢!
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
}
虽然我不太喜欢它,但这似乎有效:
( 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,但同样的系统可以工作。
参考这个问题: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 停止,因为远程主机发送了一个 kill,但睡眠赢了)
那么,我该如何解决呢?谢谢!
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
}
虽然我不太喜欢它,但这似乎有效:
( 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,但同样的系统可以工作。