Tags: FTP, Scripts, Automatisierung
Wenn man Dateien regelmäßig von einem FTP-Server herunterladen muss, dann bietet Windows zwei Bordmittel an, um diesen Vorgang zu automatisieren. Es handelt sich dabei um ftp.exe sowie um das später hinzugekommene curl. Für Letzteres benötigt man nur einen Befehl, für FTP kann man dafür ganze Scripts nutzen.
Ein typisches Szenario für den regelmäßigen Download von Dateien könnte das Backup eines Web-Servers sein, das man lokal abspeichern möchte. In diesem Fall wäre es günstig, wenn sich der ganze Vorgang ohne Eingriff eines Benutzers ausführen ließe. Dann könnte man das Herunterladen der Backup-Dateien vom FTP-Server als Task in der Aufgabenplanung hinterlegen.
Der Windows-eigene FTP-Client ist schon seit Ewigkeiten an Bord und hat seitdem kein nennenswertes Update mehr erhalten. Er unterstützt somit keinen verschlüsselten Transport, sondern nur die Übertragung im Klartext. In einem sicheren Netzwerk und für nicht allzu kritische Daten kann man das Tool aber sicherlich verwenden.
Windows-FTP ist anders als etwa FileZilla ein spartanisches Programm für die Kommandozeile, das man aber dafür mit einer Abfolge von Befehlen aus einer Textdatei füttern kann. Nach dem Aufbau der Verbindung und der Anmeldung am Server kann man grundsätzlich alle Befehle hinterlegen, die auch im interaktiven Modus zulässig sind.
Dieses Beispiel legt zuerst das Download-Verzeichnis des Benutzers als lokales Arbeitsverzeichnis fest, verbindet sich mit dem Server und meldet sich mit Benutzernamen und dessen Passwort an.
Anschließend ist es sinnvoll, den interaktiven Modus mit prompt zu deaktivieren, weil das Script sonst beim Bestätigen mehrfacher Downloads hängenbleibt.
Mit binary wechselt man vom standardmäßigen ASCII- in den Binärmodus, der etwa für ZIP-Archive angebracht ist.
Wenn man sich anschließend noch nicht im richtigen Verzeichnis befindet, könnte man mit cd dorthin wechseln. Der Download erfolgt dann mit get bzw. mget, wenn man mehrere Dateien herunterladen will. Letzteres unterstützt Wildcards, so dass man als nächsten Befehl etwa
mget *.gz
in die obige Datei einträgt. Will man die Dateien nach dem Transfer löschen, dann folgt ein
mdelete *.gz
Die Session beendet man dann mit quit.
Wenn man alle Befehle in einer Textdatei gespeichert hat, zum Beispiel mit dem Namen autoftp.txt, dann startet man den Download mit
ftp.exe -s:autoftp.txt
FTP-Download mit curl
Seit Windows 10 1809 gehört eine Implementierung von curl zum Lieferumfang des Betriebssystems. Wenn man es allerdings unter PowerShell starten möchte, dann ruft man damit Invoke-WebRequest auf, weil standardmäßig ein solches Alias definiert ist. Man muss dort also curl.exe eingeben.
Das Utility unterstützt mehrere Protokolle, darunter auch FTP und im Unterschied zu ftp.exe auch FTPS (über TLS). Gibt man den Schalter --ftp-ssl an, dann versucht es, eine sichere Verbindung aufzubauen und fällt auf FTP zurück, wenn dies nicht klappt. Erzwingen kann man FTPS mit --ssl-reqd.
Die automatische Anmeldung erfolgt über den Parameter -u username:passwort bzw. --user username:passwort, gefolgt vom Pfad zur gewünschten Datei:
curl.exe -u ftp:ftp -O ftp.gnu.org/gnu/wget/wget2-latest.tar.gz
Über den Schalter -O teilt man curl mit, dass es die Datei unter dem gleichen Namen speichern soll. Will man eine andere Datei als Ziel, dann könnte man dies so erreichen:
curl.exe -u ftp:ftp ftp.gnu.org/gnu/wget/wget2-latest.tar.gz -o wget.tar.gz
Um beliebige Dateien aus einem Verzeichnis herunterzuladen, ist curl weniger flexibel als FTP, zumindest die Implementierung für Windows. Man kann sich zwar den Inhalt eines Verzeichnisses anzeigen lassen, indem man einen abschließenden Schrägstrich anhängt:
curl ftp://ftp.gnu.org/gnu/wget/ -u ftp:ftp
Für die Automatisierung hilft das aber nicht weiter, hier würde man Wildcards benötigen, wenn sich die Namen der Dateien regelmäßig ändern (etwa im Fall von Backups, deren Namen meist das Datum enthalten).
Fazit
FTP ist ein altgedientes Verfahren für den Dateitransfer und bietet auch die Möglichkeit, Abläufe über Kommandos zu automatisieren, die man einfach Zeile für Zeile in einer Textdatei speichert. Der Windows-Client unterstützt jedoch keine sicheren Verbindungen, so dass man seinen Einsatz auf Umgebungen beschränken muss, wo dies kein Problem ist.
In der Windows-Welt ist curl ein Neuling, der eine Vielzahl von Optionen bietet und mit mehreren Protokollen zurechtkommt. Für die Automatisierung von FTP-Downloads ist es aber weniger flexibel als FTP.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Microsoft Graph: Einheitliches (PowerShell)-API für Microsofts Cloud-Dienste
- SFTP-Server auf Windows einrichten
- GPO mit Active-Directory-Provider von Terraform erstellen und konfigurieren
- PowerShell für Logon-Scripts verwenden
- Configuration Manager 2309: zeitgesteuerte Script-Ausführung, Dashboard für Windows 11, Integration von Azure Logic App
Weitere Links
2 Kommentare
Hallo!
Man kann sich helfen, indem man entweder die Ausgabe des curl-Befehls für das Anlisten der Dateien in einer for-Schleife auswertet und dann die Dateien einzeln an einen zweiten curl-Befehl übergibt oder einen Umweg nehmen, indem man zuerst die Ausgabe des curl-Befehls für das Anlisten der Dateien in eine Textdatei umleitet und diese dann mit einem for-Befehl auswertet und dadurch die Dateinamen an einen zweiten curl-Befehl übergibt.
Klingt kompliziert, ist aber letztendlich ganz einfach.
Funktioniert bei mir mit sehr gutem Erfolg.
Gruß
Bodo
Was auch funktioniert ist wget bzw. BITS via PowerShell.