Мне очень нравится возможность поддерживать удаленный каталог в актуальном состоянии в Winscp . К сожалению, я не могу найти ничего более простого в использовании в OS X или Linux. Я знаю, что то же самое теоретически может быть достигнуто с помощью changefiles или rsync , но я всегда находил учебники для обоих инструментов отсутствующими и / или противоречивыми.
Мне просто нужен инструмент, который работает в OSX или Linux и поддерживает синхронизацию (зеркальное отображение) удаленного каталога с локальным каталогом, в то время как я делаю изменения в локальном каталоге.
Обновить
Просматривая решения, я вижу пару, которая решает общую проблему синхронизации удаленного каталога с локальным каталогом вручную . Я знаю, что могу установить задачу cron для запуска rsync каждую минуту, и это должно быть довольно близко к реальному времени.
Это не точное решение, которое я искал, поскольку winscp делает это и многое другое: он обнаруживает изменения файлов в каталоге (пока я работаю над ними), а затем автоматически отправляет изменения на удаленный сервер. Я знаю, что это не лучшее решение (без репозитория кода), но оно позволяет мне очень быстро тестировать код на сервере во время его разработки. Кто-нибудь знает, как объединить rsync с любыми другими командами, чтобы получить эту функциональность?
Как в режиме реального времени вы хотите синхронизацию? Я все еще склонялся бы к 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 г.).
Вы всегда можете использовать управление версиями, например 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, но я надеюсь, что это поможет.
Эти rsync
решения очень хороши, особенно если вы только толкая меняющий путь. Еще один замечательный инструмент unison
- он пытается синхронизировать изменения в обоих направлениях. Узнайте больше на домашней странице Unison .
Чтобы обнаружить измененные файлы, вы можете попробовать fam (монитор изменений файлов) или inotify. Последний специфичен для Linux, у fam есть порт bsd, который может работать на OS X. Оба имеют инструменты пользовательского пространства, которые могут использоваться в скрипте вместе с rsync.
Похоже, вы решаете не ту проблему. Если вы пытаетесь редактировать файлы на удаленном компьютере, вы можете попробовать использовать что-то вроде плагина ftp для jedit. http://plugins.jedit.org/plugins/?FTP Это гарантирует, что у вас есть только одна версия файла, поэтому он никогда не будет синхронизирован.
Вы также можете использовать Fetch в качестве SFTP-клиента, а затем редактировать файлы непосредственно на сервере. Существуют также параметры SSHFS (монтирование папки ssh в качестве тома). Это соответствует тому, что сказали стимулы - вы уверены, что хотите синхронизировать содержимое или просто хотите редактировать файлы на сервере?
OS X имеет свою собственную систему уведомлений о файлах - это то, на чем основан Spotlight. Я не слышал ни о какой программе, которая использует это, чтобы затем синхронизировать вещи, но это, конечно, возможно.
Я лично использую RCS для такого типа вещей: - хотя у него есть ручной аспект, маловероятно, что я захочу что-то перенести даже на тестовый сервер с моей машины разработчика без предварительного тестирования. И если я работаю на сервере разработки, я использую один из вариантов, приведенных выше.
Основываясь на предложении icco о SVN, я бы на самом деле предположил, что если вы используете subversion или подобное для управления исходным кодом (а если нет, то, вероятно, вам следует начать), вы можете поддерживать производственную среду в актуальном состоянии, введя команду обновить хранилище в хук post-commit.
Есть много переменных в том, как вы хотите это сделать, но то, что я видел в работе, это то, что рабочий или рабочий сайт должен быть рабочей копией, а затем после фиксации использовать ключ ssh с принудительной командой Войдите на удаленный сайт и активируйте svn на рабочей копии. В качестве альтернативы в ловушке post-commit вы можете запустить экспорт svn на удаленной машине или локальный (в хранилище svn) svn, а затем выполнить rsync на удаленную машину.
Я бы беспокоился о вещах, которые обнаруживают изменения и толкают их, и я бы даже волновался о вещах, которые запускаются каждую минуту, просто из-за условий гонки. Как вы знаете, что он не будет передавать файл в тот же момент, когда он записывается? Наткнитесь на это один или два раза, и вы потеряете все экономящее время преимущество, которое вы имели, постоянно выполняя или аналогичные операции.
Будет ли DropBox ( http://www.getdropbox.com/ ) делать то, что вы хотите?
Что вы хотите сделать для удаленного доступа в 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.
т.п.н.
У меня такая же проблема. Мне понравилась команда 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
Раньше у меня были те же настройки под Windows, что и у вас, это локальное файловое дерево (с версиями) и тестовая среда на удаленном сервере, которые я отражал в реальном времени с помощью WinSCP. Когда я переключился на Mac, мне пришлось немного покопаться, прежде чем я был счастлив, но в итоге я использовал:
- SmartSVN как мой подрывной клиент
- Sublime Text 2 в качестве моего редактора (уже использовал его в Windows)
- SFTP-плагин для ST2, который обрабатывает загрузку при сохранении (извините, не могу опубликовать более 2 ссылок)
Я действительно могу порекомендовать эту настройку, надеюсь, это поможет!
Ну, у меня была такая же проблема, и возможно использовать их вместе: rsync, SSH Passwordless Login, Watchdog (утилита синхронизации Python) и Terminal Notifier (утилита уведомлений OS X, сделанная с Ruby. Не нужна, но помогает узнать когда синхронизация закончится).
Я создал ключ для входа в систему без пароля, используя это руководство из вики Dreamhost: http://cl.ly/MIw5
1.1. Когда вы закончите, проверьте, все ли в порядке ... если вы не можете войти в систему без пароля, возможно, вам стоит попробовать afp mount. Dreamhost (где мой сайт) не разрешает монтирование afp, но разрешает вход без пароля. В терминале введите:
ssh username@host.com
Вы должны войти в систему без ввода пароля: PЯ установил Terminal Notifier со страницы 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 фактически синхронизирует вашу локальную папку с удаленной папкой.Наконец, я скачал и установил 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
Теперь все установлено! Перейдите в папку, которую вы хотите синхронизировать , измените этот код в соответствии со своими потребностями и введите в Терминале:
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.
Теперь внесите некоторые изменения в файл внутри папки и наблюдайте за волшебством!
lsyncd кажется идеальным решением. он объединяет inotify (встроенная функция ядра, которая отслеживает изменения файлов в деревьях каталогов) и rsync (кроссплатформенный инструмент синхронизации файлов).
lsyncd -rsyncssh /home remotehost.org backup-home/
Цитата из github:
Lsyncd отслеживает интерфейс монитора событий деревьев локальных каталогов (inotify или fsevents). Он объединяет и объединяет события в течение нескольких секунд, а затем запускает один (или более) процесс (ы) для синхронизации изменений. По умолчанию это rsync. Таким образом, Lsyncd представляет собой облегченное решение для живого зеркала, которое сравнительно легко установить, не требующее новых файловых систем или блочных устройств, и не снижающее производительность локальной файловой системы.
Я использую этот маленький 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
Адаптируйте его под свои нужды!
Пользователь watcher.py и rsync для автоматизации этого. Прочитайте следующие пошаговые инструкции здесь:
Если вы разрабатываете Python на удаленном сервере, Pycharm может быть хорошим выбором для вас. Вы можете синхронизировать удаленные файлы с локальными файлами, используя функцию удаленной разработки Pycharm. Ссылка на руководство, как: https://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html
Отличный вопрос я искал ответ часами!
Я проверил 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