2つのディレクトリを同期するソフトウェア(ローカル/リモート)


回答:


12

rsyncは間違いなくこの仕事に適したツールです。ディレクトリを同期させるために存在し、かなりの賢さでそれを行うことができます。たとえば、可能な場合はデルタのみを転送し、sshトンネルを介して機能します。

ライブバージョンのディレクトリツリーをホストするマシンソースと、それと密接に同期させたい/my/treeマシンシンクがあるとします。シンクに sshアカウントがある場合は、ソースから次のようにrsyncを使用します。

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

これは、ソース/my/treeと同じ場所にシンクを配置することを前提としています。もちろん、まったく同じ場所に保管する必要はありません。

コマンドラインの詳細:

  • -avz:アーカイブモード、詳細出力、転送中に圧縮を使用
  • --deleteソースに存在しない同期上のファイルを削除する
  • -e ssh:接続方法としてsshを使用する

もちろん、この電話はあなたがそれを作るときにあなたのパスワードを尋ねます。これを自動化したい場合は、マシンのアカウント間でいくつかの鍵を共有し、公開鍵と秘密鍵の暗号化を使用してssh接続を確立する必要があります。

このrysncのキーペアを設定するには、ソースマシンで次のコマンドを実行します。

> 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.pubさせる~<remoteuser>/.ssh/authorized_keysには、シンクマシンのファイルにのコンテンツを追加する必要があります。

まず、ファイルをシンクマシンにコピーします。

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

次に、シンクマシンにSSHで接続し、マシンでremoteuserとして次のコマンドを実行してキーをインポートします。

> 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

ソースマシンとシンクマシン間のssh接続をロックダウンするための追加のヒントについては、このページをご覧になることをお勧めします

ソースマシンから、次のコマンドを実行して、このセットアップが機能することをテストできます。

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

これは、rsyncの予行演習を行います。rsyncコマンドがファイルを接続して比較しているのを見ると、物事が適切に設定されていることがわかります。

このサイトのこの有用な回答に示されているように、LaunchD構成ファイルからこのrsyncコマンドを呼び出す簡単な方法が必要です。この呼び出しをタイトなループで実行したいので、rsyncの複数のコピーが同時に実行されていないことを確認する必要があります。flockを使用して、bashスクリプトがシングルトンであることを保証するミューテックスを作成できます。つまり、マシン上で一度に実行されるインスタンスは1つだけです。したがって、ディスク上に次のスクリプトを作成します。

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

名前を付けて保存します~/my_rsync.sh

このスクリプトは、rsyncを処理します。LaunchDを介して設定し、タイトなループで実行するだけです。ここからの指示に従って、ニーズに合わせて変更~/Library/LaunchAgents/my-rsync.plistし、テキストエディターで作成してコンテンツを作成します。

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

これで問題は解決します。

通常の注意事項が適用されます。これはメモリから作成したものであり、テストしていません。だから盲目的に一緒にフォローしないでください。途中で慎重にテストします。疑わしい場合は--dry-run、rsync のオプションを使用してください。それはどのようなプリントアウトしますでしょう実際には何もせずに行っています。


2

rsync5秒ごとに実行する代わりに、lsyncdデーモンを使用してディレクトリツリーを監視できます。

OS Xからで動作します/dev/fseventsが、プラグイン対応の.debファイルはありません。コンパイルしてインストールするのは少しマニアックです。lsyncd 2.0.5にはいくつかの既知のOS Xバグがあるため、バージョン2.0.6(まもなく)をリリースするまで、GITヘッドを使用することをお勧めします。


OSXの修正版をリリースしました。5秒ごとに何かを実行してリソースを浪費する必要があるのとは異なり、Lsyncdは何かが発生した場合にのみrsyncを呼び出します。
axkibe

1

rsyncはこれに最適なツールであり、Mac OSに組み込まれています。2つの場所の違いをチェックし、ネットワーク全体の差分変更のみをコピーします。余分なフラグなしのrsyncは、あなたが探しているものとほぼ同じです。

唯一の追加は、変更をチェックするために5秒ごとに実行する必要があることです。これを行うには、launchdを使用します優れた例がこのサイトに既にあります。この例では、スクリプトが実行され続け、5秒間スリープしてから再度実行されているように見えます。

これを頻繁に実行する際の問題は、ツールでも違いを確認する必要があることであり、5秒で変更が非常に多い場合、それらの変更を記録して転送するためのオーバーヘッドには5秒以上かかることがあります。



0

私はFolderSync(8.99 App Store)を使用していて、本当に気に入っています。2つのペインで同期されたブラウジングを備えた素敵なUI。後で再利用するために同期ジョブを保存できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.