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


10

我有一台机器,距离您只有几步之遥,我需要设置端口转发才能传输文件。

编辑:为了清楚起见,需要多个跃点才能访问远程计算机。在我的机器上,我建立了一个VPN,可以在其中访问10.255.xx-这是我可以通过VPN连接到的唯一机器。登录.xx后,我便可以连接到其他计算机-.yy就是其中一台。

从我的机器上:

ssh -L 4567:localhost:4567 me@10.255.x.x

然后从那台机器:

ssh -L 4567:localhost:22 me@10.255.y.y

那我可以

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

我离开了这个奔走的黑夜,只是发现转移在某个时候死了。

我已经看到了一些在ssh上使用rsync来恢复传输的建议,但是我不清楚如何进行设置。这可能吗?


这些蛇麻草是做什么用的?无法scp me@10.255.x.x:/path/to/large/file.gz .达到完全相同的效果吗?客户端和服务器上安装了哪个版本的scp(ssh)?
丹尼斯

@Dennis:scp不支持继续传输-您建议的操作将重新开始下载。
克里斯,

某些版本可以(我的笔记本电脑的scp可以,而VPS可以)。我问的原因是因为跳对我来说似乎是不必要的,而没有跳的rsync则要容易得多。
丹尼斯

这个答案也可能对您有帮助:unix.stackexchange.com/a/43097/14084
Bernhard

Answers:


9

对于某些版本的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 .

应该具有预期的效果。请注意,-pssh 的开关必须为小写。


由于在目标服务器上配置网络的方式,因此需要这些跃点。在ssh上使用rsync的问题是我需要使用本地端口4567,该文件在10.255.xx服务器上不存在。
克里斯,

我的错。我以为那10.255.y.y是客户端计算机。
丹尼斯

我已经更新了答案。
丹尼斯

如果无法使用rsync怎么办?就我而言,远程主机上只有ftp可用。
dr.dimitru '16

1
@Enzo 问题是关于SCP的,答案必须是关于scp的。问题是关于scp传输不完整,而不是关于scp工具。从字面上说,我已经看到一些建议,可以在ssh上使用rsync来恢复传输,但是我不清楚如何设置它。这可能吗?在底部。
丹尼斯

3

使用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.

1

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


-1

我真的看不到您的隧道的目的是什么,所以这是我将如何解决您的问题的方法:

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

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

现在您处于(反向!)隧道内,您可以或多或少地执行丹尼斯提出的建议:

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

-a和-z标志在rsync的手册页中进行了说明,因此我将不对其进行详细说明。现在发生的是,当您如上所述在remotehost上运行rsync时,它将所有数据推入$ tunnelPort端口,然后将其转发到本地主机的sshd $ localSSHPort。

希望能有所帮助。


@ingenous:我为隧道添加了解释。
克里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.