410

I need to make periodic backups of a directory on a remote server which is a virtual machine hosted by a research organisation. They mandate that access to VMs is through ssh keys, which is all good, except that I can't figure out how to point rsync to the ssh key for this server.

Rsync has no problem if the key file is ~/.ssh/id_rsa, but when it is something else I get Permission denied (publickey).

With ssh I can specify the identity file with -i, but rsync appears to have no such option.

I have also tried temporarily moving the key on the local machine to ~/.ssh/id_rsa, but that similarly does not work.

tl;dr

Can you specify an identity file with rsync?

2
  • 4
    Useful also in order to do sudo rsync, which doesn't use one's own ssh keys, for some reason.
    – ijoseph
    Jul 27, 2018 at 21:19
  • 1
    @ijoseph Exactly, I use rsync -aAP "sudo -u user ssh" user@server:dir local_dir when syncing from cron scripts which run as root Dec 11, 2018 at 14:16

4 Answers 4

679

You can specify the exact ssh command via the '-e' option:

rsync -Pav -e "ssh -i $HOME/.ssh/somekey" username@hostname:/from/dir/ /to/dir/

Many ssh users are unfamiliar with their ~/.ssh/config file. You can specify default settings per host via the config file.

Host hostname
    User username
    IdentityFile ~/.ssh/somekey

In the long run it is best to learn the ~/.ssh/config file.

17
  • 2
    Try turning up verboseness of the ssh transport: rsync -e 'ssh -vv' web1:/etc/issue /tmp/issue Oct 14, 2014 at 14:49
  • 1
    Ah. If you are automating this and will not be able to supply a password you will need an additional passwordless ssh key configured at both ends. If you would like rsync to work without a password in an interactive session you will need to use ssh-agent. Oct 14, 2014 at 21:48
  • 57
    Duuuuuuude! the ~/.ssh/config file - you have opened a new universe for me!
    – demaniak
    Jun 29, 2017 at 20:38
  • 2
    ~/.ssh/config saved me the day, thanks a lot.
    – smishra
    Jun 12, 2018 at 15:57
  • 5
    In my case for ~/.ssh/config to work I had to do chmod 600 ~/.ssh/config
    – Tono Nam
    Oct 21, 2019 at 4:21
26

This can be done with SSH user config see: http://www.cyberciti.biz/faq/create-ssh-config-file-on-linux-unix/ basically edit ~/.ssh/config:

$ nano ~/.ssh/config
#Add Hosts below 
Host server1
HostName examplehost.com
User username
Port 22
IdentityFile /path/to/key

$ rsync -e ssh /home/user/directory [email protected]:home/user/directory/

This should work for any program using SSH, rsync,

1
  • 1
    You can use rsync -e ssh /home/user/directory server1:home/user/directory/ as well
    – Dexter
    Nov 1, 2019 at 13:12
14

For me it was sufficient to start the ssh-agent as follows:

eval `ssh-agent -s`
ssh-add /path/to/mykey

See also a longer answer here https://stackoverflow.com/questions/17846529/could-not-open-a-connection-to-your-authentication-agent

4

FYI:

1) The public key is always in the home directory of the user logging in to remote server i.e. if you login as "backup" it is located at /home/backup/.ssh/authorized_keys. User ID when you login defines the public key used at the destination.

You can choose the user ID when making connection by two different ways:

ssh [email protected]
or
ssh -l user_id  destination_server     (<-- that is lower case "L")

On the other hand at your end the private key is in a similar way in homedir of user unless you override it like described in Dan's answer.

2) For backup purpose it may be desirable to create a restricted key which is limited to run just one command like "rsync". There is a good description about that related to "rsnapshot" backup which allows you to remote backup entire server using non privileged user account and "sudo":

"rsnapshot" howto

Rsnapshot can easily backup a bunch of remote or local servers making it handy scheduled & centralised backup server.

You must log in to answer this question.

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