如何使用 bash 网络重定向将 http 请求发送到带有路径的 URL?

如何使用 bash 网络重定向将 http 请求发送到带有路径的 URL?

使用 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 连接)(例如socatopenssl s_client),这几乎是不可能的,然后就可以了没有理由不使用专门用于发出 HTTP(S) 请求的工具,例如curlwget、、、...perlLWPelinksw3mlynx

相关内容