2008-08-12 3 views
34

Я абсолютно люблю функцию Keep Remote Directory Up-to-date в Winscp. К сожалению, я не могу найти ничего простого в использовании в OS X или Linux. Я знаю то же самое, может быть, теоретически будет выполнено с использованием changedfiles или rsync, но я всегда находил, что учебники для обоих инструментов не нужны и/или противоречивы.Держите удаленный каталог актуальным

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


Update

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

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

+0

getdropbox.com (упомянутый Скотт) обнаружит изменения файлов в директории Dropbox и его подкаталогов (в то время как вы работаете на них), а затем автоматически будет толкать изменения для всех компьютеров, которые связаны с вашей учетной записью Dropbox. – jfs 2008-11-14 18:16:02

ответ

15

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

#!/bin/sh 
rsync -avrz --progress --exclude-from .rsync_exclude_remote . [email protected]_computer:remote_dir  

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

Лучше всего установить его и попробовать его. Опция -n (--dry-run) - ваш друг!

Имейте в виду, что rsync (по крайней мере, в cygwin) не поддерживает имена файлов Unicode (по состоянию на 16 августа 2008 г.).

+2

На самом деле, `-a` подразумевает` -r`. См. [Man rsync] (http://manpages.ubuntu.com/manpages/precise/en/man1/rsync.1.html#contenttoc12). – 2014-11-05 19:02:41

+1

Является ли это двунаправленным? – ThorSummoner 2015-07-21 18:16:44

+0

@dwj, возможно, вы захотите изменить свой ответ на использование SSH, поскольку rsync напрямую может быть закрытым портом (чаще, чем SSH). – einpoklum 2015-09-25 08:59:02

1

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

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

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

команда Я бегу из моего школьного сервера к домашней резервной копии машины это

Rsync -AVI --delete ~ я @ homeserv: ~/Школа/>> BackupLog.txt

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

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

2

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

4

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

1

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

0

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

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

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

1

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

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

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

8

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

# sshfs [email protected]:path/to/directory local_dir 

Затем обработайте его как сетевое крепление, которое оно ...

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

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

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

# while true; do rsync -avrz localdir [email protected]:path; sleep 5; done 

Если у вас есть очень большая структура каталогов и необходимо снизить накладные расходы опроса, вы можете использовать «найти»:

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

И я сказал хрон может быть избыточна? Но по крайней мере все это делается только из командной строки и может быть остановлено с помощью ctrl-C.

kb

3

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

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

  • Убедитесь, что вы fileschanged установили
  • Сохранить этот скрипт в/USR/местные/бен/LiveSync или где достижима в вашем $ PATH и сделайте его исполняемым
  • Использование Nautilus для подключения к удаленному хосту (SFTP или FTP)
  • Выполнить этот скрипт, делая LiveSync ИСТОЧНИК DEST
  • каталог DEST будет в/рупор Е./[Имя пользователя]/GVFS/[путь к FTP УПП или что-то]

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

  • Это медленнее, чем 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 
1

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

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

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

0

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

  1. Я создал ключ к Беспарольному Войти с помощью этого учебника из Dreamhost вики: http://cl.ly/MIw5

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

    ssh [email protected] Вы должны войти в систему без пароля спрашивают: P

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

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

    gem install terminal-notifier

    2.3. Тест, если уведомление works.In терминал, тип:

    terminal-notifier -message "Starting sync"

  3. Создать скрипт ш, чтобы проверить Rsync + уведомление. Сохраните его в любом месте, вам понравится. В этом примере я буду называть его ~/Scripts/sync.sh Я использовал»расширение .sh, но я не знаю, если его необходимо.

    #!/bin/bash terminal-notifier -message "Starting sync" rsync -azP ~/Sites/folder/ [email protected]:site_folder/ terminal-notifier -message "Sync has finished"

    3.1. Не забудьте дать разрешение выполнения на этот ш сценарий в Терминале введите:..

    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. Теперь все будет установлено! Go папку вы хотите синхронизировать, изменение этого кода для ваших нужд и типа в терминале:

    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.

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

38

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

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

Цитата GitHub:

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

0

Я использую этот маленький Руби-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 

Адаптировать его для ваших нужд!