Поддерживайте удаленный каталог в актуальном состоянии

Мне очень нравится возможность поддерживать удаленный каталог в актуальном состоянии в Winscp . К сожалению, я не могу найти ничего более простого в использовании в OS X или Linux. Я знаю, что то же самое теоретически может быть достигнуто с помощью changefiles или rsync , но я всегда находил учебники для обоих инструментов отсутствующими и / или противоречивыми.

Мне просто нужен инструмент, который работает в OSX или Linux и поддерживает синхронизацию (зеркальное отображение) удаленного каталога с локальным каталогом, в то время как я делаю изменения в локальном каталоге.


Обновить

Просматривая решения, я вижу пару, которая решает общую проблему синхронизации удаленного каталога с локальным каталогом вручную . Я знаю, что могу установить задачу cron для запуска rsync каждую минуту, и это должно быть довольно близко к реальному времени.

Это не точное решение, которое я искал, поскольку winscp делает это и многое другое: он обнаруживает изменения файлов в каталоге (пока я работаю над ними), а затем автоматически отправляет изменения на удаленный сервер. Я знаю, что это не лучшее решение (без репозитория кода), но оно позволяет мне очень быстро тестировать код на сервере во время его разработки. Кто-нибудь знает, как объединить rsync с любыми другими командами, чтобы получить эту функциональность?

12.08.2008 21:56:10
getdropbox.com (упомянутый Скоттом) обнаружит изменения файлов в каталоге dropbox и его подкаталогах (пока вы над ними работаете), а затем автоматически отправит изменения на все компьютеры, связанные с вашей учетной записью dropbox.
jfs 14.11.2008 18:16:02
17 ОТВЕТОВ
РЕШЕНИЕ

Как в режиме реального времени вы хотите синхронизацию? Я все еще склонялся бы к rsync, так как вы знаете, что он будет полностью поддерживаться на обеих платформах (Windows также с Cygwin), и вы можете запустить его с помощью задания cron. У меня есть супер-простой файл bash, который я запускаю в своей системе (это не удаляет старые файлы):

#!/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 (по состоянию на 16 августа 2008 г.).

17
5.11.2014 19:19:01
На самом деле, -aподразумевается -r. Смотрите, мужчина rsync .
Anton Rudeshko 5.11.2014 19:02:41
Это двунаправленный?
ThorSummoner 21.07.2015 18:16:44
@dwj, возможно, вы захотите изменить свой ответ на использование SSH, поскольку rsync может иногда быть закрытым портом (чаще, чем SSH).
einpoklum 25.09.2015 08:59:02
Какой тип синхронизации это будет делать? Поддерживать удаленные каталоги в актуальном состоянии с локальными? Наоборот? Или это синхронизирует оба направления и сохранит самое новое?
Chris Smith 29.10.2015 20:27:38

Вы всегда можете использовать управление версиями, например SVN, поэтому все, что вам нужно сделать, это заставить сервер запускать svn в папке каждую ночь. Это приводит к проблемам безопасности, если вы публикуете свои файлы публично, но это работает.

Если вы используете Linux, научитесь использовать rsync. Это действительно не так сложно, так как вы можете проверить каждую команду с помощью -n. Перейдите на страницу руководства, основной формат, который вы хотите, это

rsync [ОПЦИЯ ...] SRC ... [ПОЛЬЗОВАТЕЛЬ @] ВЕДУЩИЙ: DEST

команда, которую я запускаю со своего школьного сервера на домашнюю резервную машину, это

rsync -avi --delete ~ me @ homeserv: ~ / Школа / >> BackupLog.txt

Это берет все файлы в моем домашнем каталоге (~) и использует режим архива rsync (-a), verbosly (-v), перечисляет все сделанные изменения (-i), удаляя файлы, которые больше не существуют. (--delete) и помещает в папку / home / me / School / на моем удаленном сервере. Вся распечатанная информация (что было скопировано, что было удалено и т. Д.) Также добавляется в файл BackupLog.txt.

Я знаю, что это вихревой тур по rsync, но я надеюсь, что это поможет.

2
12.08.2008 22:17:34

Эти rsyncрешения очень хороши, особенно если вы только толкая меняющий путь. Еще один замечательный инструмент unison- он пытается синхронизировать изменения в обоих направлениях. Узнайте больше на домашней странице Unison .

2
12.08.2008 23:01:14

Чтобы обнаружить измененные файлы, вы можете попробовать fam (монитор изменений файлов) или inotify. Последний специфичен для Linux, у fam есть порт bsd, который может работать на OS X. Оба имеют инструменты пользовательского пространства, которые могут использоваться в скрипте вместе с rsync.

4
13.08.2008 00:24:41

Похоже, вы решаете не ту проблему. Если вы пытаетесь редактировать файлы на удаленном компьютере, вы можете попробовать использовать что-то вроде плагина ftp для jedit. http://plugins.jedit.org/plugins/?FTP Это гарантирует, что у вас есть только одна версия файла, поэтому он никогда не будет синхронизирован.

