我正在考虑编写一个新的SFTP服务器。每个会话都会启动当前的SFTP服务器。如果有三个SFTP用户,则有三个SFTP服务器。那不是我想要的。我想要一个连接每个新SFTP会话的服务器。怎么做?
当您登录服务器以启动SFTP会话时,将启动SSH进程并启动SFTP子系统。 SSH进程负责加密等.io通过SFTP进程的标准端口0,1和2(stdin,stdout和stderr)完成。
当每个会话都有专用的SFTP进程时,这一切都有效。但是,当我想要连接到一个SFTP服务器时,如何使其工作。通过“ssh-to-sftp-connect-agent”?
更多信息:
我想使用sftp版本6,它比openssh使用的版本3更好。 openssh社区不想升级他们的sftp实现:
https://bugzilla.mindrot.org/show_bug.cgi?id=1953
一个非常好的开源sftp服务器位于:
http://www.greenend.org.uk/rjk/sftpserver/
非常有用的概述:
http://www.greenend.org.uk/rjk/sftp/sftpversions.html
这个服务器我们使用sftp协议版本6,但有(b)锁定和处理acl未实现。实现这些共享表对于所有打开的文件都是必需的,这些文件具有访问标志和阻止模式,由谁(b)锁定工作。每次sftp会话都会导致另一个进程:
Subsystem sftp /usr/libexec/gesftpserver
(当你想使用任何高于3的协议时,这是不可避免的) 然后共享数据库是处理锁和acl的解决方案。 另一个解决方案是每个新的sftp会话连接到一个现有的“超级”sftp服务器,该服务器在启动时启动。同时访问,锁定等更容易编程。
如何使用此行:
Subsystem sftp /usr/libexec/exampleconnectagent
在理想情况下,代理启用连接的专用ssh进程与sftp-server之间的连接,并终止。 长话,这可能吗?我是否必须使用此处描述的fd的传递:
Can I share a file descriptor to another process on linux or are they local to the process?
提前致谢。
此外: 我正在研究sftp文件服务器列表到服务器套接字。客户端可以使用direct-streamlocal功能连接,以便在openssh中将通道连接到它。这样我可以为所有客户端提供一个服务器进程,这就是我想要的第一个。
答案 0 :(得分:2)
为每个会话启动当前的SFTP服务器。
"当前的SFTP服务器" 是什么意思?具体是哪一个?
OpenSSH(作为最广泛使用的SSH / SFTP服务器)确实为每个SFTP会话打开了一个新的子进程。而且几乎没有任何问题。虽然最近的版本不再适用了。使用(新)默认配置,使用进程内SFTP服务器(也称为internal-sftp
)。
请参阅OpenSSH: Difference between internal-sftp and sftp-server。
如果你真的想得到问题的答案,你必须告诉我们你的问题是什么SFTP / SSH服务器。
如果确实是关于OpenSSH的话:
internal-sftp
的实现方式。