get - 如何获得使用popen传递的“GET /”请求的响应与底层openssl通信
问题描述
我是子进程模块的新手 - 在这种情况下,我想使用 openssl 命令连接安全服务器 url(例如:wikipedia),我可以连接网络服务器并且握手成功。
但是在请求 GET / 或 HEAD 请求时,我无法接收或处理输出。
获得的输出:
SSL 握手已读取 3708 字节并写入 405 字节 验证:OK 新,TLSv1.3,密码为 TLS_AES_256_GCM_SHA384 服务器公钥为 256 位 不支持安全重新协商 压缩:NONE 扩展:NONE 未协商 ALPN 未发送早期数据 验证返回码:0(好)
import time
import subprocess
cmd ="C:\\cygwin64\\bin\\openssl.exe s_client -connect wikipedia.org:443"
popen = subprocess.Popen(cmd,stdin=subprocess.PIPE,universal_newlines=True,stdout=subprocess.PIPE,,stderr=subprocess.PIPE)
input1 = "echo -en HEAD / HTTP/1.1\r\nHost: www.wikipedia.org\r\n\r\n"
(test_stdout,test_stderr)= popen.communicate(input=input1)
popen.wait()
print(test_stdout)
print(f"return value of popen %r "% popen.returncode)
popen.terminate()
使用 openssl -quiet 或 -ign_eof 更新代码:
cmd1 ="C:\\cygwin64\\bin\\openssl.exe s_client -connect www.wikipedia.org:443 -servername www.wikipedia.org -ign_eof"
popen = subprocess.Popen(cmd3,stdin=subprocess.PIPE,universal_newlines=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
input1 ="echo HEAD / HTTP /1.1\r\nHost: www.wikipedia.org\r\n"
print(input1)
(test_stdout,test_stderr)= popen.communicate(input=input1)
print("value of popen")
print(test_stdout)
print(f"return value of popen %r "% popen.returncode)
popen.terminate()
请找到不同的结果:1/左 - Py charm 的结果
2/右 - 在 openssl s_client 命令中执行的结果
解决方案
据我所知,该脚本没问题,并且做了它应该做的事情:
它为您提供服务器密码和 TLS 配置。
但是从您的文本来看,您想要做的是不同的事情:
您想要发送一些 HTTP 请求并显示它们的响应。
为此,您必须将您的替换cmd
为 some curl https://www.wikipedia.org
orwget -O- https://www.wikipedia.org
并将其输入您的subprocess.Popen命令,而不是openssl cmd。
推荐阅读
- php - 在 Wordpress 中集成 REST API
- arrays - WHERE IN 作为 Postgres 中的子查询
- r - 如何从闪亮应用程序中的 ggplot 中删除 NA 值?
- c++ - 如何将 wstringstream 和 getline 与 wchar_t 一起使用?
- android - Android Studio Build 后生成的代码保留在 build 文件夹中
- asp.net - IIS 上的自定义静态文件
- laravel - Laravel 在任何页面上显示“请验证您的电话号码”通知直到验证
- batch-file - 从 Windows 使用 emacsclient 打开文件
- reactjs - 如何在 react native 中使用 snowpack
- python - 在下拉列表中显示组名