通过中间主机进行 Rsync 文件

通过中间主机进行 Rsync 文件

我目前不在 LAN 上,需要备份我的笔记本电脑。我的服务器上有一份笔记本电脑的较新的副本,我通常使用 rsync 备份笔记本电脑。现在我想这样做,但要在 LAN 之外。

简而言之,我想通过 B 将数据从 A 发送到 C,其中 A 是我的笔记本电脑,B 是我的路由器,C 是我的服务器。

我发现这个命令:A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination,它可以很好地通过 scp 传输文件 - 但由于我的服务器上已经有大部分数据,所以我希望使用 rsync 来仅同步增量。

我尝试过:A$ rsync file -e 'ssh B ssh' C,只要提示我输入用户:C 的密码,这种方法就行。但是,当我输入密码时,什么也没发生。路由器运行的是 Tomato v1.28,我无法将其设置为使用 ssh 配置文件,以便能够不使用密码登录 C。

关于如何实现这个功能你有什么想法吗?

答案1

这个问题在其他地方已经得到了充分的回答,包括来这里是为了 scp此处为 rsync由于后者包含了我的答案,但没有答案被接受,所以我将在这里重复一遍。

正如您提到的,您可以使用rsync-e | --rsh选项,但它会更复杂一些:

rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST -W %h:%p"' foo/ dest:./foo/

或者,如果您的版本ssh足够新(OpenSSH >= v7.3),您可以使用-JProxyJump)选项

rsync -azv -e 'ssh -A -J USER@PROXYHOST:PORT' foo/ dest:./foo/

请注意,我正在使用-A(代理转发),但如果您不使用密钥,它也应该适用于密码验证,当然,您可以在示例proxy中用Bdest用替换。C

如果您碰巧没有足够新的ssh版本(> = 5.3,IIRC),您可以使用netcat而不是-W选项来ssh

rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST nc %h %p"' foo/ dest:./foo/

最后,正如评论中已经指出的那样,您可以将放入文件ProxyCommand$HOME/.ssh/config,这样您就不必使用如此复杂的命令行。具体来说,添加如下内容:

Host C
  ProxyCommand ssh -A PROXYHOST -p 22 -W %h:%p

或者,使用ProxyJumpOpenSSH >= v 7.3:

Host C
  ProxyJump PROXYHOST

然后你应该可以这样做:

rsync -azv foo/ C:./foo/

答案2

以下是如何将数据从本地机器复制到目标机器,堡垒机位于两者之间(包括进度条):

rsync -r --info=progress2 -e 'ssh -J bastion-user@bastion-host:22' local-file-path target-machine-user@target-machine-host:target-machine-save-location

答案3

为了不使@crimson-egret 的答案变得更加复杂,我将这个变体作为新答案发布。

如果您的目标主机使用自定义端口和不同的用户名,则语法如下:

rsync -azv -e 'ssh -A -J USER@PROXYHOST:PORT -p dest_port' foo/ dest_user@dest_host:./foo/

dest您的目标机器在哪里

  • dest_port是其 SSHD 端口,
  • dest_user是目的地的用户名,
  • dest_host是目的地的 IP 地址(或域名)

答案4

您将需要AllowTcpForwarding no使用主机的 sshd 配置来跳转到下一个。

相关内容