Dateien automatisch per SFTP auf Host-Server laden

  • Hallo zusammen,


    ich bin neu hier im Forum und auch ein Anfänger im Umgang mit einem Raspberry. :|

    Letzte Woche habe ich mir einen Raspberry Pi 3 B (OS Raspbian) zugelegt um Daten der PV-Anlage vom Wechselrichter (SMA) zu lesen.

    Dazu habe ich SBFspot runtergeladen und nach Anleitung installiert (bis auf den Teil, wo die Daten zu PVOutput.org hochgeladen werden).

    Die Daten werden korrekt vom Wechselrichter runtergeladen und auf dem Pi abgelegt.

    Nun möchte ich die csv-Dateien automatisiert auf den Server meines Hosters (1&1) hochladen.

    Dieses geht nur mit dem SFTP-Protokoll.


    Auf der HP von Bernhard Weichel (weichel21.de) ist eine Anleitung wie er die Daten per FTP hochlädt.

    Ich habe versucht den Cronjob anzupassen, jedoch nur mit einem Teilerfolg.

    Die Verbindung mit dem SFTP-Server wird hergestellt, jedoch muss ich das Passwort manuell eingeben.

    Genau das möchte ich aber nicht.

    Desweiteren sind im Anschluss die Befehle um die Dateien hochzuladen und zum Schluß die Verbindung zu beenden.

    Dieses sind allerdings glaube ich FTP-Befehle und keine SFTP-Befehle. (teilweise Unterscheidung?)


    Hier die Cronjob-Datei:


    #!/bin/bash

    /usr/local/bin/sbfspot.3/SBFspot -v


    DATADIR=/tmp/smadata

    DAYS=2

    MONTH=1


    # SBFspot-Verzeichnis

    SBFSPOT=/usr/local/bin/sbfspot.3/SBFspot

    SBFSPOTCFG=/usr/local/bin/sbfspot.3/SBFspot.cfg


    # SFTP-Verzeichnis

    FTPSERVER=MeinServer

    FTPUSER=MeinUser

    FTPPASSWORD=MeinPasswort

    FTPDIR=MeinVerzeichnis


    # clean DATADIR ******wird von mir nicht benötigt

    rm -rf $DATADIR

    mkdir -p $DATADIR


    # Daten von SMA-WR holen

    $SBFSPOT -cfg$SBFSPOTCFG -ad$DAYS -am$MONTH -nosql -finq


    # Upload to Server

    pushd $DATADIR

    rm -rf *-SPOT-*.csv


    # -i dont confirm

    # -n disable autologin

    # sftp -i $FTPSERVER << End-Of-Session

    sftp $FTPUSER@$FTPSERVER:/$FTPDIR

    pass $FTPPASSWORD

    cd $FTPDIR

    ascii

    put "*.csv"

    bye


    # In der ursprünglichen Datei stand hinter dem FTP-Befehl noch ein "<< End-Of-Session" ???

    End-Of-Session


    popd



    Ich habe schon einige Foren durchsucht, konnte aber nichts passendes finden.

    Ich hoffe ihr könnt mir weiterhelfen und habt ein wenig Nachsicht für einen Anfänger.


    Gruß

    Ralf

  • Leider bin ich in dieser Art der Programmierung nicht besonders firm.

    Meine Programmierkenntnisse beschränken sich auf die SPS-Welt.

    Von daher wäre ich froh über jede praktische Hilfe.

    :danke_ATDE:

  • Hallo WeiRa,


    willkommen im Forum!


    Nicht ganz leicht da was Passendes zu finden. Ob es eine gute Idee ist ein Passwort in Klartext in eine Datei zu schreiben steht auf einem anderen Blatt... :-/

    (Quelle: https://travelingfrontiers.wor…and-a-bash-script-wrapper)


    Musst Du natürlich anpassen und achtung von mir ungetestet da ich im Moment keine Möglichkeit dazu habe!

  • Weil es mich interessierte habe ich eben mal genauer nachgesehen wie es mit lftp funktioniert ohne das PWD in der Datei zu haben:

    Code
    lftp sftp://<USER>@<HOST> -e "cd $FTPDIR;ascii;put \"*.csv\";bye"

    und dann in der ~/.netrc

    Code
    machine <HOST>
    login <USER>
    password <PASSWORD>

    Et voilà :bravo2: das war's

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert? Kein Backup - kein Mitleid :no_sad: . Nimm einfach raspiBackup ;)

  • SFTP?

    wirklich?


    Oder geht auch SSH, und damit SCP?


    Beim zugriff per SSH, und damit auch SCP, kann man auf dem Zielsystem das öffentlichen Schlüssel des Benutzers hinterlegen, der die Daten kopiert.

    Eigentlich sollt das auch beim SFTP möglich sein.


    (Der Schlüssel kommt in die Datei ~/.ssh/authorized_keys, auf die nur gelesen werden sollte (600). Die Datei muss dem lokalen Benutzer gehören)


    Beim SCP wird die Datei ganz einfach kopiert.

    (Quelle: /home/pi/SBFspot/MyPlant.csv

    Ziel: ~/domaene/SBFspot/solardaten.csv, Name des des Domänen-Users: user@.example.com)


    Code
    scp /home/pi/SBFspot/MyPlant.csv user@.example.com:domaene/SBFspot/solardaten.csv

    Selber denken,
    wie kann man nur?

  • SFTP?

    wirklich?


    Oder geht auch SSH, und damit SCP?

    Nein. Beim Standard 1und1 Account geht nur ftp oder sftp. Oder webdav.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert? Kein Backup - kein Mitleid :no_sad: . Nimm einfach raspiBackup ;)

  • Hallo,


    vielen Dank für die schnellen Antworten. :thumbup::)

    Hab es jetzt erstmal per Script von hyle hinbekommen. :danke_ATDE:

    Wenn ich das richtig verstehe ist lftp ein Programm, dass ich installieren muss, (sudo apt-get install lftp) richtig?

    Die Login-Daten werden in einer /.netrc gespeichert.

    Wo liegt diese Datei oder wird sie erst bei Installation von lftp erzeugt?

  • Die Datei erstellst Du in das Homeverzeichnis Deines angemeldeten Users (z.B. pi) am einfachsten geht das mit nano ~/.netrc aber ohne sudo!

    Nach dem Eintragen der Anmeldedaten und speichern, solltest Du dann noch die Rechte ändern, sodass nur pi darauf lesend zugreifen kann. z.B. mit chmod 600 .netrc.


    //Vergessen: Im Falle des Users pi wie im Beispiel, wäre der Pfad: /home/pi/.netrc ;)

  • OK....werd´s ausprobieren :danke_ATDE:


    Jetzt hätte ich da noch eine Frage....

    Die Daten vom Wechselrichter werden täglich in einer neuen Datei mit Datumsstempel abgespeichert (z.B. SMA_20171122.csv).

    Zusätzlich wird noch eine Monatsdatei angelegt, in der die täglichen Gesamterträge stehen (z.B. SMA_201711.csv).

    So wie es jetzt ist, werden ja alle csv-Dateien upgeloaded.

    Wie stelle ich es an, wenn ich z.B. nur die Dateien der letzten 2 Tage + die Monatsdatei uploaden möchte?

    Oder die Dateien der letzten x Tage + die Monatsdatei?

  • Weil es mich interessierte habe ich eben mal genauer nachgesehen wie es mit lftp funktioniert ohne das PWD in der Datei zu haben:

    Code
    lftp sftp://<USER>@<HOST> -e "cd $FTPDIR;ascii;put \"*.csv\";bye"

    und dann in der ~/.netrc

    Code
    machine <HOST>
    login <USER>
    password <PASSWORD>

    Et voilà :bravo2: das war's

    Hallo,

    Ich habe es auch so gemacht doch leider wird das Passwort immer noch verlangt, ausser das ich das ganze über ein Script Aufrufe. Was mache ich falsch? Die netrc liegt im home Ordner aber das Script liegt an einen anderen Ort.


    Nachtrag:

    Wenn ich den lftp sftp://..... aausserhalb des Scriptes ausführe funktioniert das ganze.

    Nur wenn ich das Script laufen lasse verlangt er wieder das Passwort.


    Würde mich über eure Hilfe freuen.


    Gruß

    Mister

    Edited 2 times, last by mister ().

  • Wie sieht denn Dein Script genau aus? ich denke da gibt es irgendein Problem.


    Ich habe mal testweise bei mir folgendes Script erstellt:


    Bash
    #!/bin/bash
    lftp sftp://UID@HOST -e "pwd;ls;bye"


    mit entsprechendem Eintrag in der .netrc und alles funktioniert wenn ich das Script welches in einem Unterverzeichnis liegt aufrufe :conf:

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert? Kein Backup - kein Mitleid :no_sad: . Nimm einfach raspiBackup ;)

  • *altenBeitragausgrabe*
    Hallo Zusammen, ich hänge mich mal mit demselben Problem hier an (SOLARLOG 500 kann nur FTP, Strato will aber SFTP, kann aber weiterhin FTP)


    mir hat die Recherche hier schon gut geholfen...

    FTP Solarlog 500 auf die Fritzbox als Zwischenmedium funktioniert

    Das Verzeichnis ist über die fstab eingebunden und "sudo mount -a" greift. Hier habe ich dise Anleitung genommen: https://strobelstefan.org/?p=5405

    Eintrag fstab. Wichtig war hier das "ntlmv2" mit "vers=1.0", wie unter dem Link beschrieben, geht es nicht mehr

    Code
    //192.168.XXX.XXX/FRITZ.NAS/solarlog /home/pi/nas cifs credentials=/etc/samba/auth,sec=ntlmv2

    Gut... also.. Schritt 1 ist geschafft.


    Nun versuche ich mit lftp die Daten rüber zu schieben. Hierzu habe ich mir den Beitrag 14 diesen Threads angesehen. Aber.. leider funktioniert es nicht. ich werde weiterhin nach dem Passwort gefragt. die .netrc wird ignoriert. Ich habe zwar noch andere Theorien gelesen.. aber mir war es erst mal egal...


    folgender Befehl funktioniert erst mal aus einer Script-Datei (/home/pi/script). Die Datei wurde mit "chmod +x script" gangbar gemacht


    Code
    lftp -e "ls;bye" sftp://<USERNAME>:<PASSWORT>@ssh.strato.de


    Nun dachte ich mir.. entwickle ich weiter:


    Code
    lftp -e "ascii;put nas/*.* ;bye" sftp://<USERNAME>:<PASSWORT>@ssh.strato.de

    Jetzt habe ich Ärger:


    Unbekannter Befehl »ascii«.

    put: /home/pi/nas/*.*: Datei oder Verzeichnis nicht gefunden


    Ich hatte mir das "cd ..." und die Hochkomma mit Backslash gespart .. ich habe den Pfad voll angegeben mit /home/pi/nas/*.* . Das Ganze funktioniert nicht. Ich finde aber auch keine anderen Internetseite, woran der Transfer scheitert .. ok.. mit dem "ascii" ... ärgerlich.. aber erst mal zu verschmerzen. Warum scheitere ich? Ich vermute, der Befehl sucht auf dem Zielrechner nach "/home/pi/nas"?


    Danke für weitere Ideen


    wenn das geht, möchte ich aus dem Script einen Cronjob machen.. aber das sollte dann wieder klappen *hoff*

  • Das wird immer witziger... das mit dem "cd ..." bezieht sich auf remote scheint sich zu bestätigen... ich habe es jetzt mal per Kommandozeile versucht


    Code
    lftp USER@ssh.strato.de:~> put *.* -o *.*
    put: /home/pi/nas/*.*: Datei oder Verzeichnis nicht gefunden
    lftp USER@ssh.strato.de:~> put days.js
    51 Bytes übertragen in 1 Sekunde (49 B/s)
    lftp USER@ssh.strato.de:/> put \"*.js\"
    put: /home/pi/nas/"*.js": Datei oder Verzeichnis nicht gefunden
    lftp USER@ssh.strato.de:/>

    edit:


    LÖSUNG: man verwende mput * statt put


    bleiben das nicht funktionierende Auslesen der Userdaten aus .netrc und der Cronjob.

    Edited once, last by widdi ().

  • Jetzt geht es zumindest mal, wie erhofft. Zwar noch nicht glatt.. aber immerhin.


    Problem gestern/heute:

    lsftp hat mich nicht mehr authentifizieren können... das habe ich mit einem "ls" bei händischem Verbinden nach ca 4h Fehlersuche festgestellt. Was da geschehen ist.. keine Ahnung.


    Daher musste ich unter /home/pi/.ssh/ die "known_hosts" entfernen und dann nach Tipp von hier https://www.wizlab.it/code/lft…-verification-failed.html wieder verbinden... wobei bei strato da bei mir am Ende von "ssh -p 22 ...." ein "authentification failure" kommt.. egal.. es geht.


    Meine Skriptdatei habe ich nochmal als User angelegt (die gehörte zum Schluss "root" und liess sich nur mit "chmod 777" ausführen. Jetzt passt wieder alles

    Bash
    #!/bin/sh
    
    cd /home/pi/nas
    lftp  sftp://<USER>:<PASSWORT>@ssh.strato.de -e  "mput *.* -c;bye"

    Hinweis: der <USER> hat bei Strato ein bestimmtes "Startverzeichnis" für die Domain mitbekommen. Daher muss ich mich hier nicht um Verzeichnisse kümmern.


    Der Trick mit der ~/.netrc .... dazu hab ich jetzt keine Nerven mehr - so geht es.. nachdem ich schon dachte, Strato hätte einen Blocker für mich gemacht, was der Herr vom Support verneinte ;-)


    Also blieb noch der Cronjob, der mir die Dateien hochladen soll

    vermutlich durch das einbinden von "mount -a" in der /etc/rc.local ging das Verzeichnis "nas" im Eigentum über....

    Code
    drwxr-xr-x  2 root root      0 Nov 23 21:24 nas

    jedenfalls darf "pi" nicht mehr darin schreiben.. egal....


    mit "sudo /etc/crontab" bzw. "sudo crontab -e" konnte ich zwar meinen Eintrag machen... und durch das eingeschaltete Logging landet der Aufruf auch in der /var/log/syslog

    Code
    Nov 23 19:29:01 raspberrypi CRON[20948]: (root) CMD (   bash /home/pi/solarlog_job.sh &>> /home/pi/cronlog.log)

    aber geschehen... ist nichts.. auch die "cronlog.log" ist leer .. zudem lernte ich später, dass ich das "bash" mir als Aufruf sparen kann.... aber auch ohne "bash" ging es in dieser crontab-Datei nicht.


    Nachdem ich aber mal ohne "sudo" gearbeitet habe: "crontab -e" und das somit im Userbereich gemacht habe.. arbeitet das Script


    Code
    # m h  dom mon dow   command
    1,24,49 7-21 * * *  /home/pi/solarlog_job.sh > /home/pi/cronlog.log 2>&1

    Ergebnis im syslog

    Code
    Nov 23 21:49:01 raspberrypi CRON[23342]: (pi) CMD (/home/pi/solarlog_job.sh > /home/pi/cronlog.log 2>&1)

    Die Dateien aus /home/pi/nas werden jetzt per lftp übertragen. Was auch in dieser Syntax nicht funktioniert: das cronlog.log ist immernoch leer. Aber auch diese Datei habe ich als user "pi" neu angelegt. Die Datei gehörte zum Schluss ja auch "root".


    Vllt. stolpert nochmal jemand über diesen alten Thread und braucht etwas Hilfe :-) Immerhin läuft es jetzt - wenn auch ohne ~/.netrc und Ausgabe in meine "cronlog.log"

  • Mene Frage aus dem Jahre 2017 bleibt:

    Warum FTP, egal ob verschlüsselt oder nicht?


    Die System im Internet, die verschlüsseltes FTP anbieten, bieten auch SSH und SCP.

    Und deshalb nimmt man in einem solchen Fall SCP mit auf dem System hinterlegten öffentlichen SSH-Zertifikat.


    Denn dann kann man ganz einfach mittels

    Code
    scp /quell/verzeichznis/Datei Zielname@Zielserver:/Ziel/Verzeichnis/Datei

    ohne die Eingabe eines Passworts die Datei( en ) kopiert werden.

    Selber denken,
    wie kann man nur?