Python 同时处理多个SFTP连接

Python 同时处理多个SFTP连接,python,sftp,paramiko,Python,Sftp,Paramiko,我正在实现一个SFTP服务器,用作参考。推出我自己的解决方案的原因是自定义身份验证方案和特殊的chrooting和黑/白名单标准 我现在的问题是一次处理多个连接。我当前的循环如下所示: # Wait for a connection conn, addr = server_socket.accept() # Open a transport for this connection tr = Transport(conn) # Load our private host key key = R

我正在实现一个SFTP服务器,用作参考。推出我自己的解决方案的原因是自定义身份验证方案和特殊的chrooting和黑/白名单标准

我现在的问题是一次处理多个连接。我当前的循环如下所示:

# Wait for a connection
conn, addr = server_socket.accept()

# Open a transport for this connection
tr = Transport(conn)

# Load our private host key
key = RSAKey.from_private_key_file("sftp.key")
tr.add_server_key(key)

# Tell server to support SFTP
tr.set_subsystem_handler("sftp", SFTPServer, sftp.ChrootedSFTP)

# Start a SSH server for this connection and serv it
server = auth.ChrootedAuthServer(db_factory, "/path/to/chroot")
tr.start_server(server=server)

# Wait for client to establish SSH connection
ch = tr.accept()
我的解决方案不一定非得非常快。能够同时处理大约10个连接,每个连接每隔一段时间推送一次数据。如何实现这一点?

您可以使用子进程或线程模块为客户机连接的每个实例生成单独的进程,其中主循环负责管理线程

您可以通过实例化一个连接并一直等待客户端连接来实现这一点,当这种情况发生时,您可以打开一个子流程,将连接的处理程序传递到子进程,然后为新连接创建一个新的处理程序。

您可以使用子进程或线程模块为客户端连接的每个实例生成一个单独的进程,其中主循环负责管理线程


您可以通过实例化一个连接并一直等待客户端连接来实现这一点,当这种情况发生时,您可以打开一个子流程,将连接的处理程序传递到子流程,然后为新连接创建一个新的处理程序。

我知道这是一个旧线程,我在前面遇到一个稍微类似的需求时遇到了这个问题。虽然我并不真的想实现整个sftp服务器,但我从paramiko开始就是为了实现这一点

实际上,我想要的是提供对文件系统抽象的sftp访问,该文件系统实际上是由定义良好的api提供的

我开始滚动我自己的解决方案,但我意识到,只要重新关注我真正需要的东西,就可以更容易地做到这一点。因此,虽然这并不能直接回答问题,但我认为在这里为我的解决方案添加一个参考可能会对其他遇到这种情况的人有所帮助

我的解决方案是混合使用openssh和paramiko

使用此解决方案,所有设置套接字连接、身份验证/密钥交换等的繁重工作以及我的sftp服务器都将只实现协议命令。注意,这种区别是可能的,因为sftp只是一个“子系统”,ssh服务器进程通过“实现”子系统ref的命令的stdin/stdout与之通信:

因此,要以一种非常全面的方式回答最初的问题——如果您对简单地为chroot文件系统提供类似于sftp的接口感兴趣,在这种情况下,您甚至不必担心处理多个同步的sftp连接——让opensshd为您做到这一点。只需扩展paramiko设施即可实现自定义sftp实例,而不依赖于传输和通道


为了以防万一,这里是我方法的要点:

我知道这是一个旧线程,我在前面遇到一个稍微类似的需求时遇到了这个问题。虽然我并不真的想实现整个sftp服务器,但我从paramiko开始就是为了实现这一点

实际上,我想要的是提供对文件系统抽象的sftp访问,该文件系统实际上是由定义良好的api提供的

我开始滚动我自己的解决方案,但我意识到,只要重新关注我真正需要的东西,就可以更容易地做到这一点。因此,虽然这并不能直接回答问题,但我认为在这里为我的解决方案添加一个参考可能会对其他遇到这种情况的人有所帮助

我的解决方案是混合使用openssh和paramiko

使用此解决方案,所有设置套接字连接、身份验证/密钥交换等的繁重工作以及我的sftp服务器都将只实现协议命令。注意,这种区别是可能的,因为sftp只是一个“子系统”,ssh服务器进程通过“实现”子系统ref的命令的stdin/stdout与之通信:

因此,要以一种非常全面的方式回答最初的问题——如果您对简单地为chroot文件系统提供类似于sftp的接口感兴趣,在这种情况下,您甚至不必担心处理多个同步的sftp连接——让opensshd为您做到这一点。只需扩展paramiko设施即可实现自定义sftp实例,而不依赖于传输和通道


为了以防万一,我的方法的要点如下:

以防任何人可能需要python中简单的多线程sftp服务器:问题中提到的基于paramiko的sftpserver模块可以很容易地转换为多线程版本。下面是一个示例:

以防任何人需要python中简单的多线程sftp服务器:问题中提到的基于paramiko的sftpserver模块可以非常容易地转换 ted为多线程版本。以下是一个例子: