首页 > 解决方案 > Paramiko SSH start_server 函数引发 EOF 错误?

问题描述

我正在尝试使用 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返回,EOFError而是返回SSHException相同的ServerInterface类文档没有提到这个错误类型,只提到它对socket()我来说似乎很好,它绑定到一个没有错误的端口。Paramiko 版本2.7.2安装在 python 虚拟环境中。

标签: pythonpython-3.xnetworkingsshparamiko

解决方案


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

接受来自客户端的连接,并围绕该连接创建传输。

引用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)

推荐阅读