连接到现有SFTP服务器,而不是启动新的SFTP子进程

时间:2017-02-07 18:08:41

标签: ssh port sftp

我正在考虑编写一个新的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中将通道连接到它。这样我可以为所有客户端提供一个服务器进程,这就是我想要的第一个。

1 个答案:

答案 0 :(得分:2)

  

为每个会话启动当前的SFTP服务器。

"当前的SFTP服务器" 是什么意思?具体是哪一个?

OpenSSH(作为最广泛使用的SSH / SFTP服务器)确实为每个SFTP会话打开了一个新的子进程。而且几乎没有任何问题。虽然最近的版本不再适用了。使用(新)默认配置,使用进程内SFTP服务器(也称为internal-sftp)。

请参阅OpenSSH: Difference between internal-sftp and sftp-server

如果你真的想得到问题的答案,你必须告诉我们你的问题是什么SFTP / SSH服务器。

如果确实是关于OpenSSH的话:

  • 没有什么需要做,功能已经存在。
  • 如果您想添加自己的实现,则必须修改OpenSSH代码,无法将其插入。只需检查internal-sftp的实现方式。
  • 另一种方式是使用代理体系结构,正如您自己建议的那样。如果您想采用这种方法并需要一些帮助,您应该询问有关进程间通信和/或共享文件描述符的更具体问题,而不是SFTP。