Sync and backup files from a host on the LAN over SSH on Mac OS X

Suppose you have several computers on an LAN, where DHCP is enabled. On Machine B, you want to routinely back up files from Machine A, whose IP address may change. This can be done using SSH and a local DNS server. The following experiment is done on two Mac OS X 10.8 machines.

  1. Set up DNS server (optional):

    named and rndc utility are installed by default on Mac OS X 10.8. For references on setup, see this link.

    1. Use rndc-confgen to generate configuration and secret key:

      $ sudo bash -c "rndc-confgen -b 256 > /etc/rndc.conf"
      $ sudo bash -c " head -n5 /etc/rndc.conf | tail -n4 > /etc/rndc.key"
    2. Edit /etc/named.conf and /etc/rndc.conf to ensure the port number are the same

    3. Start named server, run “rndc status” to check whether it is started:

      $ launchctl load -w /System/Library/LaunchDaemons/org.isc.named.plist
      $ launchctl start org.isc.named
      $ rndc status
    4. Create a zone file for the target machine (Machine A in this case):

      $ cd ~/Documents/
      $ mkdir named
      $ cd named
      $ vi

      Copy the following text in to, the IP address is irrelevant at this time:

      $TTL 86400
      $ORIGIN machine-a.
      @       IN      SOA     @ root (
                              2013091701      ; serial number YYMMDDNN
                              28800           ; Refresh
                              7200            ; Retry
                              864000          ; Expire
                              86400           ; Min TTL
              IN      NS      @
              IN      A   ; lan-sync
    5. Create symbolic link at /var/named/ (/private/var/named/

      $ ln -s /Users/yourname/Documents/named/ /private/var/named/
    6. Edit /etc/named.conf, insert the following lines after the existing zone configurations:

      zone "machine-a" IN {
              type master;
              file "";
              allow-update { none; };
    7. Edit /etc/resolv.conf, replace existing nameserver with This file should look like this:

      # This file is automatically generated.
  2. Download the script and set the following variables in

    $ git clone
    $ cd lan-sync-over-ssh
    $ vi
    # Remote hostname (LAN) and MAC address
    # User name on the remote host
  1. Setup SSH connection from Machine B to Machine A:

    1. On Machine A, open port 22.

      System Preferences -> Sharing -> Remote Login -> Allow access for (yourname)

    2. On Machine B, generate key pair:

      $ ssh-keygen -t rsa
      Generating public/private rsa key pair.
      Enter file in which to save the key (/Users/shichao/.ssh/id_rsa): machine-a-sshkey
      Enter passphrase (empty for no passphrase):
      Enter same passphrase again:
      Your identification has been saved in machine-a-sshkey.
      Your public key has been saved in
      The key fingerprint is:
      dd:bf:aa:6c:90:f5:fc:dc:18:68:1e:f4:77:7c:4c:2e [email protected]
      The key's randomart image is:
    3. Create SSH config file on Machine B:

      $ mv machine-a-sshkey ~/.ssh/
      $ cd ~/.ssh
      $ chmod 600 machine-a-sshkey
      $ vi config

      Add the following lines to config:

      Host machine-b
          IdentityFile ~/.ssh/machine-b-sshkey
          User yourname
    4. Copy the public key to Machine A: Append the content of it to ~/.ssh/authorized_keys. You can ssh to Machine A or do it directly on Machine A.

    5. Test the SSH connection:

      Suppose the IP address of Machine A is On Machine B:

      $ ssh

      You should access Machine B now.

  2. Sync the files from Machine A to Machine B as backup:

    1. Test the script:

      $ cd lan-sync-over-ssh
      $ ./ssh_sync test

      If the script does not retrieve the IP address of Machine A, run the following instead if you know the IP address, saying

      $ ./ssh_sync test
    2. Sync using DNS resolution:

      $ ./ssh_sync dns /path/to/machine/a/source /path/to/machine/b/dest/backup

      This sync all contents in directory /path/to/machine/a/source on Machine A into the /path/to/machine/b/dest/backup/source directory on Machine B.

    3. Sync using /etc/hosts:

      If you do not setup DNS server on Machine B, an alternative way is to use /etc/hosts:

      $ ./ssh_sync hosts /path/to/machine/a/source /path/to/machine/b/dest/backup

      However, this need administrative privilege when executing the script, because it needs write data to /etc/hosts.


If you encounter issues that you cannot ssh or ping machine-a (with errors like “ping: cannot resolve abc: Unknown host”), you need to change the Search Domains on Mac OS X. You can do this by System Preferences -> Network -> Advanced -> DNS -> Override the default Search Domains with ”.local”, or you can edit /etc/resolv.conf by adding a line “search .local” before “nameserver″.