Bash
如何使用 openssl 從 HTTP GET 請求中獲取結果?
我需要使用 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 標頭。