关于linux:保持最新的远程目录

关于linux:保持最新的远程目录

Keep Remote Directory Up-to-date

我绝对喜欢Winscp中的"保持远程目录最新"功能。不幸的是,我找不到在OS X或Linux中使用起来那么简单的东西。从理论上讲,我知道可以使用更改文件或rsync来完成同一件事,但是我始终发现这两种工具的教程都缺乏和/或矛盾。

我基本上只需要一个可以在OSX或Linux上运行的工具,并在对本地目录进行更改时使远程目录与本地目录保持同步(镜像)。

更新资料

通过这些解决方案,我看到了一对夫妇,它们解决了手动保持远程目录与本地目录同步的一般问题。我知道我可以将cron任务设置为每分钟运行rsync,这应该非常接近实时。

这不是我一直在寻找的确切解决方案,因为winscp会执行此操作以及更多操作:它会检测目录中的文件更改(在我处理它们时),然后自动将更改推送到远程服务器。我知道这不是最好的解决方案(没有代码存储库),但是它允许我在开发代码时非常快速地在服务器上测试代码。有谁知道如何将rsync与其他命令结合使用以获得此功能?


lsyncd似乎是完美的解决方案。它结合了inotify(内核内置函数,用于监视目录树中的文件更改)和rsync(跨平台文件同步工具)。

1
lsyncd -rsyncssh /home remotehost.org backup-home/

从github引用:

Lsyncd watches a local directory trees event monitor interface (inotify or fsevents). It aggregates and combines events for a few seconds and then spawns one (or more) process(es) to synchronize the changes. By default this is rsync. Lsyncd is thus a light-weight live mirror solution that is comparatively easy to install not requiring new filesystems or blockdevices and does not hamper local filesystem performance.


您希望如何"实时"同步?我仍然倾向于rsync,因为您知道它将在两个平台(Windows,也与cygwin)上完全受支持,并且您可以通过cron作业运行它。我有一个在系统上运行的超简单bash文件(这不会删除旧文件):

1
2
3
4
5
6
7
8
#!/bin/sh
rsync -avrz --progress --exclude-from .rsync_exclude_remote . remote_login@remote_computer:remote_dir    

# options
#   -a  archive
#   -v  verbose
#   -r  recursive
#   -z  compress

最好的选择是进行设置并尝试一下。 -n (--dry-run)选项是您的朋友!

请记住,rsync(至少在cygwin中)不支持Unicode文件名(截至2008年8月16日)。


对于Linux远程访问,您要使用SSH文件系统'sshfs'。

1
# sshfs username@host:path/to/directory local_dir

然后将其视为网络安装,这是...

在我的博客上有更多详细信息,例如如何设置它,以便您可以以普通用户身份进行操作

如果您想要winSCP的异步行为,则需要将rsync与定期执行它的东西结合使用。上面的cron解决方案可以工作,但是对于winscp用例来说可能会显得有些过时。

以下命令每5秒执行一次rsync,将内容推送到远程主机。您可以根据需要调整睡眠时间以减少服务器负载。

1
# while true; do rsync -avrz localdir user@host:path; sleep 5; done

如果您的目录结构非常大,并且需要减少轮询的开销,则可以使用"查找":

1
# touch -d 01/01/1970 last; while true; do if ["`find localdir -newer last -print -quit`" ]; then touch last; rsync -avrz localdir user@host:path; else echo -ne .; fi; sleep 5; done

我说过cron可能会过分杀人?但是至少这一切都是从命令行完成的,可以通过ctrl-C停止。

千位


要检测更改的文件,您可以尝试使用fam(文件更改监视器)或inotify。后者是特定于linux的,fam具有一个bsd端口,该端口可能在OS X上运行。两者都具有可以与rsync一起在脚本中使用的用户空间工具。


我有同样的问题。我喜欢winscp"保持远程目录最新"命令。但是,为了摆脱Windows,我丢失了winscp。我确实编写了一个脚本,该脚本使用fileschanged和rsync来进行类似于实时的操作。

如何使用:

  • 确保已安装文件更改
  • 将此脚本保存在/ usr / local / bin / livesync或$ PATH可以访问的某个位置,并使其可执行
  • 使用Nautilus连接到远程主机(sftp或ftp)
  • 通过执行livesync SOURCE DEST运行此脚本
  • DEST目录位于/ home / [用户名] /。gvfs / [ftp scp或其他路径]

几个缺点:

  • 它比winscp慢(我猜是因为它通过Nautilus,并且还必须通过rsync检测更改)
  • 如果目标目录尚不存在,则必须手动创建它。因此,如果要添加目录,它将不会在DEST端检测到目录并创建目录。
  • 可能还有更多我还没有注意到的东西
  • 另外,请勿尝试同步名为" rsyncThis"的SRC目录。那可能不是很好:)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh

upload_files()
{
    if ["$HOMEDIR" ="." ]
    then
        HOMEDIR=`pwd`
    fi

    while read  input
    do
        SYNCFILE=${input#$HOMEDIR}
        echo -n"Sync File: $SYNCFILE..."
        rsync -Cvz --temp-dir="$REMOTEDIR""$HOMEDIR/$SYNCFILE""$REMOTEDIR/$SYNCFILE"> /dev/null
        echo"Done."
    done
}


help()
{
    echo"Live rsync copy from one directory to another.  This will overwrite the existing files on DEST."
    echo"Usage: $0 SOURCE DEST"    
}


case"$1" in
  rsyncThis)
    HOMEDIR=$2
    REMOTEDIR=$3
    echo"HOMEDIR=$HOMEDIR"
    echo"REMOTEDIR=$REMOTEDIR"
    upload_files
    ;;

  help)
    help
    ;;

  *)
    if [ -n"$1" ] && [ -n"$2" ]
    then
        fileschanged -r"$1" |"$0" rsyncThis"$1""$2"
    else
        help
    fi
    ;;
esac

rsync解决方案确实很好,特别是如果您仅以一种方式推动更改。另一个很棒的工具是unison-它尝试同步两个方向上的更改。在Unison主页上了解更多信息。


您可以始终使用版本控制,例如SVN,因此您要做的就是每天晚上使服务器在文件夹中运行svn。如果您要公开共享文件,则会遇到安全问题,但是它可以工作。

如果您使用的是Linux,请学习使用rsync。确实没有那么困难,因为您可以使用-n测试每个命令。浏览手册页,您想要的基本格式是

rsync [OPTION...] SRC... [USER@]HOST:DEST

我从学校服务器运行到家庭备用计算机的命令是这个

rsync -avi --delete ~ me@homeserv:~/School/ >> BackupLog.txt

这将获取我主目录(?)中的所有文件,并使用rsync的存档模式(-a),详细地(-v),列出所有已进行的更改(-i),同时删除不再存在的任何文件(-删除),然后将放在我的远程服务器上的文件夹/ home / me / School /中。它打印出的所有信息(复制的内容,删除的内容等)也都附加到文件BackupLog.txt中

我知道这是rsync的旋风之旅,但我希望它能有所帮助。


我曾经在Windows下使用与您相同的设置,即本地文件树(版本化)和远程服务器上的测试环境,并使用WinSCP对其进行实时镜像。当我切换到Mac时,我不得不做一些挖掘工作才感到高兴,但最终还是使用了:

  • SmartSVN作为我的Subversion客户端
  • Sublime Text 2作为我的编辑器(已在Windows上使用)
  • ST2的SFTP插件,可在保存时处理上传(抱歉,发布的链接不能超过2个)

我真的可以推荐此设置,希望对您有所帮助!


好问题,我已经搜寻了几个小时的答案!

我已经测试过lsyncd,问题是默认延迟太长,并且没有示例命令行提供-delay选项。

另一个问题是默认情况下rsync每次都会询问密码!

lsyncd解决方案:

1
lsyncd --nodaemon -rsyncssh local_dir remote_user@remote_host remote_dir -delay .2

另一种方法是在脚本中使用inotify-wait:

1
2
3
4
while inotifywait -r -e modify,create,delete local_dir ; do
    # if you need you can add wait here
    rsync -avz local_dir remote_user@remote_host:remote_dir
done

对于第二个解决方案,您将必须安装inotify-tools软件包

为了避免每次更改都需要输入密码,只需使用ssh-keygen
https://superuser.com/a/555800/510714


用户watcher.py和rsync可以自动执行此操作。在此处阅读以下分步说明:

http://kushellig.de/linux-file-auto-sync-directories/


根据icco对SVN的建议,我实际上建议,如果您正在使用Subversion或类似版本进行源代码控制(如果没有,则应该开始使用),可以通过以下命令使生产环境保持最新状态将存储库更新为提交后挂钩。

在执行此操作时,有很多变量,但是我看到的工作是将开发或活动站点作为工作副本,然后在提交后使用带有强制命令的ssh键登录到远程站点并触发工作副本上的svn。或者,在提交后挂钩中,您可以触发远程计算机上的svn导出,或者触发本地(到svn存储库)的svn导出,然后触发rsync到远程计算机。

我会担心检测到变化并推动变化的事物,甚至会因为种族条件而担心每分钟运行的事物。您怎么知道它不会在写入文件的那一刻传送文件?偶然碰到一次或两次,您将失去不断进行同步或类似操作所具有的所有节省时间的优势。


似乎您正在解决错误的问题。如果您要在远程计算机上编辑文件,则可以尝试使用诸如jedit的ftp插件之类的东西。 http://plugins.jedit.org/plugins/?FTP这样可确保您只有该文件的一个版本,因此它永远不会不同步。


