rsync jelas merupakan alat yang tepat untuk pekerjaan ini. Itu ada untuk menjaga direktori tetap selaras dan dapat melakukannya dengan sedikit kecerdasan. Sebagai contoh: ini hanya akan mentransfer delta kapan saja dan dapat bekerja di terowongan ssh.
Katakanlah Anda memiliki sumber mesin yang meng-host versi langsung pohon direktori /my/tree
dan wastafel mesin yang ingin Anda sinkronkan dengannya. Jika Anda memiliki akun ssh di wastafel yang Anda bisa, dari sumber gunakan rsync sebagai berikut:
rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree
Ini mengasumsikan Anda ingin /my/tree
di tempat yang sama persis di wastafel seperti yang Anda miliki pada sumbernya . Tentu saja, Anda tidak perlu menyimpannya di tempat yang sama persis.
Memecah baris perintah:
-avz
: mode arsip, verbose out, gunakan kompresi selama transfer
--delete
: hapus file yang disinkronkan yang tidak ada pada sumber
-e ssh
: Gunakan ssh sebagai metode koneksi
Panggilan ini, tentu saja, akan menanyakan kata sandi Anda saat Anda membuatnya. Jika Anda ingin melakukan ini dengan cara otomatis Anda perlu membagikan beberapa kunci antara akun di mesin dan menggunakan enkripsi kunci publik-swasta untuk membuat koneksi ssh.
Untuk mengatur pasangan kunci Anda untuk rysnc ini, jalankan perintah berikut di mesin sumber Anda :
> ssh-keygen -t rsa -b 2048 -f ~/.ssh/my-rsync-key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in ~/.ssh/my-rsync-key.
Your public key has been saved in ~/.ssh/my-rsync-key.pub.
The key fingerprint is:
2e:28:d9:ec:85:21:e7:ff:73:df:2e:07:78:f0:d0:a0 root@source
> chmod 600 ~/.ssh/my-rsync-key
Agar keypair ini berfungsi, kita perlu menambahkan konten ~/.ssh/my-rsync-key.pub
ke ~<remoteuser>/.ssh/authorized_keys
file pada mesin wastafel .
Pertama-tama salin file ke mesin wastafel :
scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~
Kemudian ssh ke mesin cuci dan impor kunci dengan menjalankan yang berikut ini sebagai pengguna jarak jauh pada mesin:
> if [ ! -d ~/.ssh ]; then mkdir ~/.ssh ; chmod 700 ~/.ssh ; fi
cd ~/.ssh/
if [ ! -f authorized_keys ]; then touch authorized_keys ; chmod 600 authorized_keys ; fi
cat ~/my-rsync-key.pub >> authorized_keys
rm ~/my-rsync-key.pub
Untuk tips tambahan tentang cara mengunci koneksi ssh antara mesin source dan sink Anda, saya sarankan untuk melihat halaman ini .
Dari mesin sumber Anda, Anda dapat menguji apakah pengaturan ini berfungsi dengan menjalankan:
rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree
Itu akan melakukan rsync kering. Jika Anda melihat perintah rsync menghubungkan dan membandingkan file, Anda tahu segala sesuatunya telah diatur dengan benar.
Sekarang kita perlu cara mudah untuk memanggil perintah rsync ini dari file konfigurasi LaunchD seperti yang ditunjukkan dalam jawaban yang bermanfaat di situs ini . Karena Anda ingin panggilan ini terjadi dalam loop yang ketat, Anda harus memastikan bahwa Anda tidak memiliki banyak salinan rsync yang berjalan pada saat yang sama. Anda dapat menggunakan kawanan untuk membuat mutex yang memastikan skrip bash adalah singleton: hanya satu instance yang berjalan pada satu waktu pada mesin. Jadi kita akan membuat skrip berikut pada disk:
#!/bin/sh
SINK_INSTANCE=remoteuser@sink
DIR=/my/tree
KEY=~/.ssh/my-rsync-key
LOG = ~/my_rsync.log
LOCK = ~/my_rsync.lock
SOURCE=/my/tree
exec 9>${LOCK}
if ! flock -n 9 ; then
echo "Another instance of your rsync is already running";
exit 1
fi
echo "----------" >> ${LOG}
echo `date` >> ${LOG}
rsync -avz --delete -e "ssh -i ${KEY}" \
${SOURCE}/ {SINK_INSTANCE}:${SOURCE} 2>&1 >> ${LOG}
Simpan itu sebagai ~/my_rsync.sh
.
Script itu akan membantu melakukan rsync untuk Anda. Yang perlu Anda lakukan sekarang adalah mengaturnya melalui LaunchD dan menjalankannya dalam lingkaran yang ketat. Mengikuti petunjuk dari sini dan memodifikasinya untuk memenuhi kebutuhan kita, kita akan membuat ~/Library/LaunchAgents/my-rsync.plist
editor teks dan membuat isinya:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>My Rsync</string>
<key>Program</key>
<string>/bin/sh</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>while sleep 5s; /Users/my/my_rsync.sh; done</string>
</array>
<key>ServiceDescription</key>
<string>Keep /my/tree synchronized with the machine sink</string>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
Itu harus mengurus semuanya.
Peringatan yang biasa berlaku: Saya menulis ini dari memori dan tidak mengujinya. Jadi jangan ikuti secara membabi buta. Uji dengan hati-hati di sepanjang jalan. Setiap kali Anda ragu, gunakan --dry-run
opsi di rsync. Ini akan mencetak apa yang akan dilakukan tanpa benar-benar melakukan apa pun.