在bash shell素文字,我用几个命令行工具(wget
,curl
,httpie
)来测试我的HTTP服务器。
当使用例如curl调用GET请求时,我发现在HTTP通信完成后,将打开一个TCP连接到我的服务器并立即关闭。
$ curl http://10.5.1.1/favicon.ico -o /dev/null
为了更好地测试服务器的保持活动状态,我希望在多个http请求/响应周期中保持tcp连接的打开状态。
我可以直接从bash执行不良的http请求,如下所示:
exec 3<>/dev/tcp/10.5.1.1/80
printf "GET /\r\n\r\n" >&3
while IFS= read -r -u3 -t2 line || [[ -n "$line" ]]; do echo "$line"; done
exec 3>&-
exec 3<&-
但是,由于我的测试通信要复杂得多(包括身份验证等),所以我不想自己用bash或其他脚本语言完全编写代码,而是想使用现有工具。现在的想法是先在bash中打开一个tcp套接字,然后强制某些命令行工具使用此连接,而不是打开自己的套接字。也许是这样;
exec 3<>/dev/tcp/10.5.1.1/80
curl http://10.5.1.1/message.txt --use-existing-socket-fd=3
# ... do some other testing stuff ...
wget http://10.5.1.1/message.txt --use-existing-socket-fd=3
# ... do some other testing stuff ...
http http://10.5.1.1/message.txt --use-existing-socket-fd=3
exec 3>&-
exec 3<&-
使用上述工具或其他工具是否有可能?
您正在寻找的工具是socat
。由于您正在测试一台Web服务器,因此您可以要求它与该服务器建立永久连接(只要它没有选择关闭它-相应地调整超时),一旦完成,您就可以使用连接作为隧道。以下是完成此操作的两种方法。
curl
有一个--unix-socket
允许您通过Unix套接字发送HTTP请求和接收HTTP答复的选项(谢谢您的宝贵意见,谢谢)
您可以这样使用它:
socat TCP:10.5.1.1:80 UNIX-LISTEN:/tmp/curl.sock,fork
然后,在另一个终端上:
curl --unix-socket /tmp/curl.sock http://10.5.1.1/message1.txt
curl --unix-socket /tmp/curl.sock http://10.5.1.1/message2.txt
...
您也可以提供一个伪代理通过你的隧道wget
,curl
......将连接。该解决方案具有不受限于的优点curl
。
这次,socat
侦听本地TCP端口(例如3128):
socat TCP:10.5.1.1:80 TCP-LISTEN:3128,fork,reuseaddr
然后,在另一个终端上:
export http_proxy='http://localhost:3128'
curl http://10.5.1.1/message.txt
wget http://10.5.1.1/message.txt
....
请注意,由于HTTP客户端正在使用代理,因此HTTP请求将稍作更改,这可能是不希望的。
当然,这两种解决方案都不打算与多个HTTP服务器一起使用,因为这是位于接收所有请求的通道末尾的Web服务器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句