Der De-facto-Standard für die Übertragung von Dateien via Internet heißt FTP (File Transfer Protocol). Das Protokoll existiert schon seit vielen Jahren, und obwohl es nicht besonders sicher ist, hat es aufgrund seiner Robustheit und Beliebtheit wohl noch eine lange Zukunft vor sich. Dieser Artikel verrät, wie Sie mit Hilfe eines Skripts eine Verbindung zu FTP-Servern aufbauen und Dateien herunterladen können.
<C>.netrc<C> richtig eingesetzt
Egal, ob Sie FTP im Batch- oder interaktiven Modus verwenden: Eine automatische Anmeldung bei der Gegenstelle spart das lästige Eintippen von Username und Passwort. Dafür sorgt eine Datei namens .netrc in Ihrem Home-Verzeichnis. Stellen Sie die Berechtigungen für .netrc auf Lesen/Schreiben nur für den Dateibesitzer (chmod 600): Benutzernamen und Passworte lagern dort im Klartext.
Die Datei kann mehrere Einträge für Remote-Sites enthalten. Sobald Sie eine .netrc besitzen und einen FTP-Befehl für eine dort aufgeführte Maschine eingeben, greift FTP auf den Benutzernamen und das Passwort des Eintrags zurück.
Die Einträge in der .netrc müssen in keinem bestimmten Format vorliegen; Sie können die einzelnen Informationen können wahlweise durch Leerzeichen, Tabulatoren oder Zeilenumbrüche trennen. Recht übersichtlich fällt aber die Variante unter Verwendung von Zeilenumbrüchen aus:
machine RemoteHost
login LoginName
password Passwort
password PasswortFuerKonto
Für jeden Remote-Host enthält die Datei einen Eintrag. Als Passwort geben Sie das für den Aufbau der Verbindung erforderliche Passwort an. Ein PasswortFuerKonto brauchen Sie nur dann, wenn der Remote-Host eine zusätzliche Authentifizierung verlangt – in der Regel genügen die ersten drei Einträge.
Listing 1 zeigt eine .netrc mit drei Einträgen, wobei hier alle Daten für eine Gegenstelle in einer Zeile stehen. Beim ersten Eintrag handelt es sich um einen öffentlichen FTP-Server im Web, deshalb der Loginname anonymous. Obwohl es als höflich gilt, die eigene E-Mail-Adresse als Passwort für die anonyme Anmeldung anzugeben, ist das nicht zwingend erforderlich. Die beiden anderen Zeilen stehen für Hosts im internen Netzwerk.
Listing 1
machine ftp.emea.ibm.com login anonymous password david.tansley@btinternet.com machine uk01lx6001 login dxtans password lOopy machine uk04lx6003 login dxtans password mas123
Um eine Verbindung zum Host uk01lx6001 aufzubauen, geben Sie ftp uk01lx6001 ein. Der FTP-Client sucht dann in .netrc nach dem Hostnamen uk01lx6001. Anschließend setzt er die Login- und Passworteinträge für den Verbindungsaufbau am Remote-Server ein. Einen Überblick über die Startoptionen des FTP-Kommandos gibt die Tabelle "FTP-Optionen".
FTP-Optionen
| Option | Bedeutung |
|---|---|
| -p | Verwendet für Datenübertragung den so genannten passiven Modus. Er ist erste Wahl, wenn Ihr Rechner hinter einer Firewall steht, weil der Client dann dem Server den zu nutzenden Port mitteilt. Heute gilt der passive Modus als Standard, aber es gibt noch ältere Versionen, die diesen Modus nicht als Voreinstellung wählen. |
| -i | Damit fragt der Client vor jedem FTP-Transfer noch einmal nach einer Bestätigung. Wenn Sie wissen, welche Dateien Sie abholen oder schreiben wollen, ist diese Option sehr nützlich. |
| -n | Unterbindet die automatische FTP-Anmeldung beim Verbindungsaufbau. Wenn Auto-Login aktiviert ist, sucht FTP in .netrc nach den Login-Daten. Findet FTP keine passenden Informationen in .netrc, fragt es nach Benutzernamen und Passwort.
|
| -v | Setzt den so genannten Verbose-Modus, in dem FTP etwas detailliertere Informationen ausgibt. |
Wie man Dateien abholt
Das erste FTP-Skript soll eine Verbindung zu einem Remote-Host aufbauen und die Datei /etc/hosts herunterladen (siehe Listing 2). Die erste Zeile nach dem Bash-Aufruf schaltet den interaktiven Modus von FTP aus und den Verbose-Modus ein.
Um ftp mit Befehlen zu füttern, kommt anschließend ein so genanntes Here-Dokument zum Einsatz. Alle Kommandos zwischen der Startmarke <<EOCMDS und der gleichnamigen Schlussmarke EOCMDS übergibt die Shell dem FTP-Client als Eingabe. Statt EOCMDS können sie dabei einen beliebigen Namen für die Marke verwenden.
Zunächst baut die Befehlsfolge eine Verbindung zum Host uk01lx6001 auf. Anschließend legt das Skript für die Übertragung mit ascii den ASCII-Modus fest. Lokal wechselt das Skript ins Verzeichnis /tmp, auf der Gegenseite nach /etc. Dann findet die eigentliche Übertragung der Datei hosts statt, die das Skript im Verzeichnis /tmp ablegt. Der Befehl quit beendet den FTP-Client.
Listing 2
#!/bin/bash ftp -i -v <<EOCMDS open uk01lx6001 ascii lcd /tmp cd /etc get hosts quit EOCMDS
Sie können die Methode auch verwenden, um eine Liste der zu übertragenden Dateien anzugeben. Allerdings müssen Sie dann für jeden Transfer eine Verbindung auf- und wieder abbauen. Wie das funktioniert, zeigt Listing 3. Eine for-Schleife innerhalb des FTP-Codeblocks können Sie deshalb nicht verwenden, weil Sie an dieser Stelle mit der FTP-Verbindung zum Remote-Host arbeiten und nicht mit der Bash-Shell.
Listing 3
#!/bin/bash
list="hosts hosts.allow hosts.deny"
for files in ${list}; do
ftp -i -v <<EOCMDS
open uk01lx6001
ascii
lcd /tmp
cd /etc
get ${files}
quit
EOCMDS
done



