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?
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.
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
$HOME
will not work inside simple quotes (no variable expansion), so you must either use double quotes or the absolute path.
"$HOME"
or $HOME
without any difference (also "${HOME}"
is possible, if you want to make it complicated)
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 :-)
This works for me
rsync -avz --rsh="ssh -p1234 -i ~/.ssh/1234-identity" \
"/local/dir/" remoteUser@22.33.44.55:"/remote/dir/"
/home/user/.ssh/1234-identity
. Then it worked. Possibly because it's then a different shell, as suggested in Darhuuk 's answer.
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
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.
Success story sharing
User ubuntu
when configuring for an EC2 Ubuntu instance :) Thanks!fish
) then doeval (ssh-agent -c)