如何将数据传输到sftp连接?

ftp支持put "|..." "remote-file.name"命令来pipe理数据到一个ftp连接。 有什么类似的可用于SFTP

在sftp我得到以下错误:

 sftp 'jmw@backupsrv:/uploads' sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz" stat | tar -cv /storage: No such file or directory 

如上所述,sftp客户端显然不执行该命令。

我想使用pipe道命令直接将文件streamredirect到SFTP。 (因为在上传到sftp服务器之前没有足够的空间在同一磁盘上创build备份文件。)

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' 如果你的远程用户有一个有效的shell, output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command'是一个选项。

我find了解决这个问题的很多乐趣。 它需要两台机器上的工具nc(netcat)和SSH(不需要SFTP)。

在这个例子中,我将调用具有需要备份linux-a的数据的机器以及需要接收备份linux-b的机器。

在linux-a上,让netcat监听一个端口(我花了2000)并将其redirect到一个文件。 这只会坐在那里,等到那个港口发生什么事情。

 [kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz 

在linux-b上,打开一个到linux-a的ssh隧道,我又用了2000端口。 这将把你在本地主机上的TCP端口2000上抛出的任何东西都redirect到linux-a上的TCP端口2000,在那里netcat正在监听。

 [kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b 

现在创buildtar归档文件,但将输出发送到标准输出(使用 – )并将其pipe道压缩到gzip。 现在pipe道到另一个netcat发送到端口2000上的TCP本地主机。

 [kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000 

我们完成了! 在linux-b上,netcat不再监听,并创build一个新文件。 最好的部分是tar档案从未放在linux-a的硬盘上。

 [kenny@linux-b /var/backups]$ file backup.tgz backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul 5 13:48:03 2012 

我知道这不是你在问题中所要求的,但如果你有netcat可用,它是一个可行的解决scheme,你的types的问题。

编辑:我忘了一件事:如果你按照这些说明,你仍然会有一个SSH隧道漂浮在linux-a上。 找出进程ID是什么,并杀死它。

 [kenny@linux-a /var/data]$ ps -ef | grep "ssh -L" kenny 5741 1 0 13:40 ? 00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b kenny 5940 3360 0 14:13 pts/1 00:00:00 grep --color=auto ssh -L [kenny@linux-a /var/data]$ kill 5741 

voretaq7指出,sftp客户端不支持为用户传输数据,允许使用sftp连接服务器。

幸运的是,有libssh2,支持sftp。 所以我们只需要另外两个使用libssh2的客户端,我称之为:

  • sftp_stdin_upload(上传到sftp服务器)
  • sftp_stdout_download(从sftp服务器下载)

源代码可以在以下URL中find: http : //www.qxs.ch/2012/07/05/sftp-upload-tool/


因为我不是在libssh2编程方面经验丰富,我很高兴任何反馈到源代码。