Question

J'adore Garder Répertoire Distant à jour fonctionnalité Winscp.Malheureusement, je ne peux pas trouver quelque chose d'aussi simple à utiliser sous OS X ou Linux.Je sais que la même chose peut théoriquement être accompli à l'aide de changedfiles ou rsync, mais j'ai toujours trouvé les tutoriels pour les deux outils pour être dépourvues et/ou contradictoires.

En gros, j'ai juste besoin d'un outil qui fonctionne en OSX ou Linux et maintient un répertoire distant dans sync (miroir) avec un répertoire local alors que je modifie le répertoire local.


Mise à jour

En regardant à travers les solutions, je vois un couple qui résoudre le problème général de la tenue d'un répertoire distant en synchronisation avec un répertoire local manuellement.Je sais que je peux définir une tâche cron pour exécuter rsync chaque minute, et ce doit être assez proche du temps réel.

Ce n'est pas la solution exacte je cherchais comme winscp fait ceci et plus:il détecte les modifications de fichiers dans un répertoire (alors que je travail sur eux) et puis pousse automatiquement les modifications sur le serveur distant.Je sais que ce n'est pas la meilleure solution (pas de référentiel de code), mais il me permet de faire très rapidement le code de test sur un serveur alors que je la développe.Personne ne sait comment combiner rsync avec toutes les autres commandes pour obtenir cette fonctionnalité?

Était-ce utile?

La solution

