ftp 支持将put "|..." "remote-file.name"
数据通过管道传输到 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 命令直接将文件流重定向到 sftp。(因为在将其上传到 sftp 服务器之前,没有足够的空间在同一磁盘上创建备份文件。)
由于这是您通过谷歌搜索此问题找到的第一个结果,并且尚未提及,我还将添加我在此处找到的解决方案:
您可以为此使用 curls sftp 实现。由于 curl 可能已经安装在许多系统上,因此这可能比使用自定义客户端的解决方案更受欢迎。
用法示例:
curl
使用您的.ssh/known_hosts
文件进行密钥验证。如果您的 ssh 客户端确实使用了 curl 中使用的库不支持的较新加密标准,这可能会失败要解决此问题,您可以使用以下命令将其他密钥类型添加到已知主机文件中:
或者您可以使用标志禁用密钥验证
-k
(不过我不建议这样做)找出解决这个问题的方法让我很开心。它需要两台机器上的工具 nc (netcat) 和 SSH(不需要 SFTP)。
在这个例子中,我将拥有需要备份数据的机器称为linux-a,需要接收备份的机器称为linux-b。
在 linux-a 上,让 netcat 监听一个端口(我用了 2000)并将它重定向到一个文件。这将只是坐在那里等待,直到该端口上有东西通过。
在 linux-b 上,打开一个到 linux-a 的 ssh 隧道,我又使用了 2000 端口。这会将您在本地主机上的 TCP 端口 2000 上抛出的任何内容重定向到 linux-a 上的 TCP 端口 2000,netcat 正在侦听。
现在创建 tar 存档,但将输出发送到 stdout(使用 -)并将其通过管道传输到 gzip 以进行一些压缩。现在将其通过管道传输到另一个 netcat,该 netcat 将其发送到端口 2000 上 TCP 上的本地主机。
我们完成了!在 linux-b 上,netcat 不再监听,并创建了一个新文件。最好的部分是 tar 存档从未放在 linux-a 的硬盘上。
我知道这不完全是您在问题中要求的,但是如果您有可用的 netcat,那么它是解决您的问题类型的可行方法。
编辑:我忘记了一件事:如果您按照这些说明进行操作,您仍然会有一个在 linux-a 上浮动的 SSH 隧道。找出进程 ID 并杀死它。
output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command'
是一个选项,如果您的远程用户有一个有效的 shell。voretaq7指出,sftp 客户端不支持用户的管道数据传输,允许使用 sftp 仅连接到服务器。
幸运的是,有支持 sftp 的 libssh2。所以我们只需要另外 2 个使用 libssh2 的客户端,我称之为:
源代码可以在以下网址找到: http ://www.qxs.ch/2012/07/05/sftp-upload-tool/
由于我在 libssh2 编程方面经验不足,因此我很高兴收到对源代码的任何反馈。