SCP Befehl funktioniert nicht im Python Script

  • Hallo Forum

    Ich habe mir eine Tunnelverbindung nach Anleitung aufgebaut in der ich einen RemotePI und ein GatewayPI einsetze.
    Die Schaltung ist aufgebaut und beinhaltet eine Funk Schaltung, ein LCD Display und eine Relaiskarte mit 4 Relais.
    Mein Ziel ist es erstmal die Temparatur des RemotePI zu überwachen und falls diese über 40 Grad kommt einen Lüfter der am RemotePI angebaut ist für 60 Sekunden einzuschalten. Im gesammten Verlauf schreibt mein Pythonscript auch die Werte der CPU-Temparatur in eine Datei. Diese Datei möchte ich dann immer wenn die 40 Grad überschritten wurden zum Gateway PI kopieren.
    Leider klappt das kopieren nur im Terminal wenn ich den Befehl direkt eingebe. Verwende ich den Befehl im Pythonscript bekomme ich eine Fehlermeldung.
    So sieht mein Befehl aus:
    scp werte.txt user@dynDNS:/home/pi

    Das erfolgreiche kopieren direkt vom Terminal:
    scp werte.txt user@dynDNS:/home/pi

    werte.txt 100% 105 0.1KB/s 00:00

    Möchte ich den Befehl in mein Python Programm ausführen bekomme ich die Fehlermeldung:

    File "temp.py", line 15
    scp werte.txt user@dynDNS:/home/pi
    ^
    SyntaxError: invalid syntax

    Kommentiere ich die Zeile aus läuft das Programm ohne Ausfälle und schreibt mir auch die ganzen Werte in die Datei.
    Ein Probelauf hatte zwei Tage durchgelaufen bis ich es selber unterbrach und stoppte.
    Das mit den 40 Grad ist nur zum Testen da ich Anfänger bin der leider nicht nur Theorie möchte, sondern zwischendurch auch was in den Fingern braucht zum basteln.

    Gruß Herbert

  • Hallo Herbert,

    Deinen berichteten Fehler deute ich so, dass Du versucht hast, ein im Konsolen-Fenster / Terminal funktionsfähiges Linux-Kommando ohne jegliche Anpassung direkt als Zeile in einen Editor einzugeben, der für die Programmierung in einer Programmiersprache verwendet werden soll.

    Was Du als einzelne Linux-Kommandos eingeben kannst und aneinandergehängt ein BASH-Skript ergeben, sieht in Programmiersprachen ganz anders aus.

    Hier musst Du einen Befehl nutzen, der Dir Systemkommandos direkt aufruft. Z.B. [font="Courier New"]system("Linux-Kommando -optionen /Pfade/zu/sonst/wohin")[/font] oder wie es in Python besserer Programmierstil ist über [font="Courier New"]os.system("dito")[/font]


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (17. Februar 2016 um 12:32)

  • Hallo und schon einmal Danke.

    Denkt aber bitte daran das ich ein Anfänger bin.
    Wie oben bereits erwähnt kommt nach dem Starten des Script der Fehler:

    File "temp.py", line 15
    scp werte.txt user@dynDNS:/home/pi
    ^
    SyntaxError: invalid syntax

    Setze ich ein "#" davor läuft das Script bis ich es selber unterbreche.
    Natürlich werden jetzt einige eine Schutzbrille brauchen wenn sie nur den Code sehen und mir wahrscheinlich erklären wo was falsch ist und das es falsch ist so zu schreiben aber zu meiner Verteidigung und als Ausrede: BIN ANFÄNGER und wollte schnell ein Erfolg sehen.

    Als ich den Code hier einfügte war leider alles verschoben, deshalb habe ich versucht so dazustellen wie er bei mir steht.

    Danke und Gruß
    Herbert

  • Hallo Forum

    Ich habe jetzt versucht mit Andreas Hinweis weiter zu kommen.

    Nun habe ich die Zeile:
    scp werte.txt user@dynDNS:/home/pi

    geändert in:
    os.system('scp werte.txt user@meineDynDNS:/home/pi')

    Leider verlangt er jetzt ein Passwort bevor er die Datei kopiert.
    Habe ich das Passwort eingegeben führt er das Script weiter aus.

    Gruß Herbert

  • Hallo Herbert,


    Setze ich ein "#" davor läuft das Script bis ich es selber unterbreche.


    Damit wird die Zeile als Kommentar gesetzt und gar nicht mehr verwendet - kann also auch keinen Fehler mehr hervorrufen. Ein beliebter Programmierer-Trick ;) .

    Natürlich werden jetzt einige eine Schutzbrille brauchen wenn sie nur den Code sehen und mir wahrscheinlich erklären wo was falsch ist und das es falsch ist so zu schreiben aber zu meiner Verteidigung und als Ausrede: BIN ANFÄNGER und wollte schnell ein Erfolg sehen.


    Nö, wieso? Auf den ersten Blick erkenne ich eine vorbildliche Einrückung, was ein ANFÄNGER selten so gut hinbekommt!



    Nun habe ich die Zeile:
    scp werte.txt user@dynDNS:/home/pi

    geändert in:
    os.system('scp werte.txt user@meineDynDNS:/home/pi')

    Leider verlangt er jetzt ein Passwort bevor er die Datei kopiert.
    Habe ich das Passwort eingegeben führt er das Script weiter aus.

    Dann bist Du schon mal einen mächtigen Schritt weiter. Jetzt weißt Du, wie Du beliebige Systemkommandos in Programmiersprachen (hier wohl Python) ausführen kannst.

    Dass ein Passwort verlangt wird, würde ich mal als Sicherheitskennzeichen des Betriebssystems deuten. Stell Dir mal vor, irgendjemand kommt von draußen auf Deinen Raspberry Pi und könnte einfach so Dateien von Dir kopieren - ohne sich ausweisen zu müssen, dass er dazu überhaupt berechtigt ist.

    Es ist zwar möglich, die Passwort-Abfrage zu umgehen. Ich persönlich würde das nicht machen und schweige.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (17. Februar 2016 um 20:26)

  • Hallo Andreas

    Das mit dem "#" benutze ich als Anfänger oft da ich gerne zwischen den Code Vermerke was ich dort mache.
    Ich meinte mit dem "Setze ich ein #...." auch das ich bevor ich den Befehle lösche diese "erst einmal" auskommentiere um zu sehen ob es nur an dieser Änderung lag.

    Was mich jetzt aber wundert ist das wenn ich den Befehl vom Terminal aus eingebe ich KEIN PASSWORT brauche.
    Ich kann von meinem RemotePI mit dem Befehl "scp werte.txt user@dynDNS:/home/pi" direkt die Datei werte.txt zum GatewayPI kopieren ohne das ein Passwort verlangt wird.
    Führe ich das Python Script aus wird es aber verlangt.
    Mein Sript hat aber in diesem Fall den Fehler das es ja genau an dieser Stelle ein schweren Hardschaden verursacht und zwar den das ich mich ja gerade an der Abfrage befinde wie hoch ist die Temparartur, ja über 40 Grad, jetzt kopiere die Datei, dann schalte Lüfter an. Nur ich sehe ja nicht wann er diesen Punkt erreicht hat den er wartet jetzt auf mein Passwort.
    Ich sitze hier und Probiere gerade alles aus und während ich hier geschrieben habe ist die Temparatur auf 44 Grad gestiegen. Meine Ziel war es ja ab 40 Grad zu kühlen. Zudem ist mir gerade etwas aufgefallen. Bekomme ich den Punkt mit das die 40 Grad erreicht wurden mit bekomme ich die Meldung nach Eingabe des Passwortes:

    user@myDynDNS password:
    werte.txt 100% 1878 1.8KB/s 00:00

    habe ich diese etwas länger nicht bemerkt und gebe dann das Passwort ein:

    Connection closed by YYY.ZZZ.YYY.XXX
    lost connection

    Somit wird auch kein Datei übertragen????

    Nochmal: Alles mit Schadden und Überhitzung sind ja hier nur meine Versuche und Spiele mit dem PI und keine wirklichen Tatsachen.
    Ich habe natürlich schon gelesen das der PI erst ab so 80 Grad Probleme bekommen könnte ich hier aber schon bei 40 Grad den Ernstfall spiele.
    Soll ja Spass machen und wäre ja ein Hammer wenn ich hier auf 90 Grad warten würde.

    Gruß Herbert

  • Hallo Forum

    Leider komme ich mit meinem Versuch die Daten vom RemotePI zum GatewayPI zu übertragen nicht weiter.
    Es ist jetzt so das ich ja den Kopierbefehl nicht einfach so Zustande bekomme, da dieser meine Messwertaufzeichnung darin unterbricht erst einmal das Passwort zu verlangen.
    Gibt es evtl. eine Lösung darin das ich das Programm um die Werte zu ermitteln laufen lasse, aber zusätzlich ein Script erstelle welches ausgeführt wird um die Daten zu kopieren.
    Ich möchte keine Lösung sondern gerne ein Denkanstoss.

    Gruß Herbert

  • Hallo dreamshader

    Werde gleich mal suchen was ich unter "multithreading" zu verstehen habe.

    Wie Andreas schrieb bringt es ein Sicherheitrisiko was mich nachdenklich macht und mich auf eine andere Tatsache aufmerksam macht.
    Ich werde im meinem Script darauf hingewiesen das Passwort einzugeben sonst passiert nichts und das Programm "hängt" bis ich das Passwort eingebe. In dieser Zeit schaukelt sich der CPU Wert hoch den der Lüfter bleibt aus. Ich könnte den Befehl des Lüfters jetzt davor setzen somit wäre eine Überhitzung vermieden aber jetzt bleibt der Lüfter an bis das Passwort übermittelt wird.
    Nur kopiere ich die Datei vom Terminal aus wird KEIN Passwort abgefragt. Warum ist es jetzt dem GatewayPI egal was übermittelt wird.
    Wo ist denn jetzt auf dieser Ebene die Sicherheit?

    Gruß Herbert

  • Tjaaa ...


    ... sonst passiert nichts und das Programm "hängt" bis ich das Passwort eingebe. ...


    deswegen ja -> multithreading <- ...


    ... wird KEIN Passwort abgefragt. Warum ist es jetzt dem GatewayPI egal was übermittelt wird.
    ...


    das hängt mit der Authentifizierungs-Methode, die für ssh resp. scp konfiguriert ist.
    Aber da hab' ich schon eine Menge wieder vergessen ... da haben wir hier jüngere, aufstrebende Benutzer die auf dem besten Weg sind, echte RPi-Cracks zu werden. Ich müsste das jetzt erst wieder nachlesen, aber die haben das bestimmt auf Abruf im Hinterkopf ;)

    cu,
    -ds-

  • Damit du die Datei ohne Passwortabfrage übertragen kannst, musst du den öffentlichen SSH-Schlüssel des Benutzers, mit dessem Benutzerkennung dieser Befehl auf dem Rechner, der den Befehl ausführt, in das entsprechende Verzeichnis auf dem Zielsystem kopieren.
    Also an die entsprechende Datei anhängen.

    Wie schon gesagt, ist das ein Sicherheitsrisiko, wenn auf dem Zielsystem dieser Benutzer zu viel kann, da dann jemand, der das Quellsystem übernommen hat, auf dem Zielsystem einiges 'kaputt' machen kann.

    Wenn du das wirklich machen willst, richte auf dem Zielsystem einen extra Benutzer ein, der nichts, außer diese Datei annehmen, darf und richtige ein, dass dieser Benutzer keinerlei Shell hat.
    Denn wenn 'scp' zu diesem Benutzer funktioniert, funktioniert 'ssh' auch.
    Außer, man verhindert das durch eine entsprechende Konfiguration.

    (
    Wenn du diesen extra Benutzer hast, kannst du von einem anderen Benutzer die abgelegte Datei abholen lassen.
    Aus Sicherheitsgründen muss alles, was aus dieser Datei weiterverarbeitet wird, durch Filter laufen, die das ausnutzen von Schadhaften Code ausschließen.
    So sollten z.B. die übermittelten Zeichen klar definiert sein, und alle anderen Zeichen, ohne Ausnahme gelöscht werden.
    Dieses Löschen muss so passieren, dass auch Escape-Sequenzen sicher gefiltert werden.
    Das muss auf dem Zielsystem gemacht werden.
    )

    Computer ..... grrrrrr

    Einmal editiert, zuletzt von Rasp-Berlin (19. Februar 2016 um 18:30)


  • Dass ein Passwort verlangt wird, würde ich mal als Sicherheitskennzeichen des Betriebssystems deuten.

    Es ist zwar möglich, die Passwort-Abfrage zu umgehen. Ich persönlich würde das nicht machen und schweige.


    Damit du die Datei ohne Passwortabfrage übertragen kannst, musst du den öffentlichen SSH-Schlüssel des Benutzers, mit dessem Benutzerkennung dieser Befehl auf dem Rechner, der den Befehl ausführt, in das entsprechende Verzeichnis auf dem Zielsystem kopieren.
    Also an die entsprechende Datei anhängen.

    Wie schon gesagt, ist das ein Sicherheitsrisiko, wenn auf dem Zielsystem dieser Benutzer zu viel kann, da dann jemand, der das Quellsystem übernommen hat, auf dem Zielsystem einiges 'kaputt' machen kann.


    What? :-/


    Das ihr immer aus allem sone Hexerei machen müsst - schlimm!


    => SSH sicher am Imternet <=

    Wer die Key-Datei nicht hat kann auch nicht zugreifen.

  • Hallo Forum

    Eine Frage habe ich für heute noch auf dem Herzen.
    Worin besteht der Sicherheitsunterschied beim kopieren in Python und dem direkt im Terminal?

    Gebe ich im Terminal folgendes ein:
    scp ./Programme/werte.txt user@GatewayPI:/home/pi/werte.txt

    bekomme ich die Meldung:

    Warning: Permanently added the ECDSA host key for IP address 'aaa.bbb.ccc.ddd' to the list of known hosts.

    und danach wird die Datei "werte.txt" kopiert.
    Kein Passwort oder erneutes drücken einer Taste, also ohne Rückmeldung des Benutzers, die Datei wird kopiert.
    Also der GatewayPI läßt es zu eine Datei zu bekommen?

    Kopiere ich die selbe Datei im Python Script mit:
    os.system('scp ./Programme/werte.txt user@GatewayPI:/home/pi/werte.txt')

    bekomme ich diese Meldung:
    Warning: Permanently added the ECDSA host key for IP address 'aaa.bbb.ccc.ddd' to the list of known hosts.
    user@Gateway's password:

    und jetzt wird gewartet bis die Passworteinabe erscheint und das Python Script wartet bis ich was mache.
    Wo ist denn der Unterschied da Beide Befehl doch dem Gateway ein Datei "unterschieben wollen(gewollt)???

    Gruß aus Dorsten und einen schönes Wochenende
    Herbert

  • Sieh dir mal den Benutzer an. Da beim Kopieren mit Hilfe von Python nochmals die Frage mit dem Speichern der Key des 'known_host' kommt, ist das ein anderer Benutzer als der, mit dem du das per Hand gemacht hast.
    Eventuell 'root'?
    (Wurde das Script mittels 'sudo' gestartet?

    Computer ..... grrrrrr

  • Hallo Forum


    Rasp-Berlin:
    Ich hoffe mit den Angaben können die Experten unter euch etwas sehen.

    Die Dateien werte.txt und wertdaten.txt auf dem RemotePI gehören "root".
    Das Programm temp.py gehört "user"
    Der Befehl im Python Script ist:

    os.system('scp werte.txt user@meineDynDNS:/home/pi/Werte/werte.txt')

    Hier muss ich beim erreichen dieser Zeile das Passwort eingeben dann gehts weiter bis die CPU die eingestellte Zeit gekühlt hat.
    Lüfter schaltet sich aus CPU wird warm bis diese ihre eingestellte MAX Temparatur hat.
    Dann erscheint die Aufforderung der Passworteingabe.

    Die kopierten Dateien auf dem GatewayPI gehören nun nicht mehr "root" sondern "user"
    Mit dem Befehl:

    scp werte.txt user@meineDynDNS:/home/pi/Werte/werte.txt

    kann ich die Datei kopieren ohne eine Passwortabfrage eingeben zu müssen.

    starten des Python Script ohne "sudo":

    Code
    python ./Programme/temp.py
    Traceback (most recent call last):
     File "./Programme/temp.py", line 10, in <module>
       GPIO.setup(27, GPIO.OUT)
    RuntimeError: No access to /dev/mem.  Try running as root!

    starten des Python Script mit "sudo" normal.

    Ja da hilft es nicht nur Bücher zu lesen und darauf los basteln, da muss ich wohl noch viel mit den Benutzerrechten usw lernen und verstehen. :s
    Allein in meinem /home/pi Verzeichnis ist ein unübersichtliches durcheinander an Benutzer zwischen PI und ROOT.
    Oft gehe ich wohl hin und schreibe sofort eine Datei als "sudo nano ....."
    Werde wohl alles von Grund an Neu aufsetzen und parallel mein Programm weiter "entwickeln und lernen". SD/Micro Karten sind ja da.

    Macht aber trotzdem noch Spass es muss ja weitergehen. :thumbs1:

    Gruß aus Dorsten und einen schönen Sonntag an alle.
    Herbert


  • Hallo Herbert,

    diesen Thread habe ich jetzt nicht mehr so sehr verfolgt wie am Anfang.

    Allgemein ist es ungünstig, im Verzeichnis [font="Courier New"]/home/pi[/font] einen Rechte-Mix zwischen User [font="Courier New"]pi[/font] und anderen Usern wie [font="Courier New"]root[/font] etc. zu pflegen.

    Dies solltest Du als Erstes ändern und Deine Probleme werden sich schlagartig auflösen.

    Ein Neuausfsetzen des Systems ist - zumindest aus meiner Sicht noch - nicht erforderlich.

    Den Rechte-Mix kannst Du beseitigen durch:

    Code
    chown -hR /home/pi

    Sollten die Rechte dafür fehlen, dann setze ein sudo davor...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (28. Februar 2016 um 10:04)

Jetzt mitmachen!

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