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
在每次请求后都会终止该命令?
你真正应该做的使用专为抓取Web资源,如工具curl
,wget
或libwww的-Perl的GET
命令。如果没有可用的东西,您应该让您的系统管理员安装适当的东西。
有了这个...
该openssl
命令不会终止,因为 Web 服务器没有关闭连接。
请记住,作为性能优化,默认情况下 HTTP 在每个请求后保持连接打开。一旦一个请求完成,另一个请求可以通过同一个连接发送,而不是关闭和重新打开一个新连接。
如果您想指示服务器关闭连接,您可以发送Connection: close
HTTP 标头。