Automatisierte Dateiübertragung (ftp / sftp / scp ..usw..)

  • Wer gerne zwischen 2 Rechnern automatisch Dateien übertragen möchte, zum Beispiel für Backups oder auch einfach nur Bilder von der PiCam, der steht oftmals vor dem Problem nicht zu wissen wie er dies anstellen kann...

    Ich möchte euch hier ein paar Möglichkeiten beschreiben wie ihr eine solche Übertragung automatisieren könnt, egal ob regelmäßig via crontab oder manuell angestoßen.

    Dabei gibt es je nach Methode ein paar Dinge zu beachten, was inbesondere die Sicherheit betrifft aber auch Voraussetzungen die erfüllt sein müssen.

    Auch kann man sich meistens aussuchen auf welchem Rechner das Script zur Übertragung eingerichtet wird. Es muss nämlich nicht da laufen wo die Datei zur Übertragung erstellt wird - Wer es Zeitlich abstimmt (erstellen und das herunterladen der Datei) kann das Script zur Übertragung auch auf dem Ziel-Rechner laufen lassen.


    • Methode über FTP (File Transfer Protocol) oder auch FTPS (FTP over SSL)

      • Setzt voraus das die Gegenstelle einen FTP-Server installiert hat und ihr auch einen FTP-Benutzer habt der im jeweiligen Verzeichnis schreiben darf
    • Methode über SFTP (FTP over SSH)

      • Setzt voraus das die Gegenstelle einen SSH-Server installiert hat und ihr auch einen SSH-Benutzer habt der im jeweiligen Verzeichnis schreiben darf
    • Methode über SCP (Secure CoPy)

      • Setzt voraus das die Gegenstelle einen SSH-Server installiert hat und ihr auch einen SSH-Benutzer habt der im jeweiligen Verzeichnis schreiben darf


    Technischer Hintergrund:

    Spoiler anzeigen


    Was ist SSH/SCP/SFTP?

    Als SSH (Secure Shell) werden Protokolle und gleichzeitig eine Suite aus Anwendungen bezeichnet, die SSH implementieren. OpenSSH wird vom OpenBSD Projekt gepflegt und weiterentwickelt. Die Protokolle werden in den Internet- Drafts der IETF Working Group Secure Shell (secsh) definiert.

    Der Vorteil von SSH, SCP und SFTP im Gegensatz zu FTP oder Telnet liegt darin, dass beginnend bei der Authentifizierung von User und Server bis zum Transfer der Daten alles kryptographisch verschlüsselt wird. Dabei kommen die gleichen Algorithmen zum Einsatz wie zB bei PGP, u. a. AES, Triple-DES, Blowfish und CAST, DSA und RSA. Das heißt einem "Angreifer" ist es nicht möglich, Passwörter und Daten abzufangen, die bei FTP im Klartext übertragen werden.

    SCP ist die Abkürzung für "Secure Copy", eine Anwendung, um direkt Dateien zwischen Server und User zu übertragen. SFTP ist die Abkürzung für "Secure File Transfer Program", einem interaktiven Dateitransferprogramm ähnlich FTP, mit dem der User vor dem eigentlichen Transfer Verzeichnisse und deren Inhalt auf dem Server einsehen und Kommandos auf dem Server ausführen kann.

    Gerade in Zeiten, wo den Vertretern von Rechteinhabern, Strafverfolgungsbehörden und Geheimdiensten immer umfangreichere Überwachungsmöglichkeiten zugesprochen werden und sich der Kreis von Personen vergrößert, die mit den nötigen "Hackerskills" ausgestattet, ebenfalls Überwachungs- und Abfangaktionen durchführen, sollte sich parallel die Zahl der Serverbetreiber erhöhen, die SCP und SFTP statt FTP anbieten und die Zahl der User, die diese Angebote nutzen können.


    Quelle: http://hp.kairaven.de/scpsftp/scp-sftp.html


    Weitere Informationen:

    Wer mithilfe von WinSCP automatisierte Übertragungen realisieren möchte der muss sich > hier < durchfuchsen ;)

    Mögliche Parameter / Argumente die die oben aufgeführten Befehle haben können - wie immer - über die manual Pages eingesehen werden, zum Beispiel über den Befehl: man sftp


    1. Methode über FTP

    Hier gibt es verschiedene Möglichkeiten wie man es umsetzen möchte.

    • Eine Möglichkeit wäre die FTP Zugangsdaten direkt in das Script einzufügen.
    • Eine andere Möglichkeit wäre die Zugangsdaten in die Datei .netrc zu hinterlegen die im Benutzerverzeichnis liegt und vom FTP-Client automatisch ausgelesen wird sofern die Datei existiert.

    Bei beiden Möglichkeiten muss man beachten das die Zugangsdaten unverschlüsselt gespeichert werden. Ihr solltet also unbedingt darauf achten das zum einen nur Ihr den Account über den das Script läuft nutzt und zum anderen das ihr unterschiedliche Passwörter habt, also nicht für root das selbe pwd verwendet.

    Voraussetzung hierfür ist auch ein installierter FTP-Client:

    Code
    apt-get install ftp


    Bei den nachfolgenden Scripts gibt es den eingangs bereits erwähnten Unterschied auf welchem Rechner ihr das Script ausführt:
    - Wenn ihr das Script auf dem selben Rechner wie die zu übertragende Datei ausführt lautet der ftp Befehl put
    - Wenn ihr das Script aber auf dem Ziel-Rechner ausführt muss der ftp-Befehl get lauten!

    Eine Neuerung in aktuellen Clients besteht aber auch darin mehrere Dateien auf einmal mithilfe des Commandos mput zu übertragen (multi put). Umgekehrt geht auch mget.
    put --> upload
    get --> download


    Zur 1.Möglichkeit:

    Solch ein Script könnte zum Beispiel wie folgt aussehen:

    Spoiler anzeigen

    Erklärung zu den Befehlen unter # Dateien per FTP auf den Server schieben:

    Die erste Zeile schaltet den interaktiven Modus von FTP aus ( -i ) und unterbindet die automatische FTP-Anmeldung beim Verbindungsaufbau ( -n ), ansonsten würde er zunächst nach einer .netrc Datei suchen und wenn dort kein passender Host-Eintrag vorhanden wär, würde er nach den Zugangsdaten Fragen..

    Um ftp mit Befehlen zu füttern kommt anschließend ein so genanntes Here-Dokument zum Einsatz. Alle Kommandos zwischen der Startmarke <<END_UPLOAD und der gleichnamigen Schlussmarke END_UPLOAD übergibt die Shell dem FTP-Client als Eingabe. Statt END_UPLOAD kann aber auch ein beliebiger Namen für die Marke verwendet werden.

    Zunächst baut die Befehlsfolge eine Verbindung zum Host $FTP_SERVER auf. Anschließend legt das Skript für die Übertragung mit bin den Binäry-Modus fest. Das ist wichtig für die jeweilige Datei richtig zu wählen, Textdateien sollten zum Beispiel im ASCII-Modus übertragen werden.
    Das Script wechselt dann auf der Gegenseite nach $REMOTEDIR. Dann findet die eigentliche Übertragung der Datei $FILE2TRANSFER statt. Der Befehl quit beendet den FTP-Client anschließend.


    Zur 2.Möglichkeit:

    Hierbei ist wichtig das sich die Datei .netrc in dem Userverzeichnis (HOME) befindet über wen auch das Script ausgeführt wird. In das jeweilige HOME-Verzeichnis gelangt ihr wenn ihr in der Konsole entweder nur cd eingebt, oder über die Linux typische Tilde ( ~ :( cd ~
    Wichtig ist auch das die Dateirechte der Datei passen sodass nur der jeweilige Benutzer die Datei lesen und beschreiben darf (chmod 600).

    Die Datei kann mehrere Einträge für Remote-Sites enthalten.
    Sobald man eine .netrc besitzt und einen FTP-Befehl für eine dort aufgeführte Maschine eingebt, 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; die einzelnen Informationen können wahlweise durch Leerzeichen, Tabulatoren oder Zeilenumbrüche getrennt sein. Recht übersichtlich fällt aber die Variante unter Verwendung von Zeilenumbrüchen aus:

    Code
    machine RemoteHost
            login LoginName
            password Passwort
            password PasswortFuerKonto


    Für jeden RemoteHost enthält die Datei einen Eintrag. Als 'password' wird das für den Aufbau der Verbindung erforderliche Passwort angegeben. Ein 'PasswortFuerKonto' wird nur dann gebraucht, wenn der Remote-Host eine zusätzliche Authentifizierung verlangt – in der Regel genügen aber die ersten drei Einträge: machine, login, password

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

    Code
    machine ftp.emea.ibm.com  login anonymous  password my@email.de
    machine raspberrypi       login dxtans     password lOopy
    machine 192.168.0.200     login dxtans     password mas123

    Um eine Verbindung zum Host raspberrypi aufzubauen brauch man nun nur ftp raspberrypi einzugeben. Der FTP-Client sucht dann in .netrc nach dem Hostnamen raspberrypi. Anschließend setzt er die Login- und Passworteinträge für den Verbindungsaufbau am Remote-Server automatisch ein.

    Ein entsprechendes Script könnte dann wie folgt aussehen:

    Spoiler anzeigen


    Beide Möglichkeiten kann man auch verwenden, um eine Liste der zu übertragenden Dateien anzugeben. Allerdings muss man dann für jeden Transfer eine Verbindung auf- und wieder abbauen. Eine for-Schleife innerhalb des Here-Codeblocks kann man nicht verwenden, weil man an dieser Stelle mit der FTP-Verbindung zum Remote-Host arbeitet aber nicht mit der Bash-Shell.
    Wie das funktioniert zeigt das folgende sehr einfach gehaltene Script:

    Spoiler anzeigen


    Mit dem Befehl lcd wechselt er das Lokale Verzeichnis, also dort wo das Script ausgeführt wird. (local change directory)


    Es besteht auch die Möglichkeit eine Fehlerbehandlung für die Scripts aus der 1. und 2. Möglichkeit zu verwenden. Ohne jetzt aber noch mal beide Scripts zu posten führe ich das nur anhand eines simplen Beispiels auf:

    Spoiler anzeigen

    Das kann auch gerne etwas ausführlicher ausfallen indem man zu den Fehlercodes auch die jeweilige Meldung mit aufnimmt:


    Dem Programmierer-Spieltrieb sind auch hier keine Grenzen gesetzt :D


    2. Methode über SFTP

    Bei diese Methode kann man nicht wie bei FTP über .netrc o.ä. verwenden, das funktioniert leider nicht.

    Hier gibt es allerdings einen großen Vorteil gegenüber dem normalen FTP und zwar das man wie für SSH "public key authentication" verwenden kann und die Übertragung auch komprimiert werden kann. Ersteres steigert die Sicherheit enorm da nirgends ein Password im Klartext gespeichert werden muss oder beim Anmelden die Zugangsdaten im Klartext übertragen werden. Auch die eigentliche Übertragung der Dateien ist verschlüsselt da es über das SSH Protokoll abgewickelt wird.

    Eine Besonderheit bei dieser Methode ist auch das kein bash Script benutzt werden kann, da es kein Parameter zur Übergabe eines Passworts gibt!
    Stattdessen muss ein sog. expect Script verwendet werden, was auf bestimmte Aktionen interagieren kann.

    Voraussetzung hierfür ist ein installierter SFTP-Client:

    Code
    apt-get install ssh

    (sftp ist Bestandteil des ssh clients)

    Eine weitere Voraussetzung ist die Scriptsprache expect:

    Code
    apt-get install expect

    (Automates interactive applications)

    Die Syntax eines expect Scripts ist anders als bei bash!
    Deshalb muss man für jede Datei die man übertragen will einen seperaten expect Abschnitt ins Script aufnehmen.

    Ein solches expect Script könnte wie folgt aussehen:

    Spoiler anzeigen

    Man kann das Script aber auch so gestalten das die benötigten Informationen für den Transfer, an das Script übergeben werden was > hier < beschrieben wird.

    Es ist aber auch möglich ein bash Script zu nutzen innerhalb dessen man expect aufruft:

    Spoiler anzeigen


    3. Methode über SCP

    Ähnlich wie bei SFTP muss auch hier ein expect Script verwendet werden.

    Ein solches expect Script könnte wie folgt aussehen:

    Spoiler anzeigen
  • Automatisierte Dateiübertragung (ftp / sftp / scp ..usw..)? Schau mal ob du hier fündig wirst!

  • Sehr schönes Tut zum Thema Datenxfer per (s)ftp und scp. :thumbs1:
    Ich benutze dazu auch gerne das praktische rsync. Würde sich gut als 4te Method im Tut machen ;) Vielleicht hast Du ja Lust das auch noch irgendwann aufzunehmen.

  • Bitte merkt euch, individuelle Probleme nicht in den AnleitungsThreads zu stellen - erstellt euch dafür einen eigenen Thread

    ..würde das ständig jeder machen, würden die AnleitungsThreads aus allen Nähten platzen und mit eher belanglosem zugetextet und extrem unübersichtlich werden..

    Weitere Tips sind was anderes als Problembehandlungen..


    Irgendwann werde ich diesen Hinweis mal in alle meine Anleitungen einfügen.. Aber leider wird selbst das oftmals stumpf ignoriert - Das nervt!

  • Dass der Pfad wohin die Datei kopiert werden soll oder die Datei selbst anscheint nicht existiert.


    Für individuelle Probleme bitte einen eigenen Thread erstellen. Wenn jeder sein Anliegen in die Anleitungs-Threads mit rein schmeißt werden diese sehr schnell sehr unübersichtlich
    In dem Thread dann bitte genauer beschreiben was/wi/wo und ggf das von dir angepasste Script dazu posten

  • Heutzutage sollte man FTP ausschließen, besonders bei der Übertragung von Dateien im Internet.
    Denn dort wird, wie übrigens auch beim Telnet, alles unverschlüsselt übertragen.

    Sollte man ein System haben, dass nur FTP kann (IP-Cam, ...), sollte man in seinem Netz ein System aufstellen, dass diese FTP-Übertragung annimmt und die Daten dann von diesem System mittels eines sicheren Verfahrens ins Internet übertragen.

    Was auch bedeutet, dass man, wenn man Daten auf einer Webseite bereitstellt, den Zugang dorthin nur über eine sichere Verbindung vornehmen sollte.

    Anbieter von Webspace, die kein SSH anbieten (SSH wird ja auch bei sftp, scp und rsync verwendet) sollte man meiden.
    Es gibt keinen Grund, solche Angebote noch zu verwenden.

    (rsync nutzt normalerweise Port 873, kann aber auch 22, also ssh, nutzen)

    Was man auf keinen Fall mehr im Internet nutzen sollte, ist die Dateiübertragung per "rsh" und die Authentifizierung per .netrc

    Computer ..... grrrrrr

  • Zur Theorie ist alles bestens erklärt worden.
    Um die Praxis zu vereinfachen habe ich ein SCP Kopier Utility geschrieben.
    Hier die Erklärung:

    Sendet per SCP Dateien an ausgesuchte Empfänger
    Aufruf myscp <Dateiname > < Empängernummer >
    z. B. myscp muster.txt 3
    Wildcards wie *.txt in Anführungszeichen '*.txt'
    Die Empfänger sind in derDatei myscp.txt aufgeführt.
    Der erste Eintrag ist die Anzahl der Empfänger in der Datei
    myscp n öffnet den nano Editor.
    Die Datei myscp.txt muss im Verzeichnis /usr/bin liegen

    Die Software kann hier abgeholt werden:

    https://github.com/villamarinella/MYSCP

    VM
    Asche über mein Haupt das ich hier das Danke an Andreas vergessen habe.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!