Paramiko SSH start_server 函数引发 EOF 错误?

Paramiko SSH start_server function raising EOF error?

我正在尝试使用 paramiko 实现 SSH 服务器,但我一直收到 EOFError,我不知道为什么

class Ctx(paramiko.ServerInterface):
    def check_auth_password(self, username, password):
        if password == "1999":
            return paramiko.AUTH_SUCCESSFUL
        else:
            print("[+] Wrong Password...")
            return paramiko.AUTH_FAILED        
    def create_socket():
        sock = socket.socket()
        return sock
ctx = Ctx()
sock = Ctx.create_socket()
sock.bind(("127.0.0.1", 5555))
server = paramiko.Transport(sock)
server.start_server(server=ctx)

错误是由 start_server 引起的,我不明白为什么。追溯是

Traceback (most recent call last):
  File "test.py", line 26, in <module>
    server.start_server(server=ctx)
  File "/home/khaled/Documents/materials/python/env/lib/python3.8/site-packages/paramiko/transport.py", line 728, in start_server
    raise e
  File "/home/khaled/Documents/materials/python/env/lib/python3.8/site-packages/paramiko/transport.py", line 2034, in run
    self.packetizer.write_all(b(self.local_version + "\r\n"))
  File "/home/khaled/Documents/materials/python/env/lib/python3.8/site-packages/paramiko/packet.py", line 367, in write_all
    raise EOFError()
EOFError

文档没有显示 start_server return EOFError 而是 return SSHException ServerInterface class ] 文档没有提到这个错误类型,只在 socket() 中提到它,这对我来说似乎很好,它绑定到一个没有错误的端口。 Paramiko 版本 2.7.2 安装在 python 虚拟环境中。

您不能围绕绑定套接字本身创建传输。

接受来自客户端的连接,并围绕 .

创建传输

引用https://github.com/paramiko/paramiko/blob/master/demos/demo_server.py,为简单起见删除了异常处理并添加了一些解释性注释--

# first, we create our listening socket
# but we don't actually wrap it in a transport yet!
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("", 2200))

# next, tell the socket to start listening
# here, we're allowing up to a 100-connection backlog; tune to taste
sock.listen(100)

# here, we're blocking until a client actually connects
print("Listening for connection ...")
client, addr = sock.accept()

# only now, after we have a client, can we create a transport
print("Got a connection!")
t = paramiko.Transport(client, gss_kex=DoGSSAPIKeyExchange)