Frage

Ich liebe das absolut Halten Sie das Remote-Verzeichnis auf dem neuesten Stand Funktion in Winscp.Leider kann ich unter OS X oder Linux nichts finden, das so einfach zu verwenden ist.Ich weiß, dass das Gleiche möglich ist theoretisch erreicht werden mit geänderte Dateien oder rsync, aber ich fand die Tutorials für beide Tools immer mangelhaft und/oder widersprüchlich.

Ich brauche im Grunde nur ein Tool, das unter OSX oder Linux funktioniert und ein Remote-Verzeichnis mit einem lokalen Verzeichnis synchron (gespiegelt) hält, während ich Änderungen am lokalen Verzeichnis vornehme.


Aktualisieren

Wenn ich mir die Lösungen ansehe, sehe ich einige, die das allgemeine Problem lösen, ein Remote-Verzeichnis mit einem lokalen Verzeichnis synchron zu halten manuell.Ich weiß, dass ich einen Cron-Task so einstellen kann, dass er rsync jede Minute ausführt, und das sollte ziemlich nah an der Echtzeit erfolgen.

Dies ist nicht genau die Lösung, nach der ich gesucht habe, da winscp dies und noch mehr tut:Es erkennt Dateiänderungen in einem Verzeichnis (während ich daran arbeite) und überträgt die Änderungen dann automatisch an den Remote-Server.Ich weiß, dass dies nicht die beste Lösung ist (kein Code-Repository), aber sie ermöglicht mir, Code sehr schnell auf einem Server zu testen, während ich ihn entwickle.Weiß jemand, wie man rsync mit anderen Befehlen kombiniert, um diese Funktionalität zu erhalten?

War es hilfreich?

Lösung

Wie „in Echtzeit“ soll die Synchronisierung erfolgen?Ich würde immer noch zu rsync tendieren, da Sie wissen, dass es auf beiden Plattformen (auch Windows mit Cygwin) vollständig unterstützt wird und Sie es über einen Cron-Job ausführen können.Ich habe eine supereinfache Bash-Datei, die ich auf meinem System ausführe (das funktioniert). nicht alte Dateien entfernen):

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

Am besten richten Sie es ein und probieren es aus.Der -n (--dry-run) Option ist dein Freund!

Beachten Sie, dass rsync (zumindest in Cygwin) keine Unicode-Dateinamen unterstützt (Stand 16. August 2008).

Andere Tipps

lsyncd scheint die perfekte Lösung zu sein.es kombiniert inotify (im Kernel integrierte Funktion, die auf Dateiänderungen in Verzeichnisbäumen überwacht) und rsync (plattformübergreifendes Dateisynchronisierungstool).

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

Zitat von Github:

Lsyncd überwacht eine Ereignisüberwachungsschnittstelle für lokale Verzeichnisbäume (inotify oder fsevents).Es aggregiert und kombiniert Ereignisse für einige Sekunden und erzeugt dann einen (oder mehrere) Prozesse, um die Änderungen zu synchronisieren.Standardmäßig ist dies rsync.Lsyncd ist somit eine leichte Live-Mirror-Lösung, die vergleichsweise einfach zu installieren ist, keine neuen Dateisysteme oder Blockgeräte erfordert und die Leistung des lokalen Dateisystems nicht beeinträchtigt.

Was Sie für den Linux-Fernzugriff tun möchten, ist die Verwendung von „sshfs“ – dem SSH-Dateisystem.

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

Dann behandeln Sie es wie einen Netzwerk-Mount, der es ist...

Ein bisschen mehr Details, wie zum Beispiel die Einrichtung, damit Sie dies als normaler Benutzer tun können, weiter unten mein Blog

Wenn Sie das asynchrone Verhalten von winSCP wünschen, sollten Sie rsync in Kombination mit etwas verwenden, das es regelmäßig ausführt.Die obige Cron-Lösung funktioniert, ist für den WinSCP-Anwendungsfall jedoch möglicherweise übertrieben.

Der folgende Befehl führt alle 5 Sekunden rsync aus, um Inhalte an den Remote-Host zu übertragen.Sie können die Ruhezeit nach Bedarf anpassen, um die Serverlast zu reduzieren.

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

