Software zum Synchronisieren von zwei Verzeichnissen (lokal/remote)

Ich brauche eine Software, die etwa alle 5 Sekunden Änderungen im Verzeichnis (A) erkennt und geänderte Dateien aus dem/im (B) Remote-Verzeichnis hochlädt/löscht.

Ich habe nicht-kommerzielle Software gefunden, https://github.com/devstructure/doubledown . Ich frage mich, ob es kommerzielle Alternativen gibt?

Antworten (5)

rsync ist definitiv das richtige Werkzeug für diesen Job. Es existiert, um Verzeichnisse synchron zu halten, und kann dies mit einiger Intelligenz tun. Zum Beispiel: Es überträgt nur Deltas, wann immer es möglich ist, und es kann über SSH-Tunnel arbeiten.

Nehmen wir an, Sie haben eine Maschinenquelle , die Ihre Live-Version der Verzeichnisstruktur und Maschinensenke hostet , die Sie eng damit synchronisieren möchten. Wenn Sie ein ssh-Konto auf der Senke hätten, könnten Sie von der Quelle aus rsync wie folgt verwenden:/my/tree

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

Dies setzt voraus, dass Sie /my/treeauf der Senke genau dieselbe Stelle haben möchten wie auf der Quelle . Natürlich müssen Sie es nicht an genau der gleichen Stelle halten.

Aufschlüsselung der Befehlszeile:

  • -avz: Archivmodus, verbose out, Komprimierung während der Übertragung verwenden
  • --delete: Dateien bei der Synchronisierung löschen , die nicht auf der Quelle vorhanden sind
  • -e ssh: Verwenden Sie ssh als Verbindungsmethode

Bei diesem Anruf werden Sie natürlich nach Ihrem Passwort gefragt, wenn Sie ihn tätigen. Wenn Sie dies auf automatisierte Weise tun möchten, müssen Sie einige Schlüssel zwischen den Konten auf den Computern teilen und die Verschlüsselung mit öffentlichen und privaten Schlüsseln verwenden, um die SSH-Verbindung herzustellen.

Um Ihr Schlüsselpaar für diesen rysnc einzurichten, führen Sie den folgenden Befehl auf Ihrem Quellcomputer aus :

> 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

~/.ssh/my-rsync-key.pubDamit dieses Schlüsselpaar funktioniert, müssen wir den Inhalt von zur ~<remoteuser>/.ssh/authorized_keysDatei auf dem Senkencomputer hinzufügen .

Kopieren Sie zuerst die Datei auf den Senkencomputer :

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

Dann ssh zum Senkencomputer und importieren Sie den Schlüssel, indem Sie Folgendes als remoteuser auf dem Computer ausführen:

> 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

Für zusätzliche Tipps zum Sperren der SSH-Verbindung zwischen Ihren Quell- und Senkencomputern empfehle ich einen Blick auf diese Seite .

Von Ihrem Quellcomputer aus können Sie testen, ob dieses Setup funktioniert, indem Sie Folgendes ausführen:

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

Das wird einen Trockenlauf eines rsync machen. Wenn Sie sehen, dass der rsync-Befehl die Dateien verbindet und vergleicht, wissen Sie, dass die Dinge richtig eingerichtet sind.

Jetzt brauchen wir eine einfache Möglichkeit, diesen rsync-Befehl aus einer LaunchD-Konfigurationsdatei aufzurufen, wie in dieser hilfreichen Antwort auf dieser Seite gezeigt . Da dieser Aufruf in einer engen Schleife erfolgen soll, müssen Sie sicherstellen, dass nicht mehrere Kopien von rsync gleichzeitig ausgeführt werden. Sie können flock verwenden, um einen Mutex zu erstellen , der sicherstellt, dass ein Bash-Skript Singleton ist: Auf einem Computer wird jeweils nur eine Instanz davon ausgeführt. Also werden wir das folgende Skript auf der Festplatte erstellen:

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

Speichern Sie das als ~/my_rsync.sh.

Dieses Skript übernimmt die rsync für Sie. Alles, was Sie jetzt tun müssen, ist es über LaunchD einzurichten und in einer engen Schleife laufen zu lassen. Befolgen Sie die Anweisungen von hier und modifizieren Sie sie, um sie an unsere Bedürfnisse anzupassen. Wir werden ~/Library/LaunchAgents/my-rsync.plistin einem Texteditor erstellen und den Inhalt erstellen:

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

Das sollte sich um die Dinge kümmern.

Es gelten die üblichen Vorbehalte: Ich habe dies aus dem Gedächtnis geschrieben und es nicht getestet. Also nicht blind mitmachen. Unterwegs sorgfältig testen. Verwenden Sie im Zweifelsfall die --dry-runOption auf rsync. Es wird ausgedruckt, was es getan hätte , ohne tatsächlich etwas zu tun.

Anstatt den rsyncalle 5 Sekunden auszuführen, können Sie den lsyncd-Daemon verwenden, um den Verzeichnisbaum zu überwachen.

Es funktioniert in OS X bis /dev/fsevents, aber ich habe keine Plugin-fähige .debDatei. Es ist ein wenig geeky, es zu kompilieren und zu installieren. Bis ich Version 2.0.6 (bald) veröffentliche, würde ich empfehlen, GIT Head zu verwenden, da lsyncd 2.0.5 einige bekannte OS X-Bugs hat.

Ich habe gerade eine OSX-Fixed-Version veröffentlicht. Anders als Ressourcen zu verschwenden, indem alle 5 Sekunden etwas ausgeführt wird, obwohl wahrscheinlich nichts passiert ist, ruft Lsyncd rsync nur auf, wenn etwas passiert ist.

rsync wäre dafür ein großartiges Tool, und es ist in das Mac OS integriert. Es prüft Unterschiede zwischen zwei Standorten und kopiert dann nur die Delta-Änderungen über das Netzwerk. rsync ohne zusätzliche Flags macht fast genau das, wonach Sie suchen.

Der einzige Zusatz ist, dass Sie es alle 5 Sekunden ausführen müssten, um nach Änderungen zu suchen. Sie können dies tun, indem Sie launchd verwenden, mit einem großartigen Beispiel, das sich bereits auf dieser Seite befindet . In diesem Beispiel sieht es so aus, als ob das Skript weiter ausgeführt wird, dann 5 Sekunden schläft und dann erneut ausgeführt wird.

Das Problem bei der häufigen Ausführung besteht darin, dass das Tool auch die Unterschiede überprüfen muss, und wenn in 5 Sekunden so viele Änderungen vorgenommen werden, kann der Aufwand zum Aufzeichnen dieser Änderungen und Übertragen mehr als 5 Sekunden dauern.

Folderwatch ist eine kommerzielle Appstore-Alternative für nur 11,99 $. Folderwatch synchronisiert (spiegelt) Ordner auf HFS-Plus-formatierten Volumes in Echtzeit mit externen Laufwerken und AFP-Dateiservern. http://itunes.apple.com/us/app/folderwatch/id408224368?mt=12

Ich benutze FolderSync (8.99 App Store) und mag es wirklich. Schöne Benutzeroberfläche mit synchronisiertem Browsen in zwei Fenstern. Ermöglicht das Speichern eines Synchronisierungsauftrags zur späteren Wiederverwendung.