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 un sorgente macchina che ospita la tua versione live dell'albero delle directory /my/tree
e un sink di macchina che desideri mantenere in stretta sincronizzazione con esso. Se avessi un account ssh su sink puoi, dal sorgente usare rsync come segue:
rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree
Questo presuppone che tu voglia /my/tree
esattamente nello stesso punto su sink come lo hai sul sorgente . Naturalmente, non è necessario mantenerlo nello stesso punto esatto.
Abbattere la riga di comando:
-avz
: modalità archivio, dettaglio, usa la compressione durante il trasferimento
--delete
: elimina i file sincronizzati che non sono presenti sul sorgente
-e ssh
: Utilizzare ssh come metodo di connessione
Naturalmente questa chiamata ti chiederà la password quando la invii. Se vuoi farlo in qualche modo automatizzato, dovrai condividere alcune chiavi tra gli account sui computer e utilizzare la crittografia della chiave pubblica-privata per stabilire la connessione ssh.
Per impostare la coppia di chiavi per questo rysnc, eseguire il comando seguente sul computer di origine :
> 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 questa coppia di chiavi di lavoro abbiamo bisogno di aggiungere il contenuto di ~/.ssh/my-rsync-key.pub
al ~<remoteuser>/.ssh/authorized_keys
file sul lavandino macchina.
Per prima cosa copia il file sul lavandino :
scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~
Quindi ssh nella macchina del lavandino e importare la chiave eseguendo quanto segue come utente remoto 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 macchine sorgente e sink , ti consiglio di dare un'occhiata a questa pagina .
Dal tuo computer di origine puoi verificare che questa configurazione funzioni eseguendo:
rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree
Quello farà una corsa a secco di un rsync. Se vedi il comando rsync che collega e confronta i file, sai che le cose sono state impostate 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 . Poiché vuoi che questa chiamata avvenga in un ciclo stretto, devi assicurarti di non avere più copie di rsync in esecuzione contemporaneamente. Puoi usare flock per creare un mutex che assicuri che uno script bash sia singleton: solo una sua istanza viene eseguita contemporaneamente 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}
Salvalo come ~/my_rsync.sh
.
Quella sceneggiatura si occuperà di fare la sincronizzazione per te. Tutto quello 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
un editor di testo e creeremo i contenuti:
<?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 prendersi cura delle cose.
Si applicano le solite avvertenze: ho scritto questo dalla memoria e non l'ho provato. Quindi non seguire ciecamente. Prova attentamente lungo la strada. In caso di dubbi, utilizzare l' --dry-run
opzione su rsync. Stamperà ciò che avrebbe fatto senza effettivamente fare nulla.