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
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.