So verwenden Sie rsync über FTP


187

Beliebiges Unix:

Ich habe die folgende cmd-Zeile, die gut funktioniert.

rsync -avr -e ssh /home/dir user@example.com:/home/

Aber ich muss es jetzt einrichten, um es mit einem Remote-Server zu synchronisieren, auf dem sich nur ein FTP-Server befindet. Wie gehe ich vor?

Ich habe mir die rsync-Hilfe angesehen, ging aber schnell verloren (ich mache das nicht sehr oft).


21
Dies ist vergleichbar mit der Frage, wie man HTTP über IRC oder FTP über SMTP verwendet ...
Juliano

2
Vielleicht könnten Sie einige Ihrer Gründe dafür erläutern, und wir können Ihnen dabei helfen, eine praktikable Lösung zu finden.
James

1
Im Grunde habe ich versucht, eine Sicherung von einem gemeinsam genutzten Hosting-Server zu automatisieren, und habe nicht verstanden, wie Rsync funktioniert. ich bin jetzt zu einem vps gewechselt und habe nicht mehr die
begrenzung

Duplicity ist dein Gott: scie.nti.st/2013/4/13/…
user956584

Wenn Bereitstellung ist, was Sie denken, und Sie nichts dagegen haben, NodeJS, überprüfen Sie bereitstellen , faul und funktioniert gut mit Git
Frank Nocke

Antworten:


78

Das tust du nicht. rsync kann das nicht für Sie tun, es ist ein eigenes Protokoll und funktioniert nicht über FTP.

Möglicherweise möchten Sie jedoch csync ausprobieren . IIRC bietet rsync-ähnliches Verhalten über HTTP. Ich kann nicht beurteilen, ob es über FTP funktioniert, Sie müssen es versuchen.


1
Auf der csync-Webseite wird SFTP unterstützt, die Unterstützung für einfaches FTP wird jedoch nicht erwähnt.
Keith Thompson

162

rsync funktioniert aus den von anderen genannten Gründen nicht für Sie. Allerdings lftp und ncftp beide haben „Spiegel“ Modi , die Ihren Bedürfnissen wohl treffen.

Ich verwende dies, um Daten aus meinem lokalen Verzeichnis auf einen FTP- oder SFTP-Webhost zu übertragen:

lftp -c "set ftp:list-options -a;
open ftp://user:password@your.ftp.com; 
lcd ./web;
cd /web/public_html;
mirror --reverse --delete --use-cache --verbose --allow-chown  
--allow-suid --no-umask --parallel=2 --exclude-glob .svn"

2
lftp ist sehr nett. Eine andere, von der ich gerade erfahren habe, ist wputdie, die eine eingebaute Bandbreitenbegrenzung hat.
Karmakaze

122

Wie von Staffelei geschrieben , lftpist ein gutes Werkzeug.

Ich empfehle Ihnen, das Skript zu parametrisieren und das zu verwenden

exclude-glob

Optionen, die Dateinamen mit der Glob-Funktion (* ,? ..) Ihrer Shell ausschließen:

#!/bin/bash    
HOST="your.ftp.host.dom"
USER="username"
PASS="password"
FTPURL="ftp://$USER:$PASS@$HOST"
LCD="/path/of/your/local/dir"
RCD="/path/of/your/remote/dir"
#DELETE="--delete"
lftp -c "set ftp:list-options -a;
open '$FTPURL';
lcd $LCD;
cd $RCD;
mirror --reverse \
       $DELETE \
       --verbose \
       --exclude-glob a-dir-to-exclude/ \
       --exclude-glob a-file-to-exclude \
       --exclude-glob a-file-group-to-exclude* \
       --exclude-glob other-files-to-exclude"

Warnung: Vergewissern Sie sich, dass das Zielverzeichnis vorhanden ist. Andernfalls schlägt der Befehl cd fehl, sodass der Vorgang einschließlich des Löschens von Dateibäumen im falschen Verzeichnis (Stammverzeichnis) ausgeführt wird.

