使用端口转发时如何恢复大型 scp 文件传输?

使用端口转发时如何恢复大型 scp 文件传输?

我有一台距离几跳远的机器,我需要设置端口转发才能传输文件。

编辑:明确地说,需要多个跳转才能访问远程计算机。从我的机器,我设置了一个 VPN,在那里我可以访问 10.255.xx - 这是我可以通过 VPN 连接的唯一机器。登录 .xx 后,我就可以连接到其他机器 - .yy 就是其中之一。

从我的机器上:

ssh -L 4567:localhost:4567 [email protected]

然后从那台机器:

ssh -L 4567:localhost:22 [email protected]

然后我可以

scp -P 4567 me@localhost:/path/to/large/file.gz .

我让它运行了一整夜,结果发现传输在某个时候失败了。

我看到过一些建议使用 rsync 而不是 ssh 来恢复传输,但我不清楚如何设置。这可能吗?

答案1

对于某些版本的 scp(源计算机上的版本似乎是关键),只需重新执行 scp 命令即可恢复传输。但要小心!如果您的版本不支持部分传输,则部分文件将被覆盖。

如果 scp 不支持,则以下 rsync 开关可方便地恢复中断的传输:

     --append                append data onto shorter files
     --append-verify         like --append, but with old data in file checksum
 -e, --rsh=COMMAND           specify the remote shell to use
     --progress              show progress during transfer

命令

rsync --append-verify --progress --rsh="ssh -p 4567" me@localhost:/path/to/large/file.gz .

应该会产生预期的效果。请注意,-p对于 ssh,开关必须为小写。

答案2

使用 sftp 代替 scp

就你的情况而言:

sftp -a -P 4567 me@localhost:/path/to/large/file.gz .

来自 sftp 手册页:

-a      Attempt to continue interrupted downloads rather than overwriting existing partial or complete copies of files.  If the remote file contents differ from the partial local copy then the resultant file is likely to be corrupt.

答案3

rsync 默认使用 ssh,您可能必须使用 rsync 的 -e 开关指定确切的 ssh 命令。它还有一个 --partial,可以保留不完整的文件,以便可以恢复传输。

答案4

我真的不明白你的隧道有什么意义,所以我将按照以下方法解决你的问题:

ssh -R $tunnelPort:localhost:$localSSHPort $remoteUser@$remoteHost -p $remoteSSHPort

这将打开一个从本地计算机 (localhost) 到远程计算机 (remotehost) 的反向隧道。$tunnelPort 是远程主机上隧道所在的端口。$localSSHPort 是本地 sshd 运行的端口,$remoteSSHPort 是远程主机的 sshd 监听的端口。

现在你已经进入(反向!)隧道,你或多或少可以按照丹尼斯的建议去做:

rsync --apend-verify -az -e 'ssh -p $tunnelPort' /path/to/large/file $user@localhost:/destination

-a 和 -z 标志在 rsync 的手册页中有说明,因此我就不详细阐述了。现在的情况是,当您在远程主机上运行 rsync 时(如上所示),它会将所有数据推送到端口 $tunnelPort,然后转发到本地主机的 sshd $localSSHPort。

希望有所帮助。

相关内容