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.