Подтвердить что ты не робот

Храните удаленную директорию в актуальном состоянии

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

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


Обновление

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

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

4b9b3361

Ответ 1

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

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

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

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

Цитата из github:

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

Ответ 3

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

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

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

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

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

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

# while true; do rsync -avrz localdir [email protected]: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 [email protected]:path; else echo -ne .; fi; sleep 5; done

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

кб

Ответ 4

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

Ответ 5

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

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

  • Убедитесь, что у вас установлен файл.
  • Сохраните этот script в /usr/local/bin/livesync или где-нибудь в вашей $PATH и сделайте его выполнимым
  • Используйте Nautilus для подключения к удаленному хосту (sftp или ftp)
  • Запустите этот script, выполнив 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

Ответ 6

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

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

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

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

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

Ответ 11

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

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

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

Ответ 13

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

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

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

Ответ 14

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

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

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

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

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

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

    gem install terminal-notifier

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

    terminal-notifier -message "Starting sync"

  • Создайте sh script, чтобы протестировать уведомление 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. Не забудьте предоставить разрешение на выполнение этого sh script. В терминале введите:

    sudo chmod 777 ~/Scripts/sync.sh  3.2. Запустите script и проверьте правильность отображения сообщений, и rsync фактически синхронизирует вашу локальную папку с удаленной папкой.

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

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

    brew install libyaml

    4,2. Затем я использовал команду easy_install. Перейдите в папку Watchdog и введите Terminal:

    easy_install watchdog

  • Теперь все установлено! Перейдите в папку, которую вы хотите синхронизировать, измените этот код на свои нужды и введите терминал:

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

    Он должен быть ТОЧНО таким образом, с помощью слэшей и разрывов строк, поэтому вам придется скопировать эти строки в текстовый редактор, изменить script, вставить терминал и нажать вернуться.

    Я пробовал без разрывов строк, и он не работает!

    В моем 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.

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

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

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

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

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

lsyncd --nodaemon -rsyncssh local_dir [email protected]_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 [email protected]_host:remote_dir
done

Для этого второго решения вам нужно будет установить пакет inotify-tools

Чтобы исключить необходимость ввода пароля при каждом изменении, просто используйте ssh-keygen: https://superuser.com/a/555800/510714