我需要使用 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)'
这有效并相应地返回字符串“成功”或“失败”。我面临的问题是该openssl
命令在执行 GET 请求后不会终止,而是坐在那里等待更多输入。我相信这是由于隐式-ign_eof
阻止了由-quiet
选项引起的自动终止。我尝试使用该-no_ign_eof
选项,但这会导致openssl
命令在 GET 请求收到响应之前终止,因此如果使用该选项,我将无法获取响应的内容。
如何修改此命令,以便我可以通过标准输入传递 GET 请求(因为我想将其置于循环中,所以需要),但openssl
在每个请求后终止命令?
您真正应该做的是使用为获取 Web 资源而设计的工具,例如
curl
、wget
或 libwww-perl 的GET
命令。如果没有可用的东西,您应该让系统管理员安装适当的东西。有了这个...
该
openssl
命令不会终止,因为 Web 服务器没有关闭连接。请记住,默认情况下,HTTP 在每次请求后保持连接打开以作为性能优化。一个请求完成后,可以通过同一连接发送另一个请求,而不是关闭并重新打开一个新连接。
如果您想指示服务器关闭连接,则可以发送
Connection: close
HTTP 标头。另一个简单(但可能更糟)的解决方案是使用 HTTP/1.0 而不是 HTTP/1.1。
有一个新场景提出了之前在此线程中讨论的几个要点。
一个和curl有关,一个和tlsv1.3有关
首先,我使用 curl 并发现 curl 会将“#”解释为新 URL 的开始。我发现其他人使用其他特殊字符发现了与 curl 相同的问题。在这种情况下,URL 被截断并且 curl 失败。
标题
确切的问题是使用不一致的字符来扩展 URL 名称。Web 开发人员在“.html”之后添加数据。我的遭遇是与
---------.html#<date>
.输入时,curl 将截断 # 处的 URL。如果我对其进行编码
-------.html%23<date>
,然后通过浏览器将编码的 URL 粘贴到网站中,它会再次对编码的字符进行编码,结果是“找不到页面”。Web 开发人员正在将数据附加到 URL,因此无需在每次用户请求更改表格(通常是表格)时发送新网页,而是可以通过 JSON 发送表格数据而不是整个网页来更新网页。
我看不到卷曲很快就会改变。因此,如果要测试此类功能,则必须使用 OpenSSL 来调出 URL。我能够找到一个恰好在服务器路径中使用 # 的不安全网站。我使用 OpenSSL 对此进行了测试,并成功完成。
因此,可以得出结论,OpenSSL 不会将
'#'
URL 视为特殊字符。Curl 将输入解析为 HTML,其中'#'
是与 HTML 锚点相关的特殊字符。第二个问题与最初的主题有些相关,是在 tlsv1.3 中使用同样的 OpenSSL 技术。OpenSSL 没有报告错误,但它在第二个“读取 R 块”之后停止。