Ste*_*n D 21 ssh file-transfer
这是情况:
我想做的是在客户端 A 仍在上传时开始从服务器到客户端 B 的传输。
完成这项工作的最佳方法/工具是什么?
更新:
到目前为止的答案很有趣——我一定会阅读并测试它们。不依赖于控制客户端 A 如何上传文件的答案的奖励积分。(即,我们从客户端 A 知道的唯一事情是文件正在写入已知文件名。)
Dav*_*ett 10
对于单个文件而不是使用 SFTP,您可以使用cat或pv在发送端通过 sshtee传输文件,并在中间服务器上使用将数据发送到那里的文件并通过另一个 ssh 链接发送副本,其中另一端只是将数据写入文件。确切的伏都教要求我将留给读者作为练习,因为我现在没有时间玩(抱歉)。此方法仅适用于第二个目的地可通过 SSH 公开访问的情况,这可能不是您将其描述为客户端计算机的情况。
另一种方法,它不是“运行和等待”,但可能更容易,它rsync在服务器和客户端 B 之间使用。第一次运行它可能会得到数据的部分副本,但你可以重新运行之后获取更多数据(在 Client1->Server 传输完成后进行最后一次运行)。这仅在服务器在 SFTP 传输期间将数据直接放入正确的文件名时才有效(有时您会看到数据进入一个临时文件,一旦文件完全传输,该文件将被重命名 - 这样做是为了使文件更新更具原子性,但会使 rsync 想法无法使用)。您还可以将 rsync 用于 C1->S 传输而不是 scp(如果您使用--inplace避免上述问题的选项) - 如果 C1-> 服务器连接在大型传输期间遇到问题,使用 rsync 还可以保护您无需重新发送所有内容(rsync --inplace -a --progress <source> <dest>当 rsync 可用时,我倾向于使用而不是 scp/sftp,对于这种“转移简历”行为)。
总结以上内容,运行:
rsync --inplace -a --progress <source> user@server:/<destination_file_or_folder>
Run Code Online (Sandbox Code Playgroud)
在 client1 然后运行
rsync --inplace -a --progress user@server:/<destination_file_or_folder> <destination_on_cli2>
Run Code Online (Sandbox Code Playgroud)
在 client2 上反复运行,直到第一次传输完成(然后再次运行以确保您拥有一切)。rsync非常擅长只传输更新位置所需的绝对最小值,而不是每次都传输整个批次。对于偏执狂,您可能希望将--checksum选项添加到 rsync 命令(这将花费更多的 CPU 时间来处理大文件,但除非需要,否则不会导致传输更多的数据)并且对于速度,--compress如果数据您正在传输的不是压缩格式。
我目前无法尝试,所以这很可能会失败:我的想法是:将文件到达客户端 B 的目录挂载,例如使用 sshfs 挂载到客户端 b 文件系统中的 /mnt/server。然后
tail -c +0 -f /mnt/server/thefileinquestion > ~/finalfile
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10098 次 |
| 最近记录: |