如何使用 openssl 从 HTTP GET 请求中获取结果?

con*_*fin 9 scripting bash openssl shell-scripting

我需要使用 openssl 在 shell 脚本中执行一些 HTTP GET 请求。我现在用来执行此操作的行如下所示。这是解析以下格式的 XML 响应的内容。

<Result>success</Result>

<Result>failure</Result>

echo -e "GET /test HTTP/1.1\r\nHost:$(hostname)\r\n\r\n" | openssl 2>&1 s_client -quiet -connect server-url:443 | grep -o -P --color '(?<=Result\>).*(?=\</Result)'
Run Code Online (Sandbox Code Playgroud)

这有效并相应地返回字符串“成功”或“失败”。我面临的问题是该openssl命令在执行 GET 请求后不会终止,而是坐在那里等待更多输入。我相信这是由于隐式的-ign_eof,它阻止了由-quiet选项引起的自动终止。我已经尝试使用该-no_ign_eof选项,但这会导致openssl命令在 GET 请求收到响应之前终止,因此如果我使用它,我将无法获取响应的内容。

如何修改此命令,以便我可以通过 stdin 传递 GET 请求(因为我想将其放入循环中是必需的),但openssl在每次请求后都会终止该命令?

Mic*_*ton 6

真正应该做的使用专为抓取Web资源,如工具curlwget或libwww的-Perl的GET命令。如果没有可用的东西,您应该让您的系统管理员安装适当的东西。

有了这个...

openssl命令不会终止,因为 Web 服务器没有关闭连接。

请记住,作为性能优化,默认情况下 HTTP 在每个请求后保持连接打开。一旦一个请求完成,另一个请求可以通过同一个连接发送,而不是关闭和重新打开一个新连接。

如果您想指示服务器关闭连接,您可以发送Connection: closeHTTP 标头。

  • 作为_技术_问题,安装这些工具非常容易。我希望你的障碍完全是_政治_性质的。 (2认同)
  • 请记住,并提醒任何有能力倾听的人,像这样的解决方法最终会_花费_金钱。 (2认同)