Wenn Sie eine sehr große Verzeichnisstruktur haben und den Abfrageaufwand reduzieren müssen, können Sie „find“ verwenden:

# 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

Und ich sagte, Cron könnte übertrieben sein?Aber zumindest geschieht dies alles einfach über die Befehlszeile und kann über Strg-C gestoppt werden.

kb

Um geänderte Dateien zu erkennen, können Sie fam (File Alteration Monitor) oder inotify ausprobieren.Letzteres ist Linux-spezifisch, Fam verfügt über einen BSD-Port, der unter OS X funktionieren könnte.Beide verfügen über Userspace-Tools, die zusammen mit rsync in einem Skript verwendet werden können.

Ich habe das gleiche Problem.Ich liebte den Winscp-Befehl „Remote-Verzeichnis auf dem neuesten Stand halten“.Bei meinem Bestreben, mich von Windows zu befreien, verlor ich jedoch winscp.Ich habe ein Skript geschrieben, das fileschanged und rsync verwendet, um etwas Ähnliches viel näher an der Echtzeit zu tun.

Wie benutzt man:

  • Stellen Sie sicher, dass Sie fileschanged installiert haben
  • Speichern Sie dieses Skript in /usr/local/bin/livesync oder irgendwo in Ihrem $PATH und machen Sie es ausführbar
  • Verwenden Sie Nautilus, um eine Verbindung zum Remote-Host herzustellen (SFTP oder FTP).
  • Führen Sie dieses Skript aus, indem Sie Livesync ausführen QUELLE ZIEL
  • Das DEST-Verzeichnis befindet sich in /home/[Benutzername]/.gvfs/[Pfad zum FTP-SCP oder was auch immer]

Ein paar Nachteile:

  • Es ist langsamer als winscp (ich vermute, weil es über Nautilus läuft und Änderungen auch über rsync erkennen muss)
  • Sie müssen das Zielverzeichnis manuell erstellen, falls es noch nicht vorhanden ist.Wenn Sie also ein Verzeichnis hinzufügen, wird das Verzeichnis auf der DEST-Seite nicht erkannt und erstellt.
  • Wahrscheinlich mehr, was mir noch nicht aufgefallen ist
  • Versuchen Sie außerdem nicht, ein SRC-Verzeichnis mit dem Namen „rsyncThis“ zu synchronisieren.Das wird wahrscheinlich nicht gut sein :)

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

Sie können jederzeit die Versionskontrolle wie SVN verwenden. Sie müssen also nur dafür sorgen, dass der Server jede Nacht svn für einen Ordner ausführt.Dies führt zu Sicherheitsproblemen, wenn Sie Ihre Dateien öffentlich teilen, aber es funktioniert.

Wenn Sie jedoch Linux verwenden, lernen Sie die Verwendung von rsync.Es ist wirklich nicht so schwierig, da Sie jeden Befehl mit -n testen können.Gehe durch die Manpage, das gewünschte Grundformat ist

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

Der Befehl, den ich von meinem Schulserver auf meinem Heim-Backup-Rechner ausführe, ist dieser

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

Dies nimmt alle Dateien in meinem Home-Verzeichnis (~) und verwendet den Archivmodus von rsync (-a), ausführlich (-v), listet alle vorgenommenen Änderungen auf (-i) und löscht alle Dateien, die nicht mehr vorhanden sind (--delete) und legt es im Ordner /home/me/School/ auf meinem Remote-Server ab.Alle ausgedruckten Informationen (was kopiert wurde, was gelöscht wurde usw.) werden auch an die Datei BackupLog.txt angehängt

Ich weiß, dass das eine turbulente Tour durch rsync ist, aber ich hoffe, es hilft.

Der rsync Lösungen sind wirklich gut, insbesondere wenn Sie Änderungen nur in eine Richtung vorantreiben.Ein weiteres großartiges Werkzeug ist unison – Es wird versucht, Änderungen in beide Richtungen zu synchronisieren.Lesen Sie mehr unter die Unison-Homepage.

