3 Stimmen

Rekursiv Dateien auf einem Remote-Server mittels FTP hochladen

Ich befinde mich derzeit in einer Situation, in der ich nur sehr begrenzten Zugriff auf einen Server habe, aber eine erhebliche Menge an Dateien innerhalb einer einzigen Verzeichnisstruktur hochladen und herunterladen muss. Ich habe keinen SSH-Zugriff, daher kann ich SCP nicht verwenden - und auch rsync ist leider keine Option.

Derzeit verwende ich ncftpput, das großartig ist, aber anscheinend ziemlich langsam ist (trotz einer schnellen Verbindung).

Gibt es eine alternative / bessere Methode, die ich in Betracht ziehen könnte?

(Bitte entschuldigen Sie, wenn dies bereits behandelt wurde, ich habe vor dem Beitrag eine schnelle Suche durchgeführt, aber nichts gefunden, was meine Frage speziell beantwortet)

2 Stimmen

Für ncftp - Verwenden Sie den Befehl "put -R", um ein rekursives Verzeichnis-Upload durchzuführen?

0 Stimmen

Ich stimme zu - ich denke, ein Teil des Problems ist, dass FTP ziemlich veraltet ist ... daher gibt es möglicherweise keine ideale Lösung.

4voto

DmitryK Punkte 5424

Probieren Sie es mit LFTP: http://lftp.yar.ru/

oder YAFC: http://yafc.sourceforge.net/index.php

0 Stimmen

Vielen Dank dafür .. Ich habe gerade YAFC kompiliert und es scheint sehr gut zu sein

2voto

Ryan C. Thompson Punkte 38726

Wenn Sie eine gute Verbindung haben, würde ich empfehlen, den FTP-Server über die GNOME- oder KDE-Dateimanager zu mounten oder CurlFtpFS zu verwenden. Dann können Sie ihn wie einen ganz normalen Ordner behandeln.

0 Stimmen

Dies ist eine schreckliche Antwort. Es gibt keinen Weg, dass dies schneller als FTP wäre, und es ist viel riskanter, besonders bei großen Datenmengen, da es keinen Unterbrechungswiederherstellungssupport bietet. Und wenn er keinen Zugriff auf SSH hat, wie soll er es für das Mounten konfigurieren?

0 Stimmen

Keine Serverkonfiguration ist erforderlich. Der Server ist bereits für FTP konfiguriert. Und es geht nicht darum, die Dinge schneller zu machen, sondern leichter. Nach dem Mounten mit CurlFtpFS könnte man Standard-Unix-Tools wie cp und rsync verwenden. Ich habe gesagt, es funktioniert am besten mit einer guten Verbindung.

1voto

audiodude Punkte 1807

Ich bin nicht vertraut mit ncftpput. Für nicht-interaktives FTP habe ich immer das Perl Net::FTP-Modul verwendet - http://perldoc.perl.org/Net/FTP.html

Dies wird schneller sein, weil du dich anmelden kannst und dann alle Übertragungen auf einmal durchführen kannst (es scheint, dass du bei einem schnellen Überblick ncftpput einmal für jede Datei-Get/Put ausführst).

Vergiss einfach NIE, ASCII-Mangling zu verwenden! Dies ist der Standard, also verwende:

$ftp->binary

ASCII-Mangling muss im gleichen Feuer sterben wie die automatische Zeitzoneninterpretation von MySQL.

0voto

sdaau Punkte 34279

Weil ich immer wieder Probleme damit habe, werde ich meine Notizen hier veröffentlichen:

Eines der Dinge, bei denen ich immer durcheinanderkomme, ist die Syntax; also gibt es unten ein bash Testskript, das einige temporäre Verzeichnisse erstellt, dann einen temporären FTP-Server startet und rsync (im einfachen lokalen Dateimodus, da es kein FTP unterstützt) mit lftp und ftpsync vergleicht.

Der Punkt ist - du kannst rsync /Pfad/zum/lokalen /Pfad/zum/remote/ verwenden, und rsync wird automatisch herausfinden, dass du ein lokal Unterverzeichnis unter remote erstellen möchtest; aber für lftp oder ftpsync musst du das Zielverzeichnis manuell angeben, wie in ... /Pfad/zum/lokalen /Pfad/zum/remote/lokal (wenn es nicht existiert, wird es erstellt).

Du kannst den ftpserver-cli.py in Wie kann ich vorübergehend einen FTP-Server ausführen? - Ask Ubuntu finden; und ftpsync ist hier: FTPsync (aber beachte, dass es fehlerhaft ist; siehe auch Suche/grep FTP-Remote-Dateinamen - Unix & Linux Stack Exchange);

Hier ist eine gekürzte Ausgabe des puttest.sh Skripts, das das rekursive Put-Verhalten in verschiedenen Fällen zeigt:

$ bash puttest.sh 
Verzeichnisse neu erstellen; loctest füllen, srvtest leer halten:
Verzeichnisse anzeigen:
+ tree --noreport -a /tmp/srvtest /tmp/loctest
/tmp/srvtest
/tmp/loctest
 .git
    tempa2.txt
 tempa1.txt

*HINWEIS: rsync kann automatisch das übergeordnete Verzeichnis ermitteln:
+ rsync -a --exclude '*.git*' /tmp/loctest /tmp/srvtest/
Verzeichnisse anzeigen:
+ tree --noreport -a /tmp/srvtest /tmp/loctest
/tmp/srvtest
 loctest
     tempa1.txt
/tmp/loctest
 .git
    tempa2.txt
 tempa1.txt
Aufräumen:
+ rm -rf /tmp/srvtest/loctest

Temporären FTP-Server starten:
+ sudo bash -c 'python /Pfad/zu/pyftpdlib/ftpserver-cli.py --username=user --password=12345 --directory=/tmp/srvtest &'
+ sleep 1
Verwendung: Benutzer: user Passwort: 12345 Port: 21 Verz.: /tmp/srvtest
[I 14-03-02 23:24:01] >>> starte FTP-Server auf 127.0.0.1:21, pid=21549 <<<
[I 14-03-02 23:24:01] Poller: 
[I 14-03-02 23:24:01] Maskerade (NAT)-Adresse: Keine
[I 14-03-02 23:24:01] Passive Ports: Keine
[I 14-03-02 23:24:01] Benutze sendfile(2): False
Test mit lftp:

*HINWEIS: lftp synchronisiert *Inhalte* des lokalen Verzeichnisses (rsync-ähnliche Syntax erstellt kein Zielverzeichnis):
+ lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest / ; exit' -u user,12345 127.0.0.1
Verzeichnisse anzeigen:
+ tree --noreport -a /tmp/srvtest /tmp/loctest
/tmp/srvtest
 tempa1.txt
/tmp/loctest
 .git
    tempa2.txt
 tempa1.txt
Aufräumen:
+ rm -rf /tmp/srvtest/tempa1.txt

*HINWEIS: lftp-Zielverzeichnis explizit angeben (wird automatisch erstellt):
+ lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest /loctest ; exit' -u user,12345 127.0.0.1
Verzeichnisse anzeigen:
+ tree --noreport -a /tmp/srvtest /tmp/loctest
/tmp/srvtest
 loctest
     tempa1.txt
/tmp/loctest
 .git
    tempa2.txt
 tempa1.txt
Aufräumen:
+ sudo rm -rf /tmp/srvtest/loctest

*HINWEIS: ftpsync synchronisiert *Inhalte* des lokalen Verzeichnisses (rsync-ähnliche Syntax erstellt kein Zielverzeichnis); auch Info-Modus -i hat Fehler (es setzt, obwohl es nicht sollte):

*HINWEIS: ftpsync --ignoremask ist für alten ungenutzten Code; verwenden Sie stattdessen --exclude (aber es hat Fehler; muss in der Quelle geändert werden)
+ /Pfad/zu/ftpsync/ftpsync -i -d '--exclude=.*\.git.*' /tmp/loctest ftp://user:12345@127.0.0.1/
Verzeichnisse anzeigen:
+ tree --noreport -a /tmp/srvtest /tmp/loctest
/tmp/srvtest
 tempa1.txt
/tmp/loctest
 .git
    tempa2.txt
 tempa1.txt
Aufräumen:
+ sudo rm -rf /tmp/srvtest/tempa1.txt

*HINWEIS: ftpsync-Zielverzeichnis explizit angeben (wird automatisch erstellt):
+ /Pfad/zu/ftpsync/ftpsync -i -d '--exclude=.*\.git.*' /tmp/loctest ftp://user:12345@127.0.0.1/loctest
Verzeichnisse anzeigen:
+ tree --noreport -a /tmp/srvtest /tmp/loctest
/tmp/srvtest
 loctest
     tempa1.txt
/tmp/loctest
 .git
    tempa2.txt
 tempa1.txt
Aufräumen:
+ sudo rm -rf /tmp/srvtest/loctest
+ sudo pkill -f ftpserver-cli.py

Und hier ist das puttest.sh Skript:

#!/usr/bin/env bash
set -x

# ändere diese Pfade entsprechend deiner Installationen:
FTPSRVCLIPATH="/Pfad/zu/pyftpdlib"
FTPSYNCPATH="/Pfad/zu/ftpsync"

{ echo "Verzeichnisse neu erstellen; loctest füllen, srvtest leer halten:"; } 2>/dev/null

sudo rm -rf /tmp/srvtest /tmp/loctest

mkdir /tmp/srvtest

mkdir -p /tmp/loctest/.git
echo aaa > /tmp/loctest/tempa1.txt
echo aaa > /tmp/loctest/.git/tempa2.txt

{ echo "Verzeichnisse anzeigen:"; } 2>/dev/null
tree --noreport -a /tmp/srvtest /tmp/loctest

{ echo -e "\n*HINWEIS: rsync kann automatisch das übergeordnete Verzeichnis ermitteln:"; } 2>/dev/null

rsync -a --exclude '*.git*' /tmp/loctest /tmp/srvtest/

{ echo "Verzeichnisse anzeigen:"; } 2>/dev/null
tree --noreport -a /tmp/srvtest /tmp/loctest

{ echo "Aufräumen:"; } 2>/dev/null
rm -rf /tmp/srvtest/*

{ echo -e "\nTemporären FTP-Server starten:"; } 2>/dev/null

# https://askubuntu.com/questions/17084/how-do-i-temporarily-run-an-ftp-server

sudo bash -c "python $FTPSRVCLIPATH/ftpserver-cli.py --username=user --password=12345 --directory=/tmp/srvtest &"
sleep 1

{ echo "Test mit lftp:"; } 2>/dev/null
# siehe http://russbrooks.com/2010/11/19/lftp-cheetsheet
# Der -R Schalter bedeutet "umgekehrtes Spiegeln" was "setzen" [hochladen] bedeutet.
{ echo -e "\n*HINWEIS: lftp synchronisiert *Inhalte* des lokalen Verzeichnisses (rsync-ähnliche Syntax erstellt kein Zielverzeichnis):"; } 2>/dev/null

lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest / ; exit' -u user,12345 127.0.0.1

{ echo "Verzeichnisse anzeigen:"; } 2>/dev/null
tree --noreport -a /tmp/srvtest /tmp/loctest

{ echo "Aufräumen:"; } 2>/dev/null
rm -rf /tmp/srvtest/*

{ echo -e "\n*HINWEIS: lftp-Zielverzeichnis explizit angeben (wird automatisch erstellt):"; } 2>/dev/null

lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest /loctest ; exit' -u user,12345 127.0.0.1

{ echo "Verzeichnisse anzeigen:"; } 2>/dev/null
tree --noreport -a /tmp/srvtest /tmp/loctest

{ echo "Aufräumen:"; } 2>/dev/null
sudo rm -rf /tmp/srvtest/*

{ echo -e "\n*HINWEIS: ftpsync synchronisiert *Inhalte* des lokalen Verzeichnisses (rsync-ähnliche Syntax erstellt kein Zielverzeichnis); auch Info-Modus -i hat Fehler (es setzt, obwohl es nicht sollte):"; } 2>/dev/null
{ echo -e "\n*HINWEIS: ftpsync --ignoremask ist für alten ungenutzten Code; verwenden Sie stattdessen --exclude (aber es hat Fehler; muss in der Quelle geändert werden)"; } 2>/dev/null

$FTPSYNCPATH/ftpsync -i -d --exclude='.*\.git.*' /tmp/loctest ftp://user:12345@127.0.0.1/

{ echo "Verzeichnisse anzeigen:"; } 2>/dev/null
tree --noreport -a /tmp/srvtest /tmp/loctest

{ echo "Aufräumen:"; } 2>/dev/null
sudo rm -rf /tmp/srvtest/*

{ echo -e "\n*HINWEIS: ftpsync-Zielverzeichnis explizit angeben (wird automatisch erstellt):"; } 2>/dev/null

$FTPSYNCPATH/ftpsync -i -d --exclude='.*\.git.*' /tmp/loctest ftp://user:12345@127.0.0.1/loctest

{ echo "Verzeichnisse anzeigen:"; } 2>/dev/null
tree --noreport -a /tmp/srvtest /tmp/loctest

{ echo "Aufräumen:"; } 2>/dev>null
sudo rm -rf /tmp/srvtest/*

sudo pkill -f ftpserver-cli.py

{ set +x; } 2>/dev/null

0voto

Paul Williams Punkte 2694

Keine Erwähnung von ncftp?

In Ubuntu, sudo apt install ncftp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X