How to perform automated backup using rsync over ssh

Today I will describe how to use rsync over ssh using four simple examples as it is very convinient way to perform secure and automated backup.

Use case #1

I will start with the simplest possible example which I will thoroughly describe. Data will be copied from local to remote, any additional data on the remote side will be removed.

Create .ssh directory and set correct permissions.

local$ mkdir .ssh
local$ chown 700 .ssh

Generate authentication key on the local machine. This key will be used to securely transfer data.

local$ ssh-keygen -N "" -q -f .ssh/mirror_data
I deliberately generated authentication key without passphrase so it could be used inside shell script without user intervention.

Remember to set correct permissions on the recently generated private and public keys.

local$ chmod 600 .ssh/mirror_data .ssh/mirror_data.pub

Copy the public key to the remote machine.

local$ scp .ssh/mirror_data.pub mirror@remote:~/

Now you can authorize and secure provided key (allow to only execute specified command from local machine and disallow everything else).

remote$ echo 'command="rsync --server --delete -logDtpre.iLsf . ~/mirror",from="local",no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding,no-pty' $(cat mirror_data.pub) >> ~/.ssh/authorized_keys
remote$ chmod 644 ~/.ssh/authorized_keys
remote$ rm ~/mirror_data.pub
You can alternatively use ssh-copy-id command to copy public key, and then edit authorized_keys file by hand using your favorite text editor.

authorized_keys on the remote machine should be similar to the one displayed below.

remote$ cat  ~/.ssh/authorized_keys
command="rsync --server --delete -logDtpre.iLsf . ~/mirror",from="local",no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding,no-pty ssh-rsa AAAA... 

To mirror data directory from the local to remote machine (remote mirror user, ~/mirror directory) using generated authentication key execute command:

local$ rsync -e "ssh -i ~/.ssh/mirror_data" --delete -a ~/data mirror@remote:.
You do not need to specify accurate remote directory as everything will be put in directory specified in the authorized_keys file.

I suppose that you are very curious about the command used in the authorized_keys file on the remote machine - to get it you need to use verbose ssh mode.

local$ rsync -e "ssh -v -i ~/.ssh/mirror_data" --delete -a ~/data mirror@remote:/xyz
[...]
debug1: Sending command: rsync --server --delete -logDtpre.iLsf . /xyz
[...]
Notice that you can only upload data, but not download it.
I will skip obvious parts below this point and focus only on the main commands.

Use case #2

Follow the previous procedure with just two exceptions to move data from local to remote, and delete source files afterwards. First exception can be found inside authorized_keys file, second is the command used to transfer data.

Look at the parameters in the authorized_keys file on the remote machine (data user).

remote$ cat  ~/.ssh/authorized_keys
command="rsync --server --remove-source-files -logDtpre.iLsf . ~/data_dir",from="local",no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding,no-pty ssh-rsa AAAA... 

Use the following command to move data from the ~/local_dir/ to remote machine (data user, directory is defined above).

local$ rsync -e "ssh -i ~/.ssh/move_data" --remove-source-files -a ~/local_dir data@remote:.
Notice that you can only upload data, but not download it.

Use case #3

To download data from the remote machine (archive user, ~/data/ directory) use the following parameters in the authorized_keys file.

remote$ cat  ~/.ssh/authorized_keys
command="rsync --server --sender -vlogDtpre.iLsf ~/data .",from="local",no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding,no-pty ssh-rsa AAAA... 

Execute the following command on the local machine to download data.

local$ rsync -e "ssh -i ~/.ssh/get_data" -a archive@remote:. .
Notice that you can only download data, but not upload it.

Use case #4

Use the rsync daemon mode over ssh to send data to the remote machine or receive it using single key.

remote$ cat  ~/.ssh/authorized_keys
command="rsync --config=/home/roadwarrior/rsyncd.conf --server --daemon .",from="local",no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding,no-pty ssh-rsa AAAA... 

Basic rsync configuration file (which can be easily extended).

remote$ cat  ~/rsyncd.conf
[archive]
  path = /home/roadwarrior/archive
  comment = Archive
  uid = roadwarrior
  gid = roadwarrior
  read only = false
  use chroot = true
I am not using ~ (tilde character → home directory) shorthand command inside authorized_keys to define location of the configuration file, and inside rsyncd.conf file to specify module path.

Upload data to the archive module on the remote using roadwarrior user.

local$ rsync -e "ssh -i ~/.ssh/rsync_data" -a ~/data roadwarrior@remote::archive

Download data from the archive module on the remote using roadwarrior user.

local$ rsync -e "ssh -i ~/.ssh/rsync_data" -a roadwarrior@remote::archive ~/data
Notice that you can upload and download data using single key.
Milosz Galazka's Picture

About Milosz Galazka

Milosz is a Linux Foundation Certified Engineer working for a successful Polish company as a system administrator and a long time supporter of Free Software Foundation and Debian operating system.

Gdansk, Poland https://sleeplessbeastie.eu