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/tree
und 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/tree
genau 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.pub
auf die ~<remoteuser>/.ssh/authorized_keys
Datei 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.plist
in 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-run
Option auf rsync. Es wird ausgedruckt, was es getan hätte , ohne etwas zu tun.