Software per sincronizzare due directory (locale / remoto)


Risposte:


12

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/treee 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/treeesattamente 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.pubal ~<remoteuser>/.ssh/authorized_keysfile 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.plistun 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-runopzione su rsync. Stamperà ciò che avrebbe fatto senza effettivamente fare nulla.


2

Invece di eseguire rsyncogni 5 secondi, è possibile utilizzare il demone lsyncd per guardare l'albero delle directory.

Funziona con OS X /dev/fsevents, ma non ho un .debfile pronto per il plugin . È un po 'geniale farlo compilare e installare. Fino a quando rilascerò la versione 2.0.6 (presto) consiglierei di usare GIT head, poiché lsyncd 2.0.5 ha riscontrato alcuni bug noti di OS X.


Ho appena rilasciato una versione fissa OSX. Diversamente dal dover sprecare risorse eseguendo qualcosa ogni 5 secondi, anche se probabilmente non è successo nulla, Lsyncd chiamerà rsync solo quando è successo qualcosa.
axkibe,

1

rsync sarebbe un ottimo strumento per questo, ed è integrato in Mac OS. Controllerà le differenze tra due posizioni e quindi copierà solo le modifiche delta attraverso la rete. rsync senza flag aggiuntivi fa quasi esattamente quello che stai cercando.

L'unica aggiunta è che sarà necessario eseguirlo ogni 5 secondi per verificare la presenza di modifiche. Puoi farlo usando launchd, con un ottimo esempio già su questo sito . In questo esempio sembra che lo script sia continuato a funzionare, quindi a dormire 5 secondi, quindi eseguire di nuovo.

Il problema con l'esecuzione di questo così spesso è che lo strumento dovrà anche controllare le differenze e se ci sono così tante modifiche in 5 secondi, il sovraccarico per registrare quelle modifiche e trasferirle potrebbe richiedere più di 5 secondi.



0

Ho usato FolderSync (App store 8.99) e mi piace molto. Bella interfaccia utente con navigazione sincronizzata in due riquadri. Consente di salvare un processo di sincronizzazione per un successivo riutilizzo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.