gpt4 book ai didi

python - shell 不尊重解释器?

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:01 24 4
gpt4 key购买 nike

我下载了 Python 3.4 源代码,构建源代码,并将它们安装在 /usr/local 中。 make test 运行良好。

$ ls /usr/local/bin/ | grep python
python3
python3.4
python3.4-config
python3.4m
python3.4m-config
python3-config

我有一个尝试使用 SNI 的小脚本。 SNI 在 Python 中一直给我带来麻烦(回复:wrap_socket() got an unexpected keyword argument 'server_hostname'?),较新版本的 Python 应该可以修复它。脚本看起来像这样:

#!/usr/local/bin/python3

import sys, ssl, socket

s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2 = ssl.wrap_socket(s1,
ca_certs="./pki/signing-dss-cert.pem",
cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_TLSv1,
server_hostname="localhost")

s2.connect( ("localhost", 8443) )

s2.send("GET / ")
time.sleep(1)
s2.send("HTTP/1.1")

s2.send("\r\n")
time.sleep(1)
s2.send("Hostname: localhost")
s2.send("\r\n")
s2.send("\r\n")

当我尝试运行它时,我仍然收到该死的 TypeError: wrap_socket() got an unexpected keyword argument 'server_hostname' 错误。


编辑:我在下面尝试了 Lukas 的建议并将行更改为:

s2 = ssl.SSLContext.wrap_socket(s1,
ca_certs="./pki/signing-dss-cert.pem",
cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_TLSv1,
server_hostname="localhost")

现在,当我运行脚本时,我的鼠标指针(向左倾斜的箭头)变成十字线(加号),我可以在屏幕上拖动框。大约一分钟后,我收到以下错误:

$ ./fetch.sh
./fetch.sh: line 5: syntax error near unexpected token `('
./fetch.sh: line 5: `s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)'

在上述操作失败并且指针恢复正常后,我实际上在屏幕上有一张我在屏幕上绘制的框的屏幕截图图像。

我开始认为 Python 是一个令人头疼的问题,而且是在浪费时间。在尝试做一些简单的事情(例如在 SSL 中指定主机名)时,谁能证明两天的工作是合理的?

知道我这次做错了什么吗?

最佳答案

您在另一个问题中提到的补丁向方法 ssl.SSLContext.wrap_socket 添加了一个 server_hostname 参数.

您调用的函数是 ssl.wrap_socket但是,它不采用关键字参数 server_hostname


编辑:试试这个:

from ssl import CERT_NONE
from ssl import PROTOCOL_SSLv23
from ssl import SSLSocket
import ssl, socket
import time


s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

def wrap_socket_with_sni(sock, keyfile=None, certfile=None,
server_side=False, cert_reqs=CERT_NONE,
ssl_version=PROTOCOL_SSLv23, ca_certs=None,
do_handshake_on_connect=True,
suppress_ragged_eofs=True,
ciphers=None,
server_hostname=None):

return SSLSocket(sock=sock, keyfile=keyfile, certfile=certfile,
server_side=server_side, cert_reqs=cert_reqs,
ssl_version=ssl_version, ca_certs=ca_certs,
do_handshake_on_connect=do_handshake_on_connect,
suppress_ragged_eofs=suppress_ragged_eofs,
ciphers=ciphers, server_hostname=server_hostname)

s2 = wrap_socket_with_sni(s1,
ca_certs="./pki/signing-dss-cert.pem",
cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_TLSv1,
server_hostname="localhost")
# ...

我所做的只是复制 wrap_socket 辅助函数,使用 server_hostname 关键字参数扩展它,并将其传递给 SSLSocket它返回。

关于python - shell 不尊重解释器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22414631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com