使用 bash 网络重定向,我可以向任何服务器发送简单的 get 消息,如下所示:
:> /dev/tcp/localhost/3306
然而,我想做一些更复杂的事情,即将请求发送到带有路径的 URL。我尝试了以下方法:
:> /dev/tcp/url/50070/webhdfs/v1/user/user_name/new_file?user.name=user_name&op=READ
哪个抛出:
[1] 69
root@9ec4a825d97d:/# *bash: 50070/webhdfs/v1/user/user_name/new_file?user.name=user_name: Servname not supported for ai_socktype
bash: /dev/tcp/url/50070/webhdfs/v1/user/user_name/new_file?user.name=user_name: Invalid argument
如果 URL(包含&
)被引用,情况也是如此。
如果可能的话,如何使用 bash net 重定向向带有路径的 URL 发送请求?
答案1
在bash
(就像该功能最初来自的 ksh 中),打开/dev/tcp/host/port
创建并连接 TCP 套接字。
您可以在此之上发送 HTTP 请求,但您必须手动将其写入 HTTP 协议,例如:
exec 3<> /dev/tcp/host/port # connected TCP socket on fd 3
printf >&3 '%s\r\n' 'GET /some/path?query HTTP/1.0' \
'Host: host' \
'Connection: close' \
''
cat <&3 # read the response
exec 3<&- # close the connection
或者zsh
等价的:
zmodload zsh/net/tcp
ztcp -d3 host port
printf >&3 '%s\r\n' 'GET /some/path?query HTTP/1.0' \
'Host: host' \
'Connection: close' \
''
cat <&3 # read the response
ztcp -c 3 # close the connection
请注意,这是没有加密的 HTTP,因此只有文本,这相对容易。要执行 HTTPS,您需要在 TLS 协议中写入二进制数据,如果不使用专用工具(它们能够以更好的方式自行创建 TCP 连接)(例如socat
或openssl s_client
),这几乎是不可能的,然后就可以了没有理由不使用专门用于发出 HTTP(S) 请求的工具,例如curl
、wget
、、、...perl
LWP
elinks
w3m
lynx