rsync è sicuramente lo strumento giusto per questo lavoro. Esiste per mantenere sincronizzate le directory e può farlo con un bel po 'di intelligenza. Ad esempio: trasferirà solo delta ogni volta che può e può funzionare su tunnel ssh.
Supponiamo che tu abbia la sorgente della macchina che ospita la tua versione live dell'albero della directory /my/tree
e della macchina sink che vuoi mantenere in stretta sincronizzazione con essa. Se avevi un account ssh su sink , puoi utilizzare source rsync come segue:
rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree
Questo presuppone che tu voglia /my/tree
nello stesso identico posto su sink così come lo hai su source . Ovviamente, non è necessario tenerlo nello stesso identico punto.
Interruzione della riga di comando:
-
-avz
: modalità archivio, uscita dettagliata, utilizza la compressione durante il trasferimento
-
--delete
: cancella i file su sync che non sono presenti su source
-
-e ssh
: usa ssh come metodo di connessione
Questa chiamata, naturalmente, ti chiederà la tua password quando la fai. Se si desidera eseguire questa operazione in modo automatico, sarà necessario condividere alcune chiavi tra gli account sulle macchine e utilizzare la crittografia a chiave pubblica-privata per effettuare la connessione ssh.
Per impostare la tua coppia di chiavi per questo rysnc, esegui il seguente comando sulla tua macchina sorgente :
> 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
Per far funzionare questa coppia di chiavi, dobbiamo aggiungere il contenuto di ~/.ssh/my-rsync-key.pub
al file ~<remoteuser>/.ssh/authorized_keys
sulla macchina sink .
Prima copia il file sulla macchina sink :
scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~
Quindi ssh alla macchina sink e importa la chiave eseguendo quanto segue come remoteuser sulla macchina:
> 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
Per ulteriori suggerimenti su come bloccare la connessione ssh tra le tue macchine sorgente e sink ti consiglio di dare un'occhiata a questa pagina .
Dalla tua macchina sorgente puoi verificare che questa configurazione funzioni eseguendo:
rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree
Questo eseguirà un ciclo di esecuzione di un rsync. Se vedi il comando rsync che collega e confronta i file sai che le cose sono configurate correttamente.
Ora abbiamo bisogno di un modo semplice per chiamare questo comando rsync da un file di configurazione LaunchD come mostrato in questa utile risposta su questo sito . Dal momento che vuoi che questa chiamata avvenga in un ciclo stretto, devi assicurarti di non avere più copie di rsync in esecuzione contemporaneamente. Puoi utilizzare il gruppo per creare un mutex che garantisce che uno script di bash sia singleton: solo una sua istanza viene eseguita a una volta su una macchina. Quindi creeremo il seguente script sul disco:
#!/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}
Salva come ~/my_rsync.sh
.
Quello script si prenderà cura di fare il rsync per te. Tutto ciò che devi fare ora è configurarlo tramite LaunchD e farlo funzionare in un ciclo stretto. Seguendo le indicazioni da qui e modificandolo per soddisfare le nostre esigenze, creeremo ~/Library/LaunchAgents/my-rsync.plist
in un editor di testo e crea il contenuto:
<?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>
Questo dovrebbe occuparsi di cose.
Si applicano i normali avvertimenti: l'ho scritto a memoria e non l'ho testato. Quindi non seguire ciecamente. Testare attentamente lungo la strada. Ogni volta che sei in dubbio, usa l'opzione --dry-run
su rsync. Stamperà ciò che avrebbe fatto senza effettivamente fare nulla.