Unison File Sync
Suppose you want to sync files between two LAN computers over SSH. One computer, ‘primary’, may be a mobile/primary device. The other computer, ‘secondary’, may be a server/desktop that will run the ssh daemon. Below, I describe how to allow the ‘primary’ access to the ‘secondary’ and then sync files. This setup is the minimal routing to make things work, but we could also run ssh daemons on both if two way operation was needed.
Install
On both computers, run
sudo apt install unison unison-gtk
On the secondary computer
# Install the SSH daemon to listen for logins
sudo apt install openssh-server
# let ssh traffic in
sudo ufw allow ssh
Configure SSH
On both computers, run
# primary or secondary
ssh-keygen -t rsa -b 4096 -f .ssh/unison-primary
The public key of the primary computer should be copied to the file ~/.ssh/authorized_keys
on the secondary computer.
Append the following to the /etc/sshd_config
file on the secondary computer:
AuthorizedKeysFile .ssh/authorized_keys
# Disable all auth by default
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication no
PermitRootLogin no
# Allow auth from local network
Match Address 192.168.88.*
PubkeyAuthentication yes
# if you want, you can even restrict to a specified user
AllowUsers primary_name@primary_ip
Test the ssh connection from the primary computer using:
ssh -i .ssh/unison-primary secondary_name@secondary_ip
Test if unison will connect to secondary computer by running the following from the primary computer:
ssh -i .ssh/unison-primary secondary_name@secondary_ip unison -version
Configure Unison
Add the following to ~/.unison/default.prf
on the primary computer:
# primary and secondary paths to sync
root = /home/primary_name/path
root = ssh://secondary_name@secondary_ip//home/secondary_name/path
# Can ignore files (Name) or paths (Path)
ignore = Name *.Rhistory
ignore = Name */.Rproj.user
ignore = Name */.git
# force will do a one way (overwriting) push from primary to secondary.
# Comment out if you want two way sync.
force = /home/primary_name/data
# SSH settings
sshargs = -i /home/primary_name/.ssh/unison-primary
# Ignore file permissions
perms = 0
dontchmod = true
Run unison
Experiment on a test directory. If you created default.prf
, simply running unison
from the command line on the primary computer should start the file sync. Alternatively, you can use the gui we installed earlier.
Unfortunately, syncing git repositories is not supported https://stackoverflow.com/a/31629250. So make sure to ignore this directory in default.prf
.
Official documentation is located at https://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html.