Perangkat lunak untuk menyinkronkan dua direktori (lokal / jarak jauh)

9

Saya memerlukan perangkat lunak yang akan mendeteksi perubahan dalam direktori (A) setiap 5 detik atau lebih dan mengunggah / menghapus file yang diubah dari / di (B) direktori jarak jauh.

Saya menemukan perangkat lunak non-komersial, https://github.com/devstructure/doubledown . Saya bertanya-tanya apakah ada alternatif komersial?

Gajus
sumber

Jawaban:

12

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/treedan 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/treedi 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.pubke ~<remoteuser>/.ssh/authorized_keysfile 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.plisteditor 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-runopsi di rsync. Ini akan mencetak apa yang akan dilakukan tanpa benar-benar melakukan apa pun.

Ian C.
sumber
2

Alih-alih menjalankan rsyncsetiap 5 detik, Anda dapat menggunakan daemon lsyncd untuk menonton pohon direktori.

Ini berfungsi di OS X sampai /dev/fsevents, tapi saya tidak punya .debfile plugin siap . Agak aneh untuk membuatnya dikompilasi dan diinstal. Sampai saya merilis versi 2.0.6 (segera) saya akan menyarankan untuk menggunakan kepala GIT, karena lsyncd 2.0.5 mendapatkan beberapa bug OS X yang dikenal.

axkibe
sumber
Saya baru saja merilis versi tetap OSX. Berbeda dengan membuang-buang sumber daya dengan menjalankan sesuatu setiap 5 detik walaupun sepertinya tidak ada yang terjadi, Lsyncd akan memanggil rsync hanya ketika sesuatu telah terjadi.
axkibe
1

rsync akan menjadi alat yang hebat untuk ini, dan itu dibangun ke dalam Mac OS. Ini akan memeriksa perbedaan antara dua lokasi, dan kemudian hanya menyalin perubahan delta di seluruh jaringan. rsync tanpa flag tambahan melakukan hampir apa yang Anda cari.

Satu-satunya tambahan adalah Anda harus menjalankannya setiap 5 detik untuk memeriksa perubahan. Anda dapat melakukan ini dengan menggunakan launchd, dengan contoh yang bagus sudah ada di situs ini . Dalam contoh ini sepertinya skrip tetap berjalan, dan kemudian tidur 5 detik, lalu jalankan lagi.

Masalah yang sering terjadi adalah alat ini juga harus memeriksa perbedaannya, dan jika ada begitu banyak perubahan dalam 5 detik, biaya overhead untuk mencatat perubahan tersebut dan mentransfernya mungkin memerlukan waktu lebih dari 5 detik.

jmlumpkin
sumber
0

Saya telah menggunakan FolderSync (8,99 App store) dan sangat menyukainya. UI yang bagus dengan penelusuran tersinkronisasi dalam dua panel. Memungkinkan Anda menyimpan pekerjaan sinkronisasi untuk digunakan kembali nanti.

jtreser
sumber