通过SFTP / SSH接收文件,并自动转发到另一台服务器上的FTP

时间:2011-05-01 16:40:20

标签: ftp sftp

我目前处于从客户端通过FTP接收平面文件的情况。一些客户坚持需要使用SSH私钥SFTP而不是常规FTP。

我想要做的是设置一个Web服务器(最好是linux / unix,但我想我可以在Windows服务器上运行并购买SFTP服务器软件),它将执行以下操作:

  1. 允许我为每个具有唯一用户/通道的客户端设置SFTP目录。每个目录还必须有公共/私人密钥SSH“东西”我对此有点新,但我用谷歌搜索了它。

  2. 一旦客户端完全上传文件,我想通过常规FTP启动ftp该文件到我的Windows云的事件。

  3. 这些文件最多可达10mb,因此在文件完全上传之前,其他服务器的ftp都无法触发。

  4. 有没有人设置这样的东西?任何指导都将不胜感激。

    谢谢!

4 个答案:

答案 0 :(得分:5)

在Linux中,您可以使用incron来监视文件将被SFTP指定的目录,并让它触发您的ftp作业。它有点像cron,除了基于时间触发作业而不是基于文件系统修改。为了只在整个文件写入后触发,我认为你可以在inotify掩码中使用IN_CLOSE_WRITE。如果不这样做,我建议单独为每个事件配置事件,以将消息回显给日志文件,看看是否可以识别仅在SFTP传输结束时可靠发生的事件。

如果您使用的是RedHat,则它不在标准版本中,但它位于EPEL

答案 1 :(得分:4)

在Windows上,您可以使用Titan FTP Server Enterprise Edition,它支持SFTP,并允许您定义各种类型的事件。触发事件后,您可以按每个文件夹/每个帐户启动所需的任何内容。

PS。 AFAIK,在SFTP方面,它是密码认证或公钥认证(SSH密钥),但不是两者。

答案 2 :(得分:3)

在UNIX服务器中,您可以将SSH配置为使用自定义sftp服务器,而不是自己处理SFTP协议,使用密码身份验证打开与Windows SFTP服务器的新SSH连接,并在那里转发SFTP流量。

使用正确的工具编写代理很容易,例如,在Perl中使用Net::OpenSSH模块:

#!/usr/bin/perl
# this is the sftp-proxy-server

use Net::OpenSSH;
my $ssh = Net::OpenSSH->new($windows_server, $user, $passwd);
$ssh->system({ssh_opts => '-s'}, 'sftp');
$ssh->error and die $ssh->error;

您可以指示SSH服务器使用备用SFTP服务器更改/etc/ssh/sshd_config中的配置。例如:

Subsystem sftp /usr/local/bin/sftp-proxy-server

答案 3 :(得分:2)

您是否尝试过apache FTP Serveur?

我认为你可以使用ftplet API做你需要的。

见: http://mina.apache.org/ftpserver-project/index.html