引用此问题: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分钟,这似乎是谷歌使用的超时。而是:
{ 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 -错误(在这里,我期望远程登录停止,因为远程主机发送了一个kill,但是睡眠成功了)
那么,我该如何解决这个问题呢?谢谢!
发布于 2018-02-02 19:25:50
尽管我不太喜欢它,但这似乎是有效的:
( 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,但相同的系统也可以工作。
发布于 2018-02-02 16:41:00
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
}https://stackoverflow.com/questions/48578664
复制相似问题