140

How do you use an identity file with rsync?

This is the syntax I think I should be using with rsync to use an identity file to connect:

rsync -avz -e 'ssh -p1234  -i ~/.ssh/1234-identity'  \
"/local/dir/" remoteUser@22.33.44.55:"/remote/dir/"

But it's giving me an error:

Warning: Identity file ~/.ssh/1234-identity not accessible: No such file or directory.

The file is fine, permissions are set correctly, it works when doing ssh - just not with rsync - at least in my syntax. What am I doing wrong? Is it trying to look for the identity file on the remote machine? If so, how do I specify that I want to use an identity file on my local machine?

Good Person
  • 1,437
  • 2
  • 23
  • 42
cwd
  • 53,018
  • 53
  • 161
  • 198

6 Answers6

100

Use either $HOME

rsync -avz -e "ssh -p1234  -i \"$HOME/.ssh/1234-identity\"" dir remoteUser@server:

or full path to the key:

rsync -avz -e "ssh -p1234  -i /home/username/.ssh/1234-identity" dir user@server:

Tested with rsync 3.0.9 on Ubuntu

Tombart
  • 30,520
  • 16
  • 123
  • 136
92

You may want to use ssh-agent and ssh-add to load the key into memory. ssh will try identities from ssh-agent automatically if it can find them. Commands would be

eval $(ssh-agent) # Create agent and environment variables
ssh-add ~/.ssh/1234-identity

ssh-agent is a user daemon which holds unencrypted ssh keys in memory. ssh finds it based on environment variables which ssh-agent outputs when run. Using eval to evaluate this output creates the environment variables. ssh-add is the command which manages the keys memory. The agent can be locked using ssh-add. A default lifetime for a key can be specified when ssh-agent is started, and or specified for a key when it is added.

You might also want to setup a ~/.ssh/config file to supply the port and key definition. (See `man ssh_config for more options.)

host 22.33.44.55
    IdentityFile ~/.ssh/1234-identity
    Port 1234

Single quoting the ssh command will prevent shell expansion which is needed for ~ or $HOME. You could use the full or relative path to the key in single quotes.

BillThor
  • 7,306
  • 1
  • 26
  • 19
  • 2
    Double quotes and using $HOME solved my problem. Can you elaborate on what the first two commands are doing? I was already familiar with setting up a config file - the only problem is when I have multiple accounts on one server. I don't expect that it would let me specify multiple identity files for the same host. – cwd Apr 03 '11 at 04:05
  • +1 This fixed my issue with drone.io :) Thanks a lot. – Bhargav Nanekalva Jan 21 '14 at 06:37
  • This is friggin' awesome. FTR, you can also specify the default username to connect as, e.g. `User ubuntu` when configuring for an EC2 Ubuntu instance :) Thanks! – DanielSmedegaardBuus May 11 '15 at 10:44
  • If you're using csh style shell (such as `fish`) then do `eval (ssh-agent -c)` – Dave Dec 29 '16 at 13:14
36

You have to specify the absolute path to your identity key file. This probably some sort of quirck in rsync. (it can't be perfect after all)

I ran into this issue just a few days ago :-)

om-nom-nom
  • 62,329
  • 13
  • 183
  • 228
Alpha01
  • 820
  • 1
  • 7
  • 16
  • You can use ~ but you can't embed it within single quotes, because then it doesn't get substituted correctly to /home/username/ you must use double quotes to have correct that work correctly, see @ilcavero 's solution – X Tian Mar 20 '18 at 18:53
25

This works for me

rsync -avz --rsh="ssh -p1234  -i ~/.ssh/1234-identity"  \
"/local/dir/" remoteUser@22.33.44.55:"/remote/dir/"
ilcavero
  • 3,012
  • 1
  • 31
  • 27
  • 2
    For some reason I had to specify full path to the identity file, i.e. `/home/user/.ssh/1234-identity`. Then it worked. Possibly because it's then a different shell, as suggested in Darhuuk 's answer. – Sergey Orshanskiy May 17 '15 at 18:08
  • @osa you saved me there! I was having an issue with Drupal and rSYNC and the issue was the path...weird. – Lee Woodman Feb 01 '16 at 21:22
11

use key file with rsync:

rsync -rave "ssh -i /home/test/pkey_new.pem" /var/www/test/ ubuntu@231.210.24.48:/var/www/test
Avinash Raut
  • 1,872
  • 20
  • 26
6

Are you executing the command in bash or sh? This might make a difference. Try replacing ~ with $HOME. Try double-quoting the string for the -e option.

AVH
  • 11,349
  • 4
  • 34
  • 43