1
13.08.2008 00:32:05

Вы также можете использовать Fetch в качестве SFTP-клиента, а затем редактировать файлы непосредственно на сервере. Существуют также параметры SSHFS (монтирование папки ssh в качестве тома). Это соответствует тому, что сказали стимулы - вы уверены, что хотите синхронизировать содержимое или просто хотите редактировать файлы на сервере?

OS X имеет свою собственную систему уведомлений о файлах - это то, на чем основан Spotlight. Я не слышал ни о какой программе, которая использует это, чтобы затем синхронизировать вещи, но это, конечно, возможно.

Я лично использую RCS для такого типа вещей: - хотя у него есть ручной аспект, маловероятно, что я захочу что-то перенести даже на тестовый сервер с моей машины разработчика без предварительного тестирования. И если я работаю на сервере разработки, я использую один из вариантов, приведенных выше.

0
18.08.2008 14:41:18

Основываясь на предложении icco о SVN, я бы на самом деле предположил, что если вы используете subversion или подобное для управления исходным кодом (а если нет, то, вероятно, вам следует начать), вы можете поддерживать производственную среду в актуальном состоянии, введя команду обновить хранилище в хук post-commit.

Есть много переменных в том, как вы хотите это сделать, но то, что я видел в работе, это то, что рабочий или рабочий сайт должен быть рабочей копией, а затем после фиксации использовать ключ ssh с принудительной командой Войдите на удаленный сайт и активируйте svn на рабочей копии. В качестве альтернативы в ловушке post-commit вы можете запустить экспорт svn на удаленной машине или локальный (в хранилище svn) svn, а затем выполнить rsync на удаленную машину.

Я бы беспокоился о вещах, которые обнаруживают изменения и толкают их, и я бы даже волновался о вещах, которые запускаются каждую минуту, просто из-за условий гонки. Как вы знаете, что он не будет передавать файл в тот же момент, когда он записывается? Наткнитесь на это один или два раза, и вы потеряете все экономящее время преимущество, которое вы имели, постоянно выполняя или аналогичные операции.

1
16.09.2008 15:13:37

Будет ли DropBox ( http://www.getdropbox.com/ ) делать то, что вы хотите?

1
22.09.2008 02:23:01

Что вы хотите сделать для удаленного доступа в Linux, так это использовать sshfs - файловую систему SSH.

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

Тогда относитесь к нему как к сетевому креплению, которое ...

Немного подробнее, например, как настроить его, чтобы вы могли сделать это как обычный пользователь, в моем блоге

Если вы хотите асинхронное поведение winSCP, вам нужно использовать rsync в сочетании с тем, что периодически выполняет его. Решение cron выше работает, но может быть излишним для варианта использования winscp.

Следующая команда будет выполнять rsync каждые 5 секунд, чтобы передать содержимое на удаленный хост. Вы можете настроить время ожидания по мере необходимости, чтобы уменьшить нагрузку на сервер.

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

Если у вас очень большая структура каталогов и вам нужно уменьшить нагрузку на опрос, вы можете использовать 'find':

# 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.

т.п.н.

9
14.11.2008 17:52:08
Э-э, ссылка на ваш блог не содержит подробностей о том, как обращаться с sshfs как с сетевым монтированием.
ThorSummoner 21.07.2015 17:09:08
Какое преимущество имеет sshfs по сравнению с синхронизацией напрямую с удаленным хостом в этой ситуации? это похоже на ненужные накладные расходы, и по моему опыту sshfs может иногда отключаться.
nick fox 23.12.2016 11:11:45

У меня такая же проблема. Мне понравилась команда winscp "держать удаленный каталог в актуальном состоянии". Однако в своем стремлении избавиться от Windows я потерял winscp. Я написал сценарий, который использует файловый обмен и rsync, чтобы сделать что-то похожее гораздо ближе к реальному времени.

Как пользоваться:

  • Убедитесь, что вы изменили файлы
  • Сохраните этот сценарий в / usr / local / bin / aliveync или в другом месте, доступном в вашем $ PATH, и сделайте его исполняемым
  • Используйте Nautilus для подключения к удаленному хосту (sftp или ftp)
  • Запустите этот скрипт, выполнив liveync SOURCE DEST
  • Каталог DEST будет находиться в /home/[username]/.gvfs/[path для ftp scp или чего-либо другого]

Пара минусов:

  • Это медленнее, чем winscp (я думаю, потому что он проходит через Nautilus и должен также обнаруживать изменения через rsync)
  • Вы должны вручную создать каталог назначения, если он еще не существует. Поэтому, если вы добавляете каталог, он не обнаружит и не создаст каталог на стороне DEST.
  • Вероятно, больше, что я еще не заметил
  • Также не пытайтесь синхронизировать каталог SRC с именем «rsyncThis». Это, вероятно, не будет хорошо :)