Es scheint, als ob Sie vielleicht das falsche Problem lösen.Wenn Sie versuchen, Dateien auf einem Remote-Computer zu bearbeiten, können Sie versuchen, beispielsweise das FTP-Plugin für jedit zu verwenden. http://plugins.jedit.org/plugins/?FTP Dadurch wird sichergestellt, dass Sie nur eine Version der Datei haben, sodass diese niemals nicht mehr synchron sein kann.

Aufbauend auf dem SVN-Vorschlag von icco würde ich tatsächlich vorschlagen, dass Sie die Produktionsumgebung durch Eingabe des Befehls auf dem neuesten Stand halten können, wenn Sie Subversion oder ähnliches zur Quellcodeverwaltung verwenden (und wenn nicht, sollten Sie wahrscheinlich damit beginnen). um das Repository im Post-Commit-Hook zu aktualisieren.

Es gibt viele Variablen, wie Sie das machen möchten, aber ich habe gesehen, dass es funktioniert, wenn die Entwicklungs- oder Live-Site eine Arbeitskopie ist und dann beim Post-Commit ein SSH-Schlüssel mit einem erzwungenen Befehl verwendet wird Melden Sie sich bei der Remote-Site an und lösen Sie einen SVN-Up auf der Arbeitskopie aus.Alternativ können Sie im Post-Commit-Hook einen SVN-Export auf dem Remote-Rechner oder einen lokalen SVN-Export (in das SVN-Repository) und dann einen Rsync auf dem Remote-Rechner auslösen.

Ich würde mir Sorgen über Dinge machen, die Änderungen erkennen und vorantreiben, und ich würde mir sogar Sorgen über Dinge machen, die jede Minute laufen, nur aufgrund der Rennbedingungen.Woher wissen Sie, dass die Datei nicht im selben Moment übertragen wird, in dem sie beschrieben wird?Wenn Sie ein- oder zweimal darüber stolpern, verlieren Sie den gesamten Zeitersparnisvorteil, den Sie durch die ständige Rsynchronisierung oder ähnliches hatten.

