无需中央服务器的类似 Dropbox 的文件同步

mun*_*lli 22 sync macos

我正在寻找一种方法来通过互联网同步我的两台 Mac 上的辅助驱动器。我在两台 Mac 之间有一致的 VPN 连接,我可以访问它们,就好像它们并排​​坐在一起。

我正在寻找一种方法来实现类似 Dropbox 的体验,如果我在一台 Mac 上修改文件,该文件将被推送到另一台 Mac(反之亦然)。我还需要能够限制带宽(这样我们的小 1 兆位上传管道不会过载)。有什么建议?

哦,因为我的驱动器是 500GB,所以现在使用 dropbox 是不可能的。谢谢!

Osk*_*son 30

查看Bittorrent 同步。它具有像 Dropbox 一样的同步功能,但没有云。

  • @GeraldSchneider 你知道没有这个限制的东西吗? (18认同)
  • 不一定是云存储。您需要一个始终在线的节点。这可以是计算机、NAS、云服务、由 Lawrence 提出的自托管 OwnCloud 实例或任何类似的解决方案。但只要您没有一个节点始终在线,此限制始终适用。 (5认同)
  • 我使用 BitTorrent Sync,我强烈推荐它 - 我将它与 Dropbox 结合使用来处理太大且不值得占用空间的文件。但要考虑的一件事是,它不能很好地处理文件的同时编辑——没有像 Dropbox 那样的冲突处理——最后编辑的文件只是赢了。不一定是问题,但这取决于您的要求。 (3认同)
  • @shelvacu,不可能。如果您希望它在不需要两台机器都在线的情况下同步,则需要云存储(与 OP 请求相反)。 (2认同)

Sen*_* H. 16

如果你想成为硬核,你可以在OsX 中使用rsync命令,比如 *nix staff。

在此之前,您必须具有通过 ssh 访问远程主机的权限。OpenSSH 服务器预装在 Mac OsX 上,您无需安装任何额外的软件包。只需要做一些系统设置。要在 Mac OS X 上启用 OpenSSH 服务器,请打开系统偏好设置并单击共享。然后,选中“远程登录”框以启用 SSH,然后从“允许访问”部分中选择标记为“所有用户”的单选按钮。

您现在可以通过 ssh 访问远程主机。

现在,您必须创建一个公共访问密钥,以便通过 ssh 从本地访客机器到远程主机进行无密码访问。为此,您必须稍微弄脏手。:)

首先,确定您是否已经拥有身份验证密钥。在终端中,运行:

sudo ls -la /var/root/.ssh

如果您看到“id_dsa”和id_dsa.pub,那么您可以跳过本节的其余部分。

在客户端机器上,在终端中运行以下命令:

sudo ssh-keygen -t dsa -f /private/var/root/.ssh/id_dsa -C "comment about this key"

在本地访客机器上创建访问密钥后,您需要将访客的公钥复制到主机的authorized_keys文件中。您可以使用一个简单的终端命令来完成此操作,该命令将公钥附加到授权密钥列表中:

sudo cat /private/var/root/.ssh/id_dsa.pub | ssh root@remote_host_address 'cat - >> ~/.ssh/authorized_keys'

下面的命令会将本地来宾计算机中的根文件系统增量备份到远程主机上:

/usr/local/bin/rsync -aNHAXx --protect-args --fileflags --force-change --rsync-path="/usr/local/bin/rsync" / root@remote_host_address:/Volumes/Backup/GuestMachine

您可以更改 rsync 的参数以更改同步行为。如果将此命令添加到crontab 中,则可以在任何时间周期内运行同步。例如:

sudo crontab -e

将下面的行附加到 crontab:

*/30 * * * * /usr/local/bin/rsync -aNHAXx --protect-args --fileflags --force-change --rsync-path="/usr/local/bin/rsync" / root@remote_host_address:/Volumes/Backup/GuestMachine

这将每半小时同步运行一次。

这是示例 Python 脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Cron automated synchronization script.

Desc: Synchronize remote folder into local machine. Duplicate processes 
      are disallowed until running process finished.

Usage:
    :: Change required variables as _user, _password, _domain etc.
    :: Edit crontab 
    # crontab -e

    :: Append line below.
    */30 * * * * python synchronizator.py 2>&1 &

Author: Sencer HAMARAT (RecNes)
E-Mail: sencerhamarat@gmail.com
"""

import shlex
from subprocess import Popen, PIPE
import logging as log
import sys

__author__ = "Sencer HAMARAT"

_user = 'username'
_password = 'password'
_domain = 'example.com'

_expectation = "Enter passphrase for key \'/home/%s/.ssh/id_rsa\':" % _user
_rsync = '/usr/bin/rsync --partial --progress -avvz -e'
_pub_key = '/home/%s/.ssh/id_rsa.pub' % _user
_ssh = '/usr/bin/ssh -i %s' % _pub_key
_remoteDir = '/home/%s/backup/' % _user
_localDir = '/home/%s/backup/' % _user
_command = '%s %s %s@%s:%s %s' % (_rsync, _ssh, _user, _domain, _remoteDir, _localDir)
run_command = shlex.split(_command)

_logFile = "logfile.log"
_logFormat = "%(asctime)s %(levelname)s %(name)s %(process)d %(threadName)s %(module)s:%(lineno)d %(funcName)s() " \
             "%(message)s\n"
log.basicConfig(filename=_logFile, level=log.DEBUG, format=_logFormat)

log.debug(u'Command will run: %s' % _command)

try:
    running_command = Popen(run_command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    if running_command.poll():
        log.debug(repr(running_command.poll()))
        sys.exit()
    if _expectation in running_command.communicate():
        running_command.communicate(_password)
    print running_command.communicate()
except Exception as e:
    log.debug(repr(e))
finally:
    sys.exit()
Run Code Online (Sandbox Code Playgroud)


Law*_*nce 8

如果您想要基于 Web 的访问,Owncloud是一个可能的解决方案。

您将需要自己的服务器来托管 Owncloud,但它更像是一个基于服务器的解决方案,您的 2 个客户端可以随意访问他们需要的内容,但只有 1 个相关文件的副本,该副本将位于自己的云服务器。