Rsync files via intermediate host

This question is essentially answered elsewhere, including here for scp and here for rsync. Since the latter includes my answer, but no answer was accepted, I'll repeat it here.

As you noted, you can use rsync's -e | --rsh option, but it's going to be a bit more complicated:

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

Or, if your version of ssh is new enough (OpenSSH >= v7.3), you can use the -J (ProxyJump) option

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

Note that I'm using -A (agent forwarding) but it should also work with password authentication if you don't use keys, and, of course, you can replace proxy with B and dest with C in your example.

If by chance you don't have a new enough ssh version (>= 5.3, IIRC), you can use netcat instead of -W option to ssh:

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

Finally, as noted in comments already, you can put the ProxyCommand into your $HOME/.ssh/config file so you don't have to have such a complicated command line. Specifically, add something like this:

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

Or, using ProxyJump for OpenSSH >= v 7.3:

Host C
  ProxyJump PROXYHOST

Then you should be able to just do:

rsync -azv foo/ C:./foo/

Tags:

Linux

Ssh

Rsync

Scp