Ich habe das Skript so aktualisiert, dass die --deleteOption standardmäßig deaktiviert ist. Aktivieren Sie sie, indem Sie das Kommentarzeichen entfernen DELETE= command.


Hat mir sehr geholfen. Aber ich musste die "set ftp: list-options -a;" was wo versautes Zeug.
Mat

1
Gibt es so etwas, das dasselbe über SFTP (FTPS?) Macht?
Trusktr

1
Ich würde dies vor tun cd $RCD, um so ein-Skript-mit-einem-Tippfehler zu verhindern , dass versehentlich Dateien aus dem falschen Verzeichnis zu löschen: set cmd:fail-exit yes. (Es scheint , lftpbemerkt nicht , dass es tatsächlich verlassen hat, bis Sie den nächsten Befehl.) - Und bevor cd $LCDich das tun würde (in dem lokal Shell, das heißt, an der Spitze des Scrip): set -eu.
KajMagnus

3
Tatsächlich habe ich beim ersten Ausführen meines Skripts das Remote-Verzeichnis noch nicht erstellt, sodass das Skript nicht in dieses nicht vorhandene Verzeichnis kopiert werden konnte. Dann startete das Skript mirrorund damit --delete: d Dateien aus dem falschen Verzeichnis. (Aber ich habe sie wieder zurückkopiert, also war es in diesem Fall egal. Vielleicht ist es für jemand anderen
wichtig

1
Fügen Sie neben @KajMagnus 'Ratschlägen zur Verwendung von' set -eu 'und' cd $ LCD '' mkdir -p $ LCD 'vor' cd $ LCD 'hinzu - so können Sie sicher sein, dass das Verzeichnis existiert und Sie' bist drin.
Paul Gear

25

Je nachdem, was Sie tatsächlich versuchen, könnte ein völlig anderer Ansatz curlftpszum Mounten eines FTP-Ordners und dann möglicherweise rsyncder beiden "lokalen" Ordner verwendet werden.

Die Installation ist abhängig von Ihrer Distribution unterschiedlich, daher kann ich das nicht verallgemeinern, aber Sie müssen installieren fuseund curlftpfs(wahrscheinlich hat Debian bereits fuseeine Standardinstallation):

  1. sudo apt-get install curlftpfs

  2. Stellen Sie sicher, dass das fuseModul geladen ist ( modprobe fuse)

  3. sudo curlftpfs ftp.yourserver.com /path/to/ftp/folder/ -o user=username:password,allow_other

Beachten Sie, dass nach dem letzten Komma kein Leerzeichen steht (kein Tippfehler!). Wenn Sie damit zufrieden sind oder dies nicht jedes Mal tun möchten, können Sie es zu Ihrer fstab hinzufügen (normalerweise in /etc/fstab):

curlftpfs#user:password@ftp.yourserver.com /path/to/ftp/folder/ fuse auto,user,uid=1000,allow_other 0 0

In diesem Fall müssen Sie vorher sicherstellen, dass das Sicherungsmodul geladen ist.

Seien Sie jedoch auf zwei Dinge hingewiesen:

  • Dass der Entwickler das Projekt vor ein oder zwei Jahren eingestellt hat, deshalb weiß ich vorerst nicht, wie brauchbar / stabil es ist.
  • Wenn das Passwort ein komisches Zeichen enthält, curlftpfskönnte das fehlschlagen (vielleicht kannst du etwas mit dem tun .netrc).

FTP Fuse und rsync sind der Frage am nächsten, aber offensichtlich verrückt nach etwas anderem als einer kleinen Menge kleiner Dateien.
Steve-o

1
Warum sollte es verrückt sein? Standardmäßig vergleicht rsync stat () s den Inhalt nicht. Dies kann durch ls -l mit einem FTP-Client erfolgen.
ptman

Ich habe es tatsächlich versucht (über rsnapshot) und es hat nicht funktioniert, jede Datei wurde zurückgegeben und es trat ein Fehler auf, der zeigte, dass rsync keinen Link erstellen konnte. Die Verwendung von lftp in Verbindung mit rsnapshot hat also den Trick gemacht
Konstantin Pereiaslov,

Fehlerfrei am 14.04 LTS; ein zusätzlicher Tipp: wenn Sie bereit sind , Ihre FTP - Site einfach aushängen verwenden , umount DIRwo DIRwar dein /path/to/ftp/folderoben.
Joe

1
2017 und das funktioniert immer noch! Ehrlich gesagt der einfachste Weg, um Dateien von einer enmasse FTP-Site zu kopieren. Mount lokal, dann rsync als wäre es lokal
td512

16

Es ist weex ...

Weex ist ein Dienstprogramm zur Automatisierung der Fernwartung einer Webseite oder eines anderen FTP-Archivs. Es synchronisiert eine Reihe lokaler Dateien mit einem Remote-Server, indem Uploads und Remote-Löschvorgänge nach Bedarf durchgeführt werden.


2
Funktioniert wie Charme! Sie lassen es so laufen: $ weex yourFTPconfigNameHier ist das Handbuch linuxcertif.com/man/1/weex
sobi3ch

9

rsync funktioniert nicht über FTP. Auf der Remote-Seite benötigt es entweder den rsync-Daemon oder eine Shell, von der aus es rsync aufrufen kann. Mit FTP können Sie im Allgemeinen einige Befehle aufrufen, und rsync ist keiner von ihnen. Es gibt andere Tools zur Automatisierung von FTP-Aufgaben wie "lftp".




5

Sie können curlftpfs verwenden, um ftp einzuhängen und rsync nach http://linux.die.net/man/1/curlftpfs zu verwenden


Willkommen bei ServerFault! Dies mag ein guter Anfang sein, aber einige weitere technische Details, warum dies ein besserer Ansatz ist, und möglicherweise eine Vorstellung davon, wie dies zu tun ist, könnten vernünftig sein.
Scott Pack

4

Ich benutze GVFS / FTP. Ich mounte meine entfernten FTP-Server mit Gigolo. Da sie als lokale Verzeichnisse angesehen werden, funktioniert fast alles, was mit lokalen Dateien arbeitet. Mit rsync können Datei-Hashes aus der Ferne berechnet werden, um Dateien zu vergleichen, ohne sie zu übertragen. Wenn Sie dies jedoch mit virtuellen Dateien tun, werden die Dateien trotzdem übertragen. unison und freefilesync funktionieren normalerweise gut, aber ich habe ein Problem festgestellt, als sie eine hochgeladene Datei umbenennen möchten, kein Problem beim Herunterladen. Dies könnte ein Problem mit gvfs 1.6.1 sein.


3

Die Lösung von Jonas S kann abhängig von den Umständen nützlich sein. Wenn Sie beispielsweise eine hohe Download-Geschwindigkeit und einen langsamen Upload haben, kann die Überprüfung der Dateien auf dem Server relativ schneller sein als das unnötige Hochladen von Dateien.

Wahrscheinlich möchten Sie CurlFTPFS verwenden: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

Im Allgemeinen ist es jedoch besser, einen regulären FTP-Client anstelle von rsync zu verwenden.


2

Ich glaube nicht, dass Sie dazu in der Lage sind. Auf dem Server, auf dem Sie Rsync ausführen möchten, wird nur ein FTP-Server ausgeführt. Die von Rsync gesendeten Befehle werden nicht verstanden.

Wenn Sie dies tun möchten, weil Sie nur Zugriff auf Port 21 haben, aber die Kontrolle über den Server haben, können Sie den Port ändern, den Rsync auf dem Server überwacht, aber dies ist natürlich nur sinnvoll, wenn Sie dies nicht tun möchte FTP auf diesem Port verwenden.


2

Wenn Sie die Aufgabe automatisieren möchten, verwenden Sie lftp, da Sie ein Skript wie oben beschrieben erstellen können. Wenn Sie nach einer einmaligen Lösung suchen (dh Sie müssen eine gesamte Website herunterladen), können Sie das Skript ganz einfach nach Ihren Wünschen erstellen via ftp / verschiebe es auf einen anderen Server) benutze ncftp, es ist einfach, installiere es wenn es noch nicht installiert ist:

apt-get install ncftp

oder

yum install ncftp

(Entschuldigung, nicht auf Debian / Red Hat basierende Distributionen.)

Einmal installiert, öffne ncftp im Terminal und tippe:

open -u ftpusername ftp.thedomain.com

Es fragt Sie nach dem Passwort, gibt es ein und dann:

get -R /home/remotewebsite/public_html/ /home/localwebsite/public_html/

Es erledigt den Rest der Arbeit für Sie. Viel Glück



0

Es gibt auch wput:

wput --timestamping --reupload --dont-continue source-files ftp://target.host/dir

Der Benutzername und das Passwort werden von ~ / .netrc gelesen. Andernfalls können Sie sie als ftp: // Benutzername: password@target.host angeben, wenn Sie nicht besonders auf Sicherheit bedacht sind .


0

Dafür habe ich ein eigenes Kommandozeilen-Tool erstellt: ftpsync

Warum? Weil es einfach und elegant ist, erfordern andere Tools eine Menge Abhängigkeiten, manchmal kompilieren, manchmal funktionieren sie nicht (z. B. LFTP auf MacOs High Sierra). Ftpsync ist in reinem Python geschrieben, benötigt keine Bibliotheken von Drittanbietern und ist klein. Sie können die Datei einfach in Ihr Projekt einbinden.