#!/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
3
31.05.2011 16:25:57

Раньше у меня были те же настройки под Windows, что и у вас, это локальное файловое дерево (с версиями) и тестовая среда на удаленном сервере, которые я отражал в реальном времени с помощью WinSCP. Когда я переключился на Mac, мне пришлось немного покопаться, прежде чем я был счастлив, но в итоге я использовал:

  • SmartSVN как мой подрывной клиент
  • Sublime Text 2 в качестве моего редактора (уже использовал его в Windows)
  • SFTP-плагин для ST2, который обрабатывает загрузку при сохранении (извините, не могу опубликовать более 2 ссылок)

Я действительно могу порекомендовать эту настройку, надеюсь, это поможет!

1
10.05.2018 00:16:29

Ну, у меня была такая же проблема, и возможно использовать их вместе: rsync, SSH Passwordless Login, Watchdog (утилита синхронизации Python) и Terminal Notifier (утилита уведомлений OS X, сделанная с Ruby. Не нужна, но помогает узнать когда синхронизация закончится).

  1. Я создал ключ для входа в систему без пароля, используя это руководство из вики Dreamhost: http://cl.ly/MIw5

    1.1. Когда вы закончите, проверьте, все ли в порядке ... если вы не можете войти в систему без пароля, возможно, вам стоит попробовать afp mount. Dreamhost (где мой сайт) не разрешает монтирование afp, но разрешает вход без пароля. В терминале введите:

    ssh username@host.com Вы должны войти в систему без ввода пароля: P

  2. Я установил Terminal Notifier со страницы Github: http://cl.ly/MJ5x

    2.1. Я использовал команду установщика Gem. В Терминале введите:

    gem install terminal-notifier

    2,3. Проверьте, работает ли уведомление. В Терминале введите:

    terminal-notifier -message "Starting sync"

  3. Создайте скрипт 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 фактически синхронизирует вашу локальную папку с удаленной папкой.

  4. Наконец, я скачал и установил Watchdog со страницы Github: http://cl.ly/MJfb

    4.1. Во-первых, я установил зависимость libyaml с помощью Brew (есть много полезного, как установить Brew - как «aptitude» для OS X). В Терминале введите:

    brew install libyaml

    4.2. Затем я использовал команду «easy_install». Перейдите в папку Watchdog и введите в Терминале:

    easy_install watchdog

  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.

    Теперь внесите некоторые изменения в файл внутри папки и наблюдайте за волшебством!

0
21.01.2013 09:25:35

lsyncd кажется идеальным решением. он объединяет inotify (встроенная функция ядра, которая отслеживает изменения файлов в деревьях каталогов) и rsync (кроссплатформенный инструмент синхронизации файлов).

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

Цитата из github:

Lsyncd отслеживает интерфейс монитора событий деревьев локальных каталогов (inotify или fsevents). Он объединяет и объединяет события в течение нескольких секунд, а затем запускает один (или более) процесс (ы) для синхронизации изменений. По умолчанию это rsync. Таким образом, Lsyncd представляет собой облегченное решение для живого зеркала, которое сравнительно легко установить, не требующее новых файловых систем или блочных устройств, и не снижающее производительность локальной файловой системы.

41
9.02.2017 07:33:13
Это лучше, он будет синхронизировать файлы только при обнаруженных изменениях.
FaceBro 19.03.2014 09:38:45
выглядит так, как я искал несколько недель назад !! Я попробовал unison, несколько толстых серверов для обмена файлами, sshfs: все было плохо. ИМХО rsync не стоит рассматривать эту задачу (если только мы не хотим тратить время на ее настройку вместе с inotify или аналогичной) ... Пока что lsyncd выглядит хорошо!
Shautieh 16.09.2015 20:33:22
Что произойдет, если изменения произойдут, когда ваш компьютер не подключен к удаленному? Будет ли lsyncd вести учет этих изменений на потом?
einpoklum 25.09.2015 08:59:53

Я использую этот маленький Ruby-Script:

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

Адаптируйте его под свои нужды!

0
27.06.2014 15:36:31

Пользователь watcher.py и rsync для автоматизации этого. Прочитайте следующие пошаговые инструкции здесь:

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

1
20.02.2015 18:39:19

Если вы разрабатываете Python на удаленном сервере, Pycharm может быть хорошим выбором для вас. Вы можете синхронизировать удаленные файлы с локальными файлами, используя функцию удаленной разработки Pycharm. Ссылка на руководство, как: https://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html

0
9.05.2019 02:52:21

Отличный вопрос я искал ответ часами!

Я проверил lsyncd, и проблема в том, что задержка по умолчанию слишком велика, и ни одна из примеров командной строки не дает такую -delayвозможность.

Другая проблема заключается в том, что по умолчанию rsync каждый раз спрашивает пароль !

Решение с помощью lsyncd :

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

Другой способ - использовать inotify-wait в скрипте:

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

1
22.06.2019 17:57:37