AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 731232
Accepted
conorgriffin
conorgriffin
Asked: 2015-10-24 08:08:10 +0800 CST2015-10-24 08:08:10 +0800 CST 2015-10-24 08:08:10 +0800 CST

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

  • 772

我需要使用 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在每个请求后终止命令?

bash
  • 3 3 个回答
  • 21061 Views

3 个回答

  • Voted
  1. Best Answer
    Michael Hampton
    2015-10-24T08:43:13+08:002015-10-24T08:43:13+08:00

    您真正应该做的是使用为获取 Web 资源而设计的工具,例如curl、wget或 libwww-perl 的GET命令。如果没有可用的东西,您应该让系统管理员安装适当的东西。

    有了这个...

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

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

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

    • 6
  2. JepZ
    2018-10-31T08:59:46+08:002018-10-31T08:59:46+08:00

    另一个简单(但可能更糟)的解决方案是使用 HTTP/1.0 而不是 HTTP/1.1。

    • 0
  3. PJAL
    2021-07-11T16:49:50+08:002021-07-11T16:49:50+08:00

    有一个新场景提出了之前在此线程中讨论的几个要点。
    一个和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 对此进行了测试,并成功完成。

    echo -e "GET /#/Methods HTTP/1.1\r\nHost: eu.httpbin.org\r\nConnection: Close\r\n\r\n" | openssl s_client -quiet -state -connect eu.httpbin.org:443
    

    因此,可以得出结论,OpenSSL 不会将'#'URL 视为特殊字符。Curl 将输入解析为 HTML,其中'#'是与 HTML 锚点相关的特殊字符。

    第二个问题与最初的主题有些相关,是在 tlsv1.3 中使用同样的 OpenSSL 技术。OpenSSL 没有报告错误,但它在第二个“读取 R 块”之后停止。

    echo -e "GET / HTTP/1.1\r\nHost: cmegroup.com\r\nConnection: Close\r\n\r\n" | openssl 2>&1 s_client -CAfile firefoxCertBundle.pem -cert privClientCrt.pem -key privClient.key -tls1_3 -ciphersuites TLS_AES_256_GCM_SHA384 -quiet -state -connect cmegroup.com:443
    
        SSL_connect:before SSL initialization
        SSL_connect:SSLv3/TLS write client hello
        SSL_connect:SSLv3/TLS write client hello
        SSL_connect:SSLv3/TLS read server hello
        SSL_connect:TLSv1.3 read encrypted extensions
        depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global 
        Root CA
        verify return:1
        depth=1 C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
        verify return:1
        depth=0 C = US, ST = Illinois, L = Chicago, O = Chicago Mercantile Exchange Inc, 
        CN = www.cmegroup.com
        verify return:1
        SSL_connect:SSLv3/TLS read server certificate
        SSL_connect:TLSv1.3 read server certificate verify
        SSL_connect:SSLv3/TLS read finished
        SSL_connect:SSLv3/TLS write change cipher spec
        SSL_connect:SSLv3/TLS write finished
        SSL_connect:SSL negotiation finished successfully
        SSL_connect:SSL negotiation finished successfully
        SSL_connect:SSLv3/TLS read server session ticket
        SSL_connect:SSL negotiation finished successfully
        SSL_connect:SSL negotiation finished successfully
        SSL_connect:SSLv3/TLS read server session ticket
    
    • -1

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • crontab ifconfig 什么都不输出

  • 使用命令行工具按排序顺序计算重复项

  • 是否有 bash 等效于 ruby​​ 的“一些内容#{foo}”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve