Wie lade ich ein Verzeichnis rekursiv mit ftp oder lftp auf einen FTP-Server hoch?

19

Ich schreibe ein Linux-Shell-Skript, um ein lokales Verzeichnis auf einen Remote-Server zu kopieren (und vorhandene Dateien zu entfernen).

Lokaler Server: ftp und lftpBefehle sind verfügbar, keine ncftp oder grafische Werkzeuge.

Remote Server: nur über FTP erreichbar. Weder rsync noch SSH noch FXP.

Ich denke darüber nach, lokale und entfernte Dateien aufzulisten, um ein LFTP-Skript zu generieren und es dann auszuführen. Gibt es einen besseren Weg?

Hinweis: Das Hochladen nur geänderter Dateien ist von Vorteil, aber nicht erforderlich.

Nicolas Raoul
quelle
ist ncftp total außer frage? Wäre imho am einfachsten. (und ich weiß, es wird es tun, wie ich es so benutze)
Sirex
Sirex: Ich würde es lieber mit Tools machen, die standardmäßig in RedHat enthalten sind. Wenn sich LFTP als unbrauchbar erweist, füge ich den Benutzern eine Anforderung hinzu, ncftp zu installieren.
Nicolas Raoul
Die Syntax für wput(einen wget-ähnlichen FTP-Uploader):wput dir/ ftp://user:pass@host/dir
Kenorb

Antworten:

39

lftp sollte dies in einem Schritt tun können, insbesondere mit lftp mirror:

BEARBEITEN: Die lftp-Befehlssyntax ist verwirrend, der ursprüngliche Aufruf, den ich gepostet habe, funktioniert nicht. Versuchen Sie es wie folgt:

lftp -e "mirror -R {lokales Verzeichnis} {fernes Verzeichnis}" -u {Benutzername}, {Passwort} {Host}

Beachten Sie die Anführungszeichen um die Argumente für den -eSchalter.

Phil Hollenback
quelle
1
+1 für den Hinweis, dass der Spiegelungsmodus von lftp auch dann funktioniert, wenn FXP nicht verfügbar ist (ich war vom Gegenteil überzeugt, nachdem ich tutorials.papamike.ca/pub/lftp.html gelesen hatte, wonach "beide Server dieses Protokoll unterstützen müssen, damit dieser Vorgang erfolgreich ist "). Dieser spezielle Befehl schlägt jedoch auf meinem Ubuntu-Server fehl: lftp: mirror: Name oder Dienst nicht bekannt, Unbekannter Befehl `-R '.
Nicolas Raoul
Ich habe meine Antwort mit einem besseren Aufruf von lftp umformuliert, hoffentlich hilft das.
Phil Hollenback
Ich hab es endlich geschafft zu arbeiten! Es scheint, dass Sie remote und lokal wechseln müssen, damit es funktioniert. Bitte aktualisieren Sie und ich werde diese Antwort akzeptieren. Hier ist eine Kommandozeile, die funktioniert: lftp -e "mirror -R / tmp / mylocalfiles / var / www" -u remoteuser, remotepassword remoteserver
Nicolas Raoul
Ich denke, ich habe in den LFTP-Dokumenten gesehen, dass Sie die lokalen und Remote-Verzeichnisse wechseln mussten, wenn Sie -R verwenden, aber ich muss vergessen haben. Aktualisiert meine Antwort.
Phil Hollenback
Wie scheitert es? Haben Sie versucht, 'lftp -vvv' für eine ausführlichere Ausgabe auszuführen, um festzustellen, was versucht wird?
Phil Hollenback
1

Basierend auf Phils Idee, den Spiegelmodus von lftp zu verwenden, führt dieser Befehl den folgenden Trick aus:

lftp -c 'open -e "mirror /tmp/thedir ftp://nico:mypass@remotehost/~/destination/" ftp://nico:mypass@localhost'

Ein Nachteil ist, dass auf dem lokalen Server ein FTP-Server ausgeführt werden muss.

Nicolas Raoul
quelle
1
cd {local_dir}
lftp {server}
cd {remote_dir}
mput {local_dir}/*

Das hat bei mir geklappt, viele andere Versuche sind gescheitert. Einmal in LFTP, weitere Informationen erhalten Sie über:

help mput
Austin
quelle
2
Es wäre wahrscheinlich besser, mirror -Rhier zu verwenden .
Gauteh
@gauteh du hast recht. Beste Antwort ^
Austin
0

Endlich die Antwort !!! Erstellen Sie das Shell-Skript ftpmirror.sh

#!/bin/bash 
path = /local-dir-path
lftp -e "mirror -R $path /$path" -u username,password ftp-server-ip
  • Pfad = lokales Verzeichnis, das auf den FTP-Server kopiert werden soll
  • Benutzername = FTP-Server Benutzername
  • Passwort = FTP-Server-Passwort
  • ftp-server-ip = IP-Adresse des FTP-Servers

Wenn das lftp-Paket nicht installiert ist, installieren Sie es mit yum.

Kiran Zinjurde
quelle