处理多个同时的SFTP连接

时间:2012-06-08 15:33:19

标签: python sftp paramiko

我正在使用https://github.com/rspivak/sftpserver作为参考来实现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个同时连接,每个连接每隔一次推送数据。我该如何做到这一点?

3 个答案:

答案 0 :(得分:3)

以防任何人在python中需要简单的多线程sftp服务器:问题中提到的基于paramiko的sftpserver模块可以很容易地转换为多线程版本。以下是一个示例:https://gist.github.com/Girgitt/2df036f9e26dba1baaddf4c5845a20a2

答案 1 :(得分:1)

我知道这是一个旧线程,当我遇到类似的要求时,我早些时候遇到过这个问题。虽然,我真的不想实现整个sftp服务器,但我已经开始使用paramiko来做到这一点。

我想要的是提供sftp访问文件系统的抽象,实际上是由一个定义明确的api提供的。

我开始编写自己的解决方案,只是意识到只需重新调整我实际需要的内容就可以轻松完成。所以,虽然这不能直接回答这个问题,但我认为在这里添加对我的解决方案的引用对于那些偶然发现这种方式的人来说可能是有用的。

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

使用此解决方案,设置套接字连接,身份验证/密钥交换等以及我的sftp服务器的所有重要提升都将实现协议命令。请注意,这种区别是可能的,因为sftp只是ssh服务器进程通过“实现”子系统的命令的stdin / stdout进行通信的“子系统”(参考:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch05_07.htm

所以,以一种非常圆的方式回答原始问题 - 如果你只想提供一个像接口这样的sftp(在这种情况下是chroot'd文件系统),你甚至不必担心处理多个同时发生的sftp连接 - 让opensshd为你做这件事。只需扩展paramiko工具即可实现自定义sftp实例,而与传输和通道无关。

以防这是有意义的,这是我的方法的要点:https://gist.github.com/lonetwin/3b5982cf88c598c0e169

答案 2 :(得分:0)

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

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