56

I am currently away from my LAN and I need to do a backup of my laptop. I have a somewhat recent copy of my laptop on my server and I usually back the laptop up using rsync. Now I wish to do that, but outside of my LAN.

In short I want to send data from A to C via B, where A is my laptop, B my router and C my server.

I found this command: A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination, that works fine for transferring files via scp - but since I already have most of the data on my server I wish to use rsync to only sync the delta.

I have tried: A$ rsync file -e 'ssh B ssh' C, and that works as far as I am prompted to give the password for user:C. However, when I enter the password nothing happens. The router is running Tomato v1.28 and I am unable to set it up to utilize an ssh config file to enable it to log onto C w/o a password.

Any ideas on how to make this work?

1
  • 2
    use the same ProxyCommand in the configuration file. Rsync should pick that up.
    – Jakuje
    Aug 20, 2016 at 15:37

5 Answers 5

97

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/
15
  • I can ssh from PROXYHOST to dest without a password, but when I use -J (with or without -A) it's prompting me for a password. how do i not get prompted like when i'm directly on PROXYHOST?
    – Michael
    Mar 17, 2020 at 6:23
  • ProxyJump (or ProxyCommand) directives have no influence over password prompts. In my examples, I assumed an ssh key on your localhost that you use ssh-agent forwarding to avoid password prompts. I DISCOURAGE using passphrase-less ssh keys ANYWHERE, and especially on the PROXYHOST. This is not really an answer to your question, but that's mostly because there are not enough details to be able to answer completely. Mar 17, 2020 at 12:52
  • I tried to figure it out about 8 hours but no luck. I have same public key on both intermediate and destination server and use this commad to comnect destination but it's prompts for password: ssh -i ~/.ssh/id_rsa -J user@intermediate-server user@destination-server
    – Adnan
    Jul 22, 2021 at 17:06
  • I would suggest trying with just ssh and use the -v* option to test your ssh connection before putting rsync in the mix. I Jul 26, 2021 at 16:30
  • @crimson-egret - I have a similar case, A - Source B - Jumphost - We have dedicated account created and this user doesn't allow for direct SSH C - Destination Currently, we are copying files from source to jumphost (A to B) and again coping files from jumphost to C (B to C). we are using rsync to sync the files. Is it possible to use the above solution in our case ? to directly sync files using rsync from A to C via jumphost B ?
    – Light
    Oct 29, 2022 at 7:59
7

Here is how to copy data from local machine to target machine with the bastion machine sitting in between the two (progress bar included):

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
1

In order not make @crimson-egret's answer any more complex, I'm posting this variant as a new answer.

If your destination host uses a custom port and different username, the syntax is as follows:

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

dest is your destination machine where

  • dest_port is its SSHD port,
  • dest_user is the username on the destination,
  • dest_host is the IP address (or domain name) of the destination
0

The first attempt of OP worked fine for me, using public key between all nodes:

A> rsync -avz D:destiny/ ~/origin/ -e "ssh C ssh B ssh"

Download files from D to A, through C and B.

-1

You will need AllowTcpForwarding no in the sshd config of the host used to hop into the next one.

1
  • 1
    who is downvoting without a comment? Can SO require downvoting to be done with comment only?
    – sureshvv
    Dec 20, 2023 at 12:50

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .