2008-08-12 28 views
34

Me encanta la función Keep Remote Directory Up-to-date en Winscp. Desafortunadamente, no puedo encontrar nada tan simple de usar en OS X o Linux. Sé lo mismo puede teóricamente ser logrado usando changedfiles o rsync, pero siempre he encontrado que los tutoriales para ambas herramientas son faltantes y/o contradictorios.Mantener directorio remoto Actualizado

Básicamente solo necesito una herramienta que funcione en OSX o Linux y mantenga un directorio remoto sincronizado (duplicado) con un directorio local mientras realizo cambios en el directorio local.


actualización

Mirando a través de las soluciones, veo un par, que resuelve el problema general de mantener un directorio remoto en sincronía con un directorio local manualmente. Sé que puedo configurar una tarea cron para ejecutar rsync cada minuto, y esto debería ser bastante cercano al tiempo real.

Esta no es la solución exacta que estaba buscando, ya que winscp hace esto y más: detecta cambios de archivos en un directorio (mientras yo trabajo en ellos) y luego empuja los cambios automáticamente al servidor remoto. Sé que esta no es la mejor solución (sin repositorio de código), pero me permite probar código rápidamente en un servidor mientras lo desarrollo. ¿Alguien sabe cómo combinar rsync con otros comandos para obtener esta funcionalidad?

+0

getdropbox.com (mencionado por Scott) detectará cambios en los archivos en el directorio de la caja de reenvío y sus subdirectorios (mientras trabaja en ellos) y luego automáticamente se le empujar los cambios a todas las computadoras que están vinculadas a su cuenta de Dropbox. – jfs

Respuesta

15

¿Cómo "en tiempo real" quieres la sincronización? Todavía me inclinaría por rsync ya que sabes que será totalmente compatible con ambas plataformas (Windows, también, con cygwin) y puedes ejecutarlo a través de un trabajo cron. Tengo un archivo de fiesta súper simple que corro en mi sistema (esto no eliminar archivos viejos):

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

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

Su mejor apuesta es a configurarlo y probarlo. ¡La opción -n (--dry-run) es tu amiga!

Tenga en cuenta que rsync (al menos en cygwin) no admite nombres de archivos Unicode (desde el 16 de agosto de 2008).

+2

