Joe*_*Joe 4 bash wget tcp http curl
在 bash shell scipt 中,我使用了几个命令行工具(wget、curl、httpie)来测试我的 http 服务器。
当使用例如 curl 调用 GET 请求时,我看到一个 tcp 连接被打开到我的服务器并在 http 通信完成后立即关闭。
$ curl http://10.5.1.1/favicon.ico -o /dev/null
Run Code Online (Sandbox Code Playgroud)
为了更好地测试我的服务器的保持活动行为,我希望在多个 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<&-
Run Code Online (Sandbox Code Playgroud)
但是因为我的测试通信要复杂得多(包括身份验证等),我不想完全自己用 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<&-
Run Code Online (Sandbox Code Playgroud)
使用上述工具或其他工具是否可以做到这一点?
您正在寻找的工具是socat. 由于您正在测试单个 Web 服务器,您可以要求它与该服务器建立永久连接(只要它不选择关闭它——相应地调整您的超时),一旦完成,您可以使用作为隧道连接。以下是实现此目的的两种方法。
curl有一个--unix-socket选项,允许您通过 Unix 套接字发送 HTTP 请求和接收 HTTP 回复(谢谢,thrig,您的启发性评论)
你会像这样使用它:
socat TCP:10.5.1.1:80 UNIX-LISTEN:/tmp/curl.sock,fork
Run Code Online (Sandbox Code Playgroud)
然后,在另一个终端上:
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
...
Run Code Online (Sandbox Code Playgroud)
您还可以将隧道作为伪代理使用,wget, curl,... 将通过它连接。此解决方案的优点是不限于curl。
这次,socat侦听本地 TCP 端口(比如 3128):
socat TCP:10.5.1.1:80 TCP-LISTEN:3128,fork,reuseaddr
Run Code Online (Sandbox Code Playgroud)
然后,在另一个终端上:
export http_proxy='http://localhost:3128'
curl http://10.5.1.1/message.txt
wget http://10.5.1.1/message.txt
....
Run Code Online (Sandbox Code Playgroud)
请注意,由于 HTTP 客户端使用代理,因此 HTTP 请求将略有更改,这可能是不可取的。
当然,这两种解决方案都不打算与多个 HTTP 服务器一起使用,因为这是接收所有请求的通道末尾的 Web 服务器。
| 归档时间: |
|
| 查看次数: |
5662 次 |
| 最近记录: |