1

我正在实现一个 SFTP 服务器,使用https://github.com/rspivak/sftpserver作为参考。推出我自己的解决方案的原因是自定义身份验证方案和特殊的 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 个同时连接,每个连接每隔一段时间推送一次数据。我该如何做到这一点?

4

3 回答 3

3

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

于 2016-07-13T20:36:49.077 回答
1

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

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

我开始推出自己的解决方案,只是意识到只需重新关注我真正需要的东西就可以更容易地做到这一点。因此,尽管这不能直接回答问题,但我认为在此处添加对我的解决方案的引用可能对其他任何以这种方式绊倒的人有用。

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

使用此解决方案,设置套接字连接、身份验证/密钥交换等的所有 ^繁重的工作,以及我的 sftp 服务器将只执行协议命令。请注意,这种区别是可能的,因为 sftp 只是一个“子系统”,ssh 服务器进程通过“实现”子系统的命令的标准输入/标准输出与它通信(参考:http ://docstore.mik.ua/orelly/网络_2ndEd/ssh/ch05_07.htm )

因此,要以一种非常全面的方式回答最初的问题——如果您有兴趣简单地为某些东西(在这种情况下为 chroot'd 文件系统)提供类似 sftp 的接口,您甚至不必担心处理多个同时的 sftp 连接——让 opensshd 为你做这件事。只需扩展 paramiko 工具来实现您的自定义 sftp 实例,独立于传输和通道。

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

于 2014-07-21T10:19:28.680 回答
0

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

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

于 2012-06-08T17:16:36.717 回答