用于同步两个目录(本地/远程)的软件


Answers:


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脚本是单例的:每个实例仅在一台机器上运行一次。因此,我们将在磁盘上创建以下脚本:

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

rsync您可以使用lsyncd守护程序监视目录树,而不必每5秒运行一次。

通过OS X可以在OS X中运行/dev/fsevents,但是我没有插件可用.deb文件。进行编译和安装有点怪异。在我发布2.0.6版(很快)之前,我建议使用GIT头,因为lsyncd 2.0.5存在一些已知的OS X错误。


我刚刚发布了OSX固定版本。与必须每5秒运行一次来​​浪费资源(尽管可能什么也没发生)不同,Lsyncd仅在发生任何事情时才调用rsync。
axkibe 2012年

1

rsync将是一个很好的工具,它内置在Mac OS中。它将检查两个位置之间的差异,然后仅在网络上复制增量更改。没有任何额外标志的rsync几乎可以完全满足您的需求。

唯一的补充是您需要每5秒运行一次以检查更改。您可以通过使用launchd来做到这一点,该站点上已经有一个很好的例子。在此示例中,脚本似乎保持运行,然后休眠5秒钟,然后再次运行。

经常运行此命令的问题是该工具还必须检查差异,如果5秒钟内有太多更改,则记录这些更改并进行传输的开销可能会超过5秒钟。



0

我一直在使用FolderSync(8.99应用商店),非常喜欢它。尼斯UI,在两个窗格中具有同步浏览。允许您保存同步作业以供以后重用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.