Wird DropBox (http://www.getdropbox.com/) Tun Sie, was Sie wollen?

Verwenden Sie watcher.py und rsync, um dies zu automatisieren.Lesen Sie hier die folgende Schritt-für-Schritt-Anleitung:

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

Früher hatte ich unter Windows das gleiche Setup wie Sie, also einen lokalen Dateibaum (versioniert) und eine Testumgebung auf einem Remote-Server, die ich mit WinSCP in Echtzeit gespiegelt habe.Als ich zum Mac wechselte, musste ich einiges recherchieren, bis ich zufrieden war, aber am Ende habe ich Folgendes verwendet:

  • SmartSVN als mein Subversion-Client
  • Erhabener Text 2 als mein Editor (habe ihn bereits unter Windows verwendet)
  • SFTP-Plugin für ST2, das das Hochladen beim Speichern übernimmt (leider können nicht mehr als 2 Links gepostet werden)

Ich kann dieses Setup wirklich empfehlen und hoffe, es hilft!

Sie können Fetch auch als SFTP-Client verwenden und dann von dort aus Dateien direkt auf dem Server bearbeiten.Es gibt auch SSHFS-Optionen (Einbinden eines SSH-Ordners als Volume).Dies steht im Einklang mit dem, was stimms gesagt hat: Sind Sie sicher, dass die Dinge synchron gehalten werden sollen, oder möchten Sie einfach nur Dateien auf dem Server bearbeiten?

OS X verfügt über ein eigenes Dateibenachrichtigungssystem – darauf basiert Spotlight.Ich habe von keinem Programm gehört, das dies nutzt, um die Dinge dann synchron zu halten, aber es ist durchaus denkbar.

Ich persönlich verwende RCS für solche Dinge: Obwohl es einen manuellen Aspekt hat, ist es unwahrscheinlich, dass ich etwas von meinem Entwicklungscomputer auf den Testserver übertragen möchte, ohne es vorher zu testen.Und wenn ich auf einem Entwicklungsserver arbeite, dann nutze ich eine der oben genannten Möglichkeiten.

Nun, ich hatte das gleiche Problem und es ist möglich, diese zusammen zu verwenden:rsync, SSH Passwordless Login, Watchdog (ein Python-Synchronisierungsdienstprogramm) und Terminal Notifier (ein mit Ruby erstelltes OS X-Benachrichtigungsdienstprogramm).Nicht erforderlich, hilft aber zu wissen, wann die Synchronisierung abgeschlossen ist.

  1. Ich habe den Schlüssel für die passwortlose Anmeldung mithilfe dieses Tutorials aus dem Dreamhost-Wiki erstellt: http://cl.ly/MIw5

    1.1.Wenn Sie fertig sind, testen Sie, ob alles in Ordnung ist. Wenn Sie sich nicht passwortlos anmelden können, müssen Sie möglicherweise afp mount ausprobieren.Dreamhost (wo sich meine Website befindet) erlaubt kein AFP-Mount, erlaubt aber die passwortlose Anmeldung.Geben Sie im Terminal Folgendes ein:

    ssh username@host.com Sie sollten sich anmelden, ohne nach Passwörtern gefragt zu werden :P

  2. Ich habe den Terminal Notifier von der Github-Seite installiert: http://cl.ly/MJ5x

    2.1.Ich habe den Gem-Installationsbefehl verwendet.Geben Sie im Terminal Folgendes ein:

    gem install terminal-notifier

    2.3.Testen Sie, ob die Benachrichtigung funktioniert. Geben Sie im Terminal Folgendes ein:

    terminal-notifier -message "Starting sync"

  3. Erstellen Sie ein SH-Skript, um die Rsync+-Benachrichtigung zu testen.Speichern Sie es an einem beliebigen Ort mit dem Namen, den Sie möchten.In diesem Beispiel nenne ich es ~/Scripts/sync.sh Ich habe die Erweiterung „.sh“ verwendet, weiß aber nicht, ob sie benötigt wird.

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

    3.1.Denken Sie daran, diesem sh-Skript die Ausführungsberechtigung zu erteilen.Geben Sie im Terminal Folgendes ein:

    sudo chmod 777 ~/Scripts/sync.sh 3.2.Führen Sie das Skript aus und überprüfen Sie, ob die Meldungen korrekt angezeigt werden und ob rsync Ihren lokalen Ordner tatsächlich mit dem Remote-Ordner synchronisiert.

  4. Schließlich habe ich Watchdog von der Github-Seite heruntergeladen und installiert: http://cl.ly/MJfb

    4.1.Zuerst habe ich die libyaml-Abhängigkeit mit Brew installiert (es gibt viele Hilfestellungen zur Installation von Brew – etwa ein „Aptitude“ für OS X).Geben Sie im Terminal Folgendes ein:

    brew install libyaml

    4.2.Dann habe ich den Befehl „easy_install“ verwendet.Gehen Sie zum Ordner „Watchdog“ und geben Sie „Terminal“ ein:

    easy_install watchdog

  5. Jetzt ist alles installiert! Gehen Sie zu dem Ordner, den Sie synchronisieren möchten, Ändern Sie diesen Code entsprechend Ihren Anforderungen, und geben Sie Terminal ein:

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

    Es muss sein GENAU Auf diese Weise, mit den Schrägstrichen und Zeilenumbrüchen, müssen Sie diese Zeilen in einen Texteditor kopieren, das Skript ändern, in das Terminal einfügen und die Eingabetaste drücken.

    Ich habe es ohne Zeilenumbrüche versucht, aber es funktioniert nicht!

    Auf meinem Mac erhalte ich immer eine Fehlermeldung, die aber scheinbar keine Auswirkungen hat:

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

    Nehmen Sie nun einige Änderungen an einer Datei im Ordner vor und beobachten Sie die Magie!

Ich verwende dieses kleine Ruby-Skript:

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

Passen Sie es an Ihre Bedürfnisse an!

Wenn Sie Python auf einem Remote-Server entwickeln, ist Pycharm möglicherweise eine gute Wahl für Sie.Mithilfe der Remote-Entwicklungsfunktion von Pycharm können Sie Ihre Remote-Dateien mit Ihren lokalen Dateien synchronisieren.Der Leitfaden-Link lautet:https://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top