Comment le "temps réel" voulez-vous la synchronisation?J'ai toujours pencher vers rsync depuis que vous savez qu'il va être entièrement pris en charge sur les deux plates-formes (Windows, aussi, avec cygwin) et vous pouvez l'exécuter via un cron.J'ai un super-simple fichier bash que je lance sur mon système (ce n' pas supprimer les anciens fichiers):

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

Votre meilleur pari est de l'installer et de l'essayer.L' -n (--dry-run) l'option est votre ami!

Gardez à l'esprit que rsync (au moins dans cygwin) ne supporte pas les noms de fichier unicode (au 16 Août 2008).

Autres conseils

lsyncd semble être la solution parfaite.il combine inotify (noyau builtin fonction des montres pour les modifications de fichiers dans un répertoire d'arbres) et de rsync (croix-plate-forme de synchronisation des fichiers-outil).

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

Citation de github:

Lsyncd montres un répertoire local des arbres d'événements d'interface du moniteur (inotify ou fsevents).Il rassemble et combine des événements pendant quelques secondes, puis il génère un (ou plusieurs) système(s) de synchroniser les modifications.Par défaut, c'est l'utilisation de rsync.Lsyncd est donc un peu de poids à vivre miroir solution qui est relativement facile à installer, ne nécessitant pas de nouveaux systèmes de fichiers ou blockdevices et de ne pas entraver le système de fichiers local de la performance.

Ce que vous voulez faire pour linux d'accès à distance est l'utilisation de 'sshfs" - le SSH Système de Fichiers.

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

Puis le traiter comme un montage réseau, qui il est...

Un peu plus en détail, comme la façon de le configurer de sorte que vous pouvez faire cela comme un utilisateur régulier, sur mon blog

Si vous voulez le comportement asynchrone de winSCP, vous aurez envie d'utiliser rsync combiné avec quelque chose qui s'exécute périodiquement.Le cron solution ci-dessus fonctionne, mais peut-être exagéré pour le winscp cas d'utilisation.

La commande suivante va exécuter rsync toutes les 5 secondes pour pousser le contenu de l'hôte distant.Vous pouvez ajuster le temps de sommeil nécessaire pour réduire la charge du serveur.

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

Si vous avez un très grand répertoire de la structure et de la nécessité de réduire les frais généraux de bureaux de vote, vous pouvez utiliser "rechercher":

# 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

Et j'ai dit cron peut-être exagéré?Mais au moins, c'est simplement du fait de la ligne de commande, et peut être arrêté par une combinaison de touches ctrl-C.

ko

Pour détecter les fichiers modifiés, vous pouvez essayer de la gpa (file alteration monitor) ou inotify.Ce dernier est spécifique à linux, fam a un bsd port qui pourrait fonctionner sur OS X.Les deux ont de l'espace utilisateur des outils qui pourraient être utilisés dans un script avec rsync.

J'ai le même problème.J'ai adoré winscp "garder répertoire distant jusqu'à la date de la commande".Cependant, dans ma quête pour me débarrasser de Windows, j'ai perdu winscp.J'ai écrit un script qui utilise fileschanged et rsync pour faire quelque chose de similaire beaucoup plus proches du temps réel.

Comment l'utiliser:

  • Assurez-vous d'avoir installé fileschanged
  • Enregistrer ce script dans /usr/local/bin/livesync ou à un endroit accessible dans votre $PATH et le rendre exécutable
  • Utiliser Nautilus pour se connecter à l'hôte distant (sftp ou ftp)
  • L'exécution de ce script en faisant livesync SOURCE DEST
  • Le NOM du répertoire dans /home/[nom d'utilisateur]/.gvfs/[chemin d'accès au ftp, scp ou quelle que soit]

Quelques inconvénients:

  • Il est plus lent que winscp (je suppose que c'est parce qu'il passe par Nautilus et a pour détecter les changements via rsync ainsi)
  • Vous devez créer manuellement le répertoire de destination s'il n'existe pas déjà.Donc, si vous ajoutez un répertoire, il ne les détecte pas et créer le répertoire sur le DEST côté.
  • Probablement plus que je n'ai pas encore remarqué
  • Aussi, ne pas tenter de synchroniser un répertoire SRC nommé "rsyncThis".Ce ne sera probablement pas être bon :)

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

Vous pouvez toujours utiliser le contrôle de version, comme SVN, de sorte que tous vous avez à faire est d'exécuter le serveur svn sur un dossier tous les soirs.Cela heurte à des problèmes de sécurité si vous êtes le partage de vos fichiers en public, mais il fonctionne.

Si vous utilisez bien Linux, apprendre à utiliser rsync.Ce n'est pas vraiment difficile, comme vous pouvez le tester chaque commande avec -n.Aller à travers les page de man, le format de base que vous voulez est

rsync [OPTION...] SRC...[USER@]DE L'HÔTE:DEST

la commande que je lance à partir de mon serveur de l'école à mon domicile de sauvegarde de la machine est-ce

rsync -avi --delete ~ me@homeserv:~/École/ >> BackupLog.txt

Ce qui prend tous les fichiers dans mon répertoire home (~) et utilise rsync d'archive de ce mode (-a), verbosly (-v), la liste de toutes les modifications apportées (-i), alors que la suppression de tous les fichiers qui n'existent plus (--delete) et met le dans le Dossier /home/moi/l'École/ sur mon serveur distant.Toutes les informations qu'il affiche (ce qui a été copié, ce qui a été supprimé, etc.) est également ajouté au fichier BackupLog.txt

Je sais que c'est une visite éclair de rsync, mais j'espère que cela aide.

L' rsync les solutions sont vraiment bons, surtout si vous êtes seulement de pousser des changements d'une façon.Un autre outil intéressant est unison -- il tente de synchroniser les changements dans les deux directions.Pour en savoir plus l'Unisson page d'accueil.

Il semble que vous êtes peut-être résoudre le mauvais problème.Si vous essayez de modifier des fichiers sur un ordinateur distant, vous pouvez essayer d'utiliser quelque chose comme le ftp plugin pour jedit. http://plugins.jedit.org/plugins/?FTP Cela garantit que vous avez une seule version d'un fichier de sorte qu'il ne peut jamais être hors de la synchronisation.

Construction de l'icco la suggestion de SVN, je n'avais suggèrent que si vous utilisez subversion ou similaire pour le contrôle à la source (et si vous ne l'êtes pas, vous devriez probablement commencer), vous pouvez garder l'environnement de production jusqu'à ce jour en mettant la commande pour mettre à jour le référentiel dans la post-commit hook.

Il y a beaucoup de variables dans la façon dont vous voulez le faire, mais ce que j'ai vu à l'œuvre est-ce que le développement ou le site en ligne une copie de travail et ensuite le post-commit utiliser une clé ssh à une contrainte de commande pour ouvrir une session sur le site à distance et de déclencher un svn up sur la copie de travail.Sinon, pour le post-commit hook, vous pourrait déclencher un svn export sur la machine distante, ou un local (pour le dépôt svn) svn export et puis un rsync à la machine distante.

Je serais inquiet à propos de choses qui détectent les changements et de les pousser, et je serais même d'être inquiet à propos de choses qui ont couru à chaque minute, juste à cause de conditions de course.Comment savez-vous ça ne va pas transférer le fichier au même instant il a été écrit pour?De trébucher à travers une ou deux fois et vous perdrez tout le temps le gain de vous avait constamment rsyncing ou similaire.

Va DropBox (http://www.getdropbox.com/) faire ce que vous voulez?

L'utilisateur watcher.py et rsync pour automatiser cela.Lire la suite de l'étape par étape les instructions ici:

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

J'ai utilisé la même configuration sous Windows que vous avez, c'est un local filetree (de version) et un environnement de test sur un serveur distant, j'ai gardé miroir en temps réel avec WinSCP.Quand je suis passé à Mac, j'ai dû faire quelques recherches avant j'étais heureux, mais finalement a fini par utiliser:

  • SmartSVN comme mon client subversion
  • Sublime Text 2 que mon éditeur (déjà utilisé sur Windows)
  • SFTP-plugin pour ST2 qui gère le téléchargement sur save (désolé, ne peut pas poster plus de 2 liens)

Je peux vraiment recommander cette configuration, j'espère que ça aide!

Vous pouvez également utiliser l'outil " explorer comme un client SFTP, puis éditer les fichiers directement sur le serveur de l'intérieur.Il y a aussi des SSHFS (mont ssh dossier en Volume) des options.Ceci est en ligne avec ce que stimms dit - êtes-vous sûr que vous voulez des trucs synchronisé, ou tout simplement envie de modifier des fichiers sur le serveur?

OS X a son propre fichier les notifications du système - c'est ce que Spotlight est basé sur.Je n'ai pas entendu parler d'un programme qui l'utilise pour ensuite garder les choses dans la synchro, mais c'est certes concevable.

Personnellement, j'utilise RCS pour ce type de chose:- si elle a un caractère manuel, il est peu probable que je veux pousser quelque chose à même le serveur de test à partir de ma machine de dev sans le tester en premier.Et si je suis en train de travailler sur un serveur de développement, puis-je utiliser une des options ci-dessus.

Eh bien, j'ai eu le même genre de problème et il est possible d'utiliser ces ensemble:rsync, SSH sans mot de passe de Connexion, chien de garde (un Python utilitaire de synchronisation) et le Terminal Déclarant (une notification OS X utilitaire avec Ruby.Pas nécessaire, mais permet de savoir lorsque la synchronisation est terminée).

  1. J'ai créé la clé sans mot de passe de Connexion à l'aide de ce tutoriel de Dreamhost wiki: http://cl.ly/MIw5

    1.1.Lorsque vous avez terminé, vérifiez que tout est ok... si vous ne pouvez pas sans mot de passe de Connexion, vous devrez peut-être essayer de l'afp du mont.Dreamhost (d'où mon site est) ne permet pas de l'afp du mont, mais permet sans mot de passe de Connexion.Dans le terminal, tapez:

    ssh username@host.com Vous devez vous connecter sans mot de passe demandé :P

  2. J'ai installé le Terminal Notifiant de la page Github: http://cl.ly/MJ5x

    2.1.J'ai utilisé la Gemme de commande du programme d'installation.Dans le Terminal, tapez:

    gem install terminal-notifier

    2.3.Test si la notification fonctionne.Dans le Terminal, tapez:

    terminal-notifier -message "Starting sync"

  3. Créer un script sh pour tester le rsync + notification.Enregistrer n'importe où vous le souhaitez, avec le nom que vous souhaitez.Dans cet exemple, je vais l'appeler ~/Scripts/sync.sh J'ai utilisé le ".extension sh, mais je ne sais pas si c'est nécessaire.

    #!/bin/bash terminal-notifier -message "Starting sync" rsync -azP ~/Sites/folder/ user@host.com:site_folder/ terminal-notifier -message "Sync has finished"

    3.1.N'oubliez pas de donner la permission d'exécution de ce script sh.Dans le Terminal, tapez:

    sudo chmod 777 ~/Scripts/sync.sh 3.2.Exécuter le script et de vérifier si les messages sont affichés correctement et le rsync en fait la synchronisation de votre dossier local avec le dossier distant.

  4. Enfin, j'ai téléchargé et installé de Surveillance à partir de la page Github: http://cl.ly/MJfb

    4.1.Tout d'abord, j'ai installé le libyaml de dépendance à l'aide d'Infusion (il ya beaucoup de l'aide comment installer Brew - comme une "aptitude" pour OS X).Dans le Terminal, tapez:

    brew install libyaml

    4.2.Ensuite, j'ai utilisé la commande easy_install".Aller dans le dossier de chien de garde, et tapez dans le Terminal:

    easy_install watchdog

  5. Maintenant, tout est installé! Aller dans le dossier que vous souhaitez synchroniser, modifier ce code à vos besoins, et tapez dans le Terminal:

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

    Il doit être EXACTEMENT de cette façon, avec les barres obliques et les sauts de ligne, de sorte que vous aurez à copier ces lignes dans un éditeur de texte, modifiez le script, coller dans le terminal et appuyez sur la touche retour.

    J'ai essayé sans les sauts de ligne, et il ne fonctionne pas!

    Dans mon Mac, j'ai toujours une erreur, mais il ne semble pas affecter n'importe quoi:

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

    Maintenant, apporté quelques modifications dans un fichier à l'intérieur du dossier, et regarder la magie!

Je suis l'aide de cette petite 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

L'adapter à vos besoins!

Si vous êtes en développement python sur le serveur distant, Pycharm peut être un bon choix pour vous.Vous pouvez synchroniser vos fichiers à distance avec vos fichiers locaux en utilisant pycharm de développement à distance caractéristique.Le guide de lien comme:https://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top