Verwendung: CD in Ihr Projektverzeichnis und geben Sie Folgendes ein:

ftpsync user:pass@ftp.address.url/remote/dir --delete

--delete steht für das Löschen von entfernten Dateien, die lokal nicht existieren.

Wenn Sie nicht synchronisieren möchten, sondern nur einen rohen FTP-Befehl ausführen möchten, verwenden Sie:

ftpsync -c '...'

Es ist nützlich für einige einfache Operationen wie das Senden und Umbenennen von Dateien:

ftpsync -c 'PASV; TYPE I; STOR some_file.ext; RNFR some_file.ext; RNTO some_file_renamed.ext'

Ich bin aus demselben Grund darauf gestoßen wie andere. Eine Notwendigkeit für ein gutes Synchronisierungsdienstprogramm über das FTP-Protokoll. Ihr Tool sieht gut aus, aber ich konnte es nicht verwenden, da ich es von Remote herunterladen und mit lokal synchronisieren muss. Ich möchte vermeiden, dass bereits heruntergeladene Dateien heruntergeladen werden. Auf lokaler Ebene bearbeite ich heruntergeladene Dateien, wodurch sich diese unterscheiden. Das sollte beim nächsten Ausführen des FTP-Skripts übersprungen werden. Im Moment schwer eine Lösung zu finden.
Anup

Ja, eigentlich ist es One-Way-Sync.
Superdario128

0

rclone ist eine nette Software, die Verzeichnissynchronisierung über FTP und viele andere Protokolle, einschließlich Cloud-Speicheranbieter (Amazon S3, Dropbox, Google Drive), ausführt. Es kann mit einer beliebigen Kombination aus lokalem Speicher oder Remotespeicher synchronisiert werden.

ftpBefolgen Sie diese Anweisungen, um eine Fernbedienung einzurichten .

Sobald dies erledigt ist, ist der Synchronisierungsvorgang:

rclone sync /home/dir FTP_REMOTE:/home --progress 

-7

Installiere sftp und dann kannst du rsync benutzen.

Ich benutze den folgenden.

rsync --delete --times --recursive --perms --owner --group --verbose --progress --stats -e ssh root@192.168.0.100:/folder1/ /folder2/

7
Das ist kein FTP, es benutzt wahrscheinlich das SSH-interne SFTP-Subsystem (zumindest ist es das, was es in der Standardkonfiguration tut)
Serverhorror

csync (sftp) und rsync funktionieren möglicherweise genauso
Rajat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.