Bash

如何使用 openssl 從 HTTP GET 請求中獲取結果?

  • July 19, 2021

我需要使用 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 資源而設計的工具,例如curlwget或 libwww-perl 的GET命令。如果沒有可用的東西,您應該讓系統管理員安裝適當的東西。

有了這個…

openssl命令不會終止,因為 Web 伺服器沒有關閉連接。

請記住,預設情況下,HTTP 在每次請求後保持連接打開以作為性能優化。一個請求完成後,可以通過同一連接發送另一個請求,而不是關閉並重新打開一個新連接。

如果您想指示伺服器關閉連接,則可以發送Connection: closeHTTP 標頭。

引用自:https://serverfault.com/questions/731232