引用此问题: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,而是睡眠获胜)
那么,我该如何解决这个问题呢?谢谢!
答案 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
}