DropBox(http://www.getdropbox.com/)会做什么吗?


好吧,我遇到了同样的问题,可以将它们一起使用:rsync,SSH无密码登录,Watchdog(Python同步实用程序)和Terminal Notifier(由Ruby制成的OS X通知实用程序)。不需要,但有助于了解同步完成后)。

  • 我使用Dreamhost Wiki:http://cl.ly/MIw5的本教程创建了无密码登录的密钥。

    1.1。完成后,测试是否一切正常……如果无法无密码登录,也许您必须尝试进行afp挂载。 Dreamhost(我的网站所在的位置)不允许afp挂载,但允许无密码登录。在终端中,键入:

    ssh username@host.com

    您应该登录时不要求输入密码:P

  • 我从Github页面安装了终端通知程序:http://cl.ly/MJ5x

    2.1。我使用了Gem安装程序命令。在终端中,键入:

    gem install terminal-notifier

    2.3。测试通知是否有效。在"终端"中,键入:

    terminal-notifier -message"Starting sync"

  • 创建一个sh脚本来测试rsync +通知。使用您喜欢的名称将其保存在您喜欢的任何位置。在此示例中,我将其称为?/ Scripts / sync.sh我使用了" .sh扩展名,但是我不知道是否需要它。

    #!/bin/bash
    terminal-notifier -message"Starting sync"
    rsync -azP ~/Sites/folder/ user@host.com:site_folder/
    terminal-notifier -message"Sync has finished"

    3.1。请记住要授予对此sh脚本的执行权限。在终端中,键入:

    sudo chmod 777 ~/Scripts/sync.sh

    3.2。运行脚本并验证消息是否正确显示,并且rsync实际上将本地文件夹与远程文件夹同步。

  • 最后,我从Github页面下载并安装了Watchdog:http://cl.ly/MJfb

    4.1。首先,我使用Brew安装了libyaml依赖关系(如何安装Brew有很多帮助-就像OS X的"能力"一样)。在终端中,键入:

    brew install libyaml

    4.2。然后,我使用了" easy_install命令"。进入看门狗的文件夹,然后输入Terminal:

    easy_install watchdog

  • 现在,一切都已安装!转到要同步的文件夹,根据需要更改此代码,然后输入Terminal:

    1
    2
    3
    4
    5
      watchmedo shell-command
          --patterns="*.php;*.txt;*.js;*.css" \\
          --recursive \\
          --command='~/Scripts/Sync.sh' \\
          .

    它必须完全是这种方式,并带有斜线和换行符,因此您必须将这些行复制到文本编辑器,更改脚本,粘贴到终端并按回车键。

    我尝试了没有换行符,但它不起作用!

    在我的Mac中,我总是会收到一个错误,但似乎没有任何影响:

    /Library/Python/2.7/site-packages/argh-0.22.0-py2.7.egg/argh/completion.py:84: UserWarning: Bash completion not available. Install argcomplete.

    现在,在文件夹内的文件中进行一些更改,然后观看魔术!


  • 我正在使用这个小的Ruby脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #!/usr/bin/env ruby
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Rsyncs 2Folders
    #
    # watchAndSync by Mike Mitterer, 2014 <http://www.MikeMitterer.at>
    # with credit to Brett Terpstra <http://brettterpstra.com>
    # and Carlo Zottmann <https://github.com/carlo/haml-sass-file-watcher>
    # Found link on: http://brettterpstra.com/2011/03/07/watch-for-file-changes-and-refresh-your-browser-automatically/
    #

    trap("SIGINT") { exit }

    if ARGV.length < 2
      puts"Usage: #{$0} watch_folder sync_folder"
      puts"Example: #{$0} web keepInSync"
      exit
    end

    dev_extension = 'dev'
    filetypes = ['css','html','htm','less','js', 'dart']

    watch_folder = ARGV[0]
    sync_folder = ARGV[1]

    puts"Watching #{watch_folder} and subfolders for changes in project files..."
    puts"Syncing with #{sync_folder}..."

    while true do
      files = []
      filetypes.each {|type|
        files += Dir.glob( File.join( watch_folder,"**","*.#{type}" ) )
      }
      new_hash = files.collect {|f| [ f, File.stat(f).mtime.to_i ] }
      hash ||= new_hash
      diff_hash = new_hash - hash

      unless diff_hash.empty?
        hash = new_hash

        diff_hash.each do |df|
          puts"Detected change in #{df[0]}, syncing..."
          system("rsync -avzh #{watch_folder} #{sync_folder}")
        end
      end

      sleep 1
    end

    适应您的需求!


    您也可以将Fetch用作SFTP客户端,然后直接从中在服务器上编辑文件。还有SSHFS(将ssh文件夹安装为卷)选项。这与stims所说的一致-您确定要使内容保持同步,还是只想编辑服务器上的文件?

    OS X拥有自己的文件通知系统-这是Spotlight所基于的。我还没有听说过任何使用它来保持同步的程序,但这当然是可以想象的。

    我个人使用RCS来进行此类操作:-尽管它具有手动方面的功能,但我不太可能想在不先进行测试的情况下将某些东西从我的开发机推入测试服务器。如果我在开发服务器上工作,则可以使用上面给出的选项之一。


    如果您正在远程服务器上开发python,Pycharm可能是您的不错选择。您可以使用pycharm远程开发功能将远程文件与本地文件同步。指南链接为:
    https://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html


    推荐阅读