我目前不在 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),您可以使用-J
(ProxyJump
)选项
rsync -azv -e 'ssh -A -J USER@PROXYHOST:PORT' foo/ dest:./foo/
请注意,我正在使用-A
(代理转发),但如果您不使用密钥,它也应该适用于密码验证,当然,您可以在示例proxy
中用B
和dest
用替换。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
或者,使用ProxyJump
OpenSSH >= 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 配置来跳转到下一个。