Software zum Synchronisieren von zwei Verzeichnissen (lokal / remote)


Antworten:


12

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

Angenommen, Sie haben Maschine Quelle , dass Hosts Ihre Live - Version des Verzeichnisbaums /my/treeund Maschinen Spüle , dass Sie mit ihm in enger Synchronisation behalten möchten. Wenn Sie ein SSH-Konto in der Senke hatten, können Sie von der Quelle aus rsync wie folgt verwenden:

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

Dies setzt voraus, dass Sie /my/treegenau an der gleichen Stelle auf der Spüle möchten, an der Sie sie an der Quelle haben . Natürlich müssen Sie es nicht genau an der gleichen Stelle aufbewahren.

Befehlszeile aufteilen:

  • -avz: Archivierungsmodus, ausführlich, Komprimierung während der Übertragung verwenden
  • --delete: Dateien bei der Synchronisierung löschen , die in der Quelle nicht vorhanden sind
  • -e ssh: Verwenden Sie ssh als Verbindungsmethode

Bei diesem Anruf werden Sie natürlich nach Ihrem Passwort gefragt, wenn Sie es machen. Wenn Sie dies auf automatisierte Weise tun möchten, müssen Sie einige Schlüssel zwischen den Konten auf den Computern freigeben und die SSH-Verbindung mithilfe der Verschlüsselung mit öffentlich-privaten Schlüsseln herstellen.

So richten Sie Ihr Schlüsselpaar für diese rysnc, führen Sie den folgenden Befehl auf Ihrer Quellmaschine:

> 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

Für dieses Schlüsselpaar zur Arbeit müssen wir den Inhalt hinzufügen ~/.ssh/my-rsync-key.pubauf die ~<remoteuser>/.ssh/authorized_keysDatei auf dem Waschbecken Maschine.

Kopieren Sie zuerst die Datei auf die Spülenmaschine :

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

Dann SSH auf die Spüle - Maschine und den Schlüssel importieren , indem die folgenden als Lauf entfernter_benutzer an der Maschine:

> 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

Weitere Tipps zum Sperren der SSH-Verbindung zwischen Ihren Quell- und Senkencomputern finden Sie auf dieser Seite .

Auf Ihrem Quellcomputer 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 macht einen Trockenlauf eines Rsync. Wenn Sie den Befehl rsync sehen, der 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 Site 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 gleichzeitig 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. Jetzt müssen Sie es nur noch über LaunchD einrichten und in einer engen Schleife ausführen. Wenn Sie den Anweisungen von hier aus folgen und sie an unsere Bedürfnisse anpassen, erstellen wir sie ~/Library/LaunchAgents/my-rsync.plistin einem Texteditor und erstellen den Inhalt:

<?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 Einschränkungen: Ich habe dies aus dem Gedächtnis geschrieben und nicht getestet. Folgen Sie also nicht blindlings. Auf dem Weg sorgfältig testen. Wenn Sie Zweifel haben, verwenden Sie die --dry-runOption auf rsync. Es wird ausgedruckt, was es getan hätte , ohne etwas zu tun.


2

Anstatt rsyncalle 5 Sekunden auszuführen, können Sie den Verzeichnisbaum mit dem lsyncd-Daemon überwachen.

Es funktioniert in OS X bis /dev/fsevents, aber ich habe keine Plugin-fähige .debDatei. Es ist ein wenig geeky, es kompilieren und installieren zu lassen. Bis zur Veröffentlichung von Version 2.0.6 (bald) würde ich empfehlen, GIT head zu verwenden, da lsyncd 2.0.5 einige bekannte OS X-Fehler aufweist.


Ich habe gerade eine feste OSX-Version veröffentlicht. Anders als bei der Verschwendung von Ressourcen, indem alle 5 Sekunden etwas ausgeführt wird, obwohl wahrscheinlich nichts passiert ist, ruft Lsyncd rsync nur auf, wenn etwas passiert ist.
Axkibe

1

rsync wäre hierfür ein großartiges Tool, das in Mac OS integriert ist. Es überprüft die 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.

Die einzige Ergänzung ist, dass Sie es alle 5 Sekunden ausführen müssen, um nach Änderungen zu suchen. Sie können dies tun, indem Sie launchd verwenden. Ein großartiges Beispiel finden Sie bereits auf dieser Site . In diesem Beispiel sieht es so aus, als würde das Skript weiter ausgeführt und dann 5 Sekunden lang schlafen und dann erneut ausgeführt.

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



0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.