İki dizini senkronize etmek için yazılım (yerel / uzak)


Yanıtlar:


12

rsync kesinlikle bu iş için doğru araçtır. Dizinleri senkronize tutmak için var ve bunu birazcık akıllıca yapabiliyor. Örneğin: Ne zaman mümkün olursa deltaları transfer eder ve ssh tünellerinde çalışabilir.

Diyelim ki makinen var. kaynak dizin ağacının canlı sürümünü barındıran /my/tree ve makine lavabo onunla yakın senkronizasyonda kalmak istediğinizi Tarihinde bir ssh hesabınız varsa lavabo yapabilirsin kaynak rsync'i aşağıdaki gibi kullanın:

rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree

Bu istediğini varsayar /my/tree tam olarak aynı noktada lavabo sahip olduğun gibi kaynak . Elbette, tam olarak aynı noktada tutmanıza gerek yok.

Komut satırını yıkmak:

  • -avz: arşiv modu, ayrıntılı, aktarım sırasında sıkıştırmayı kullanma
  • --delete: üzerindeki dosyaları sil senkronize etmek üzerinde mevcut değil kaynak
  • -e ssh: Bağlantı yöntemi olarak ssh kullanın

Bu çağrı, elbette, yaptığınız zaman şifrenizi soracak. Bunu otomatik bir şekilde yapmak istiyorsanız, ssh bağlantısını kurmak için makinelerde hesaplar arasında bazı anahtarları paylaşmanız ve genel-özel anahtar şifrelemesi kullanmanız gerekecektir.

Bu çifti için anahtar çiftinizi ayarlamak üzere, aşağıdaki komutu çalıştırın. kaynak makine:

> 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

Bu keypair'in çalışması için içeriğini eklememiz gerekir. ~/.ssh/my-rsync-key.pub -e ~<remoteuser>/.ssh/authorized_keys dosya lavabo makinesi.

İlk önce dosyayı bilgisayara kopyalayın. lavabo makine:

scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~

Sonra ssh lavabo aşağıdaki gibi çalıştırarak makineyi çalıştırın ve anahtarı alın. remoteuser makinede:

> 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

Arasında ssh bağlantısını kilitlemeyle ilgili ek ipuçları için kaynak ve lavabo makineleri incelemenizi tavsiye ederim bu sayfa .

Senden kaynak makineyi çalıştırarak bu kurulumun çalıştığını test edebilirsiniz:

rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree

Bu bir rsync kuru çalışma yapacak. Dosyaları bağlayıp karşılaştırırken rsync komutunu görürseniz, işlemlerin doğru yapıldığını bilirsiniz.

Şimdi bu rsync komutunu bir LaunchD config dosyasından çağırmanın kolay bir yoluna ihtiyacımız var. Bu sitede bu faydalı cevapta gösterildiği gibi . Bu aramanın sıkı bir döngüde gerçekleşmesini istediğiniz için, aynı anda çalışan rsync'in birden fazla kopyası olmadığından emin olmanız gerekir. Yapabilirsin bir muteks oluşturmak için akın kullanın Bu bir bash betiğinin singleton olmasını sağlar: bir makinede her seferinde yalnızca bir örneği çalışır. Böylece diskte şu betiği yaratacağız:

#!/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}

Şunu kaydet ~/my_rsync.sh.

Bu senaryo sizin için rsync yapmayı önemser. Şimdi yapmanız gereken tek şey LaunchD aracılığıyla ayarlamak ve sıkı bir döngü içinde çalıştırmaktır. Adresinden gelen talimatları takip ederek İşte ve ihtiyaçlarımızı karşılayacak şekilde değiştirerek, yaratacağız ~/Library/LaunchAgents/my-rsync.plist bir metin düzenleyicide içeriğini yapın:

<?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>

Bu şeylerle ilgilenmeli.

Her zamanki uyarılar geçerlidir: Bunu bellekten yazdım ve test etmedim. Bu yüzden kör takip etmeyin. Yol boyunca dikkatlice test edin. Şüpheniz olduğunda, kullanın. --dry-run rsync'deki seçenek. Ne olduğunu yazdıracak olur Aslında hiçbir şey yapmadan yaptım.


2

Çalıştırmak yerine rsync Her 5 saniyede, dizin ağacını izlemek için lsyncd arka planını kullanabilirsiniz.

OS X’de aracılığıyla çalışır /dev/fsevents, ama hazır bir eklentim yok .deb dosya. Derlenip kurulmasını sağlamak biraz geeky. 2.0.6 sürümünü piyasaya sürene kadar (yakında) GIT kafasını kullanmanızı tavsiye ederim, çünkü 2.0s, bazı bilinen OS X hataları alıyor.


Sadece bir OSX sabit versiyonunu piyasaya sürdüm. Hiçbir şey olmamış olmasına rağmen her 5 saniyede bir şeyler çalıştırarak kaynakları israf etmekten farklı olarak, Lsyncd sadece bir şey olduğunda rsync'i arayacak.
axkibe

1

rsync bunun için harika bir araç olurdu ve Mac OS'de yerleşik olarak bulunuyor. İki konum arasındaki farkları kontrol eder ve ardından yalnızca ağdaki delta değişikliklerini kopyalar. Fazladan bayraksız rsync, tam olarak aradığınızı yapar.

Tek ekleme, değişiklikleri kontrol etmek için her 5 saniyede bir çalıştırmanız gerekmesidir. Bunu launchd kullanarak yapabilirsiniz, Zaten bu sitede harika bir örnek ile . Bu örnekte senaryo çalışmaya devam ediyor ve 5 saniye uyuyor, ardından tekrar çalışıyor gibi görünüyor.

Bunu sık sık çalıştırmanın sorunu, aracın farklılıkları da kontrol etmesi gerekecek ve 5 saniyede çok fazla değişiklik olursa, bu değişiklikleri kaydetmek ve bunları aktarmak için ek yük 5 saniyeden fazla sürebilir.



0

FolderSync (8.99 App store) kullanıyorum ve gerçekten beğendim. İki bölmede senkronize tarama ile güzel UI. Daha sonra tekrar kullanmak üzere bir senkronizasyon işi kaydetmenizi sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.