En realidad, '-a' implica' -r'. Ver [man rsync] (http://manpages.ubuntu.com/manpages/precise/en/man1/rsync.1.html#contenttoc12). –

+1

¿Es esto bidireccional? – ThorSummoner

+0

@dwj, quizás desee cambiar su respuesta para usar SSH, ya que rsync directamente puede ser a veces un puerto cerrado (con más frecuencia que SSH). – einpoklum

1

Siempre puede usar el control de versiones, como SVN, por lo que todo lo que tiene que hacer es hacer que el servidor ejecute svn en una carpeta todas las noches. Esto entra en problemas de seguridad si está compartiendo sus archivos públicamente, pero funciona.

Si está utilizando Linux, aprenda a usar rsync. Realmente no es tan difícil ya que puedes probar cada comando con -n. Ir a través de la man page, el formato básico que se desea es

rsync [OPCIÓN ...] SRC ... [usuario @] HOST: DEST

el comando corro de mi servidor de la escuela a mi copia de seguridad de la máquina es el hogar de este

rsync -AVI --delete ~ @ me homeserv: ~/Escuela/>> BackupLog.txt

esto lleva toda la archivos en mi directorio de inicio (~) y usa el modo de archivo de rsync (-a), verbosly (-v), enumera todos los cambios realizados (-i), mientras elimina cualquier archivo que ya no exista (--delete) y lo coloca en la carpeta/home/me/school/en mi servidor remoto.Toda la información se imprime (lo que fue copiado, lo borrado, etc.) también se añade al archivo BackupLog.txt

Sé que es un viaje relámpago de rsync, pero espero que ayude.

2

Las soluciones rsync son realmente buenas, especialmente si solo está presionando los cambios en una dirección. Otra gran herramienta es unison - intenta sincronizar los cambios en ambas direcciones. Lea más en the Unison homepage.

4

Para detectar archivos modificados, puede probar fam (monitor de modificación de archivos) o inotify. Este último es específico de linux, fam tiene un puerto bsd que podría funcionar en OS X. Ambos tienen herramientas de espacio de usuario que podrían usarse en un script junto con rsync.

1

Parece que está solucionando el problema equivocado. Si intentas editar archivos en una computadora remota, entonces podrías intentar usar algo como el plugin ftp para jedit. http://plugins.jedit.org/plugins/?FTP Esto garantiza que solo tiene una versión del archivo, por lo que nunca puede estar fuera de sincronización.

0

También puede usar Recuperar como un cliente SFTP, y luego editar archivos directamente desde dentro del servidor. También hay opciones de SSHFS (montar una carpeta ssh como volumen). Esto está en línea con lo que dicen los estímulos: ¿estás seguro de que quieres que las cosas estén sincronizadas, o solo quieres editar archivos en el servidor?

OS X tiene su propio sistema de notificaciones de archivos - esto es en lo que se basa Spotlight. No he oído hablar de ningún programa que use esto para mantener las cosas sincronizadas, pero ciertamente es concebible.

Personalmente uso RCS para este tipo de cosas: - si bien tiene un aspecto manual, es poco probable que quiera impulsar algo incluso al servidor de prueba de mi máquina de desarrollo sin probarlo primero. Y si estoy trabajando en un servidor de desarrollo, entonces uso una de las opciones dadas arriba.

1

Partiendo de la sugerencia de icco de SVN, sugeriría que si está utilizando subversión o similar para el control de código fuente (y si no lo está, probablemente debería comenzar) puede mantener el entorno de producción actualizado al poner el comando para actualizar el repositorio en el gancho post-commit.

Hay muchas variables en cómo te gustaría hacer eso, pero lo que he visto funciona es que el sitio de desarrollo o en vivo sea una copia de trabajo y luego utilizar la post-commit con una clave ssh con un comando forzado para iniciar sesión en el sitio remoto y activar un svn en la copia de trabajo. De forma alternativa, en el enganche post-commit puede desencadenar una exportación svn en la máquina remota, o un svn local (al repositorio svn) exportar y luego una rsync a la máquina remota.

Me preocuparían las cosas que detectan cambios y los presionan, y hasta me preocupan las cosas que funcionan a cada minuto, solo por las condiciones de carrera. ¿Cómo sabes que no va a transferir el archivo en el mismo instante en que se está escribiendo? Tropieza con eso una o dos veces y perderás toda la ventaja de ahorro de tiempo que tenías al sincronizar constantemente o algo similar.

8

Lo que quiere hacer para el acceso remoto de Linux es usar 'sshfs' - el Sistema de archivos SSH.

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

Luego, trátelo como un soporte de red, que es ...

Un poco más de detalle, como la forma de configurarlo para que pueda hacer esto como un usuario normal, en my blog

Si desea que el comportamiento asincrónico de winSCP, tendrá que utilizar rsync combinado con algo que lo ejecuta periódicamente. La solución anterior de cron funciona, pero puede ser excesiva para el caso de uso de winscp.

El siguiente comando ejecutará rsync cada 5 segundos para enviar contenido al host remoto. Puede ajustar el tiempo de suspensión según sea necesario para reducir la carga del servidor.

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

Si usted tiene una estructura de directorios muy grande y la necesidad de reducir la sobrecarga de la votación, se puede utilizar 'encontrar':

# 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 

Y dicho cron puede ser una exageración? Pero al menos esto se acaba de hacer desde la línea de comandos, y se puede detener a través de un ctrl-C.

kb

+0

Uhh, el enlace de su blog no entra en ningún detalle sobre el tratamiento de sshfs como un montaje de red. – ThorSummoner

+0

¿Qué ventaja tiene sshfs al sincronizarse directamente con el host remoto en esta situación? parece una sobrecarga innecesaria y, en mi experiencia, sshfs puede desconectarse ocasionalmente. –

3

Tengo el mismo problema. Me encantó el comando winscp "mantener el directorio remoto actualizado". Sin embargo, en mi búsqueda para deshacerme de Windows, perdí winscp. Escribí un script que usa fileschanged y rsync para hacer algo similar mucho más cerca del tiempo real.

Modo de empleo:

  • Asegúrese de que ha fileschanged instalado
  • Guardar este script en///bin/LiveSync locales usr o en algún lugar accesible en su $ PATH y hacen que sea ejecutable
  • Uso Nautilus para conectarse al host remoto (SFTP o FTP)
  • Ejecutar este proceso haciendo LiveSync FUENTE DEST
  • el directorio estará en DEST/hom . E/[nombre de usuario]/gvfs/[ruta a FTP SCP o lo que sea]

Un Par inconvenientes:

  • Es más lento que WinSCP (yo creo que es debido a que pasa a través de Nautilus y tiene que detectar cambios a través de rsync también)
  • Debe crear manualmente el directorio de destino si aún no existe. Entonces, si está agregando un directorio, no detectará y creará el directorio en el lado DEST.
  • Probablemente más que todavía no he notado
  • Además, no intente sincronizar un directorio de SRC llamado "rsyncThis". Que probablemente no será bueno :)

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

que solía tener la misma configuración en Windows como usted, que es un FileTree local (versionado) y un entorno de prueba en un servidor remoto , que guardé reflejado en tiempo real con WinSCP.Cuando cambié a Mac que tenía que hacer bastante algo de investigación antes de que yo estaba feliz, pero finalmente terminó usando:

  • SmartSVN como mi cliente subversión
  • Sublime Text 2 como mi editor (ya utilizado en Windows)
  • SFTP-plugin para ST2 que se ocupa de la carga en guardar (lo siento, no puede publicar más de 2 enlaces)

realmente puedo recomendar esta configuración, espero que ayude!

0

Bueno, tuve el mismo tipo de problema y es posible usarlos juntos: rsync, SSH Passwordless Login, Watchdog (una utilidad de sincronización Python) y Terminal Notifier (una utilidad de notificación OS X hecha con Ruby. No es necesario, pero ayuda a saber cuándo ha finalizado la sincronización).

  1. creé la clave para sin contraseña inicia sesión usando este tutorial de Dreamhost wiki: http://cl.ly/MIw5

    1,1. Cuando termines, prueba si todo está bien ... si no puedes iniciar sesión sin contraseña, tal vez tengas que probar el montaje de afp. Dreamhost (donde está mi sitio) no permite el montaje de afp, pero permite el inicio de sesión sin contraseña. En el terminal, escriba:

    ssh [email protected] Debe iniciar sesión sin contraseñas que se preguntó: P

  2. He instalado el notificador Terminal desde la página de Github: http://cl.ly/MJ5x

    2,1. Usé el comando instalador Gem. En la Terminal, escriba:

    gem install terminal-notifier

    2,3. Comprueba si la notificación works.In Terminal, escriba:

    terminal-notifier -message "Starting sync"

  3. crear un script sh para probar el rsync + notificación. Guárdelo en cualquier lugar que desee, con el nombre que desee. En este ejemplo, la llamaré ~/scripts/sync.sh he utilizado la" extensión .sh, pero no sé si es necesario.

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

    3,1. Recuerde dar permiso de ejecución de este script sh En la Terminal, escriba:..

    sudo chmod 777 ~/Scripts/sync.sh 3,2 Ejecutar la secuencia de comandos y verificar si los mensajes se muestran correctamente y el rsync realidad sincronizar la carpeta local con la carpeta remota

  4. último. , Yo downl Watchdog instalado e instalado en la página de Github: http://cl.ly/MJfb

    4.1. Primero, instalé la dependencia libyaml usando Brew (hay mucha ayuda sobre cómo instalar Brew, como una "aptitud" para OS X). En Terminal, tipo:

    brew install libyaml

    4,2. Luego, utilicé el "comando easy_install".Vaya la carpeta de perro guardián, y el tipo de terminal:

    easy_install watchdog

  5. Ahora, todo está instalado! Ir la carpeta que desea ser sincronizado, cambio de este código a sus necesidades, y el tipo de terminal:

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

    Tiene que ser exactamente esta manera, con las barras y saltos de línea, por lo Tendrás que copiar estas líneas a un editor de texto, cambiar la secuencia de comandos, pegar en la terminal y presionar regresar.

    ¡Intenté sin los saltos de línea, y no funciona!

    En mi Mac, siempre me sale un error, pero no parece afectar a cualquier cosa:

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

    Ahora, hizo algunos cambios en un archivo dentro de la carpeta, y ver la magia!

38

lsyncd parece ser la solución perfecta. combina inotify (función integrada kernel que vigila los cambios de archivos en un árbol de directorios) y rsync (herramienta de sincronización de archivos multiplataforma).

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

Presupuesto de GitHub:

Lsyncd mira un árbol de directorios interfaz de monitor de eventos locales (inotify o fsevents). Agrega y combina eventos durante unos segundos y luego genera uno (o más) procesos para sincronizar los cambios. Por defecto, esto es rsync. Por lo tanto, Lsyncd es una solución ligera de espejo real que es comparativamente fácil de instalar y no requiere nuevos sistemas de archivos o dispositivos de bloqueo y no obstaculiza el rendimiento del sistema de archivos local.

+2

Esto es mejor, solo sincronizará los archivos en los cambios detectados. – FaceBro

+0

se parece a lo que estaba buscando desde hace unas semanas !! Probé al unísono, algunos servidores de archivos compartidos, sshfs: no servían. No merece la pena echarle un vistazo a IMHO rsync para esta tarea (a menos que deseemos perder tiempo configurándolo junto con inotify o equivalente) ... ¡lsyncd se ve bien hasta ahora! – Shautieh

+2

¿Qué sucede si los cambios ocurren mientras su computadora no está conectada a la remota? ¿Guardará lsyncd un registro de esos cambios para más tarde? – einpoklum

0

estoy usando este pequeño Rubí-Guión:

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

adaptarlo a sus necesidades!

Cuestiones relacionadas