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的客户端,我称之为:
源代码可以在以下URL中find: http : //www.qxs.ch/2012/07/05/sftp-upload-tool/
因为我不是在libssh2编程方面经验丰富,我很高兴任何反馈到源代码。