Problem mit wget im eigenen LAN

  • Hallo,

    ich möchte mit Hilfe eines Python-Scriptseinzelne txt-Dateien von einem RasPi im LAN auf einen anderen RasPi runterladen.
    Dazu habe ich mir folgenden Befehl zusammengebaut:

    Python
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    #
    import re, os, time
    
    
    os.system("wget -P /home/pi/auswertung/ --user=doc  -t 3 -r -A temp -np -nd -v -N http://raspi1/werte/")

    Die runter zu ladenden Dateien von Raspi1 liegen in /home/doc/werte sowie in 3 Unterverzeichnissen davon. Diese Verzeichnisstruktur möchte ich beibehalten und in den Ordner auswertungen schreiben. Klappt aber nicht.
    Ich habe es auch schon mit der IP das RasPis versucht.
    Muss der RasPi1 irgendwelche Voraussetzungen erfüllen, damit man von ihm Daten holen kann?
    Der Standardnutzer heißt nicht pi, sondern doc. Könnte es daran liegen?

    Die Meldung lautet:

    Code
    --2016-12-28 00:20:18--  http://192.168.178.99/werte/
    Verbindungsaufbau zu 192.168.178.99:80... verbunden.
    HTTP-Anforderung gesendet, warte auf Antwort... 404 Not Found
    2016-12-28 00:20:18 FEHLER 404: Not Found.

    Viele Grüße

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,


  • Muss der RasPi1 irgendwelche Voraussetzungen erfüllen, damit man von ihm Daten holen kann?
    ...

    Die Meldung lautet:

    Code
    --2016-12-28 00:20:18--  http://192.168.178.99/werte/
    Verbindungsaufbau zu 192.168.178.99:80... verbunden.
    HTTP-Anforderung gesendet, warte auf Antwort... 404 Not Found
    2016-12-28 00:20:18 FEHLER 404: Not Found.

    Kannst Du manuell (d. h. ohne das Script) mit wget eine einzelne Datei, von deinem RasPi1 downloaden?

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Mal unabhängig davon, ob jetzt http der Weg der Wahl ist (warum sollte das schlecht sein? Ich verstehe die "Einwände" von fred0815 und Manul nicht so ganz... - es gibt viele Gründe, Daten über http-Requests auszutauschen - man siehe die Verbreitung des REST-Interfaces... aber das führt jetzt zu weit...)

    docadams:
    Dein Webserver (apache oder was anderes) hat ein sog. Dokumenten-"home"-Verzeichnis, welches beim Apache meist unter /var/www/doc liegt.
    Wenn du nun Daten mit dem request "http://<ip>/werte abrufen willst, dann muss die Datei "werte" im Verzeichnis "/var/www/doc liegen.

    Wenn diese Datei dort nicht liegt, reicht ggf. auch ein symbolischer Link (Rechte entsprechend setzten, damit der Apache die ausliefern kann)

    BTW: Du kannst diesen wget-Zauber über das OS etwas eleganter z.B. über das Python-eigenen http - request Modul machen...

  • Hallo,

    alternativ kannst du statt Apache und Co auch einen "ad hoc" Webserver mit Python aufsetzen, z.B. so mit Python 3:

    Code
    ~$: python3 -m http.server 8082


    Der Server läuft auf `localhost` auf Port 8082 und es sind _alle_ (!) Dateien (inkl. denen in Unterverzeichnissen!) erreichbar, die im Verzeichnis liegen, wo der Server gestartet wurde. Für's interne Netzwerk ist das ok, für Zugriffen von außen ein (Sicherheits-) Risiko.

    Und wie Zentris schon geschrieben hat: `os.system(wget ...)` ist nicht nötig. Das geht mit Bordmitteln (Stichwort: urllib) oder eleganter mit dem `request` Modul oder HTTPie.

    Gruß, noisefloor

  • Hallo,
    wenn ich den reinen wget-Befehl in die Konsole tippe, kommt die gleiche Antwort.
    Ich interpretiere sie so, dass er sich erfolgreich im Quell-RasPi anmeldet und dort aber nichts vorfindet, was kopiert werden soll. Ist das richtig? Oder sehe ich das falsch?

    Auf der Quelle läuft Lighttpd, das sollte mit nginx vergleichbar sein, oder? Ich stelle damit eine Webseite ins LAN, die Grafiken mit Temperaturverläufen darstellt.
    Könnte es sein, dass ich bei Lighttpd noch etwas frei geben muss? Oder müssen noch die Daten noch in den /var/www/-Ordner kopiert werden?

    Ich versuche gerade, scp zu begreifen. (komme nicht vom Fach)

    Code
    scp -r doc@raspi1:werte/ doc@raspi2:Auswertung
    doc@raspi1's password:
    ssh: connect to host raspi2 port 22: Connection refused
    lost connection

    In RasPi1 /home/werte liegen die zu kopierenden Daten und die sollen auf den RasPi2 in den Ordner Auswertung. Der Befehl wird auf RasPi2 ausgeführt. Was mir nicht gefällt ist, dass das Passwort eingegeben und später vermutlich im Script im Klartext hinterlegt werden muss, oder?
    Aber erst mal werde ich ausgesperrt, obwohl Port und eingetipptes Passwort stimmen....

    EDIT1: Ich habe eine Weile für die Antwort gebraucht und merke gerade, dass weitere Antworten dazugekommen bin.

    EDIT2: und ich merke, dass ich auf das Zielsystem, also auf dem der Befehl ausgeführt wurde, der Port zu ist. Das verstehe ich nicht ...

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

    Einmal editiert, zuletzt von docadams (28. Dezember 2016 um 13:02)


  • Könnte es sein, dass ich bei Lighttpd noch etwas frei geben muss? Oder müssen noch die Daten noch in den /var/www/-Ordner kopiert werden?

    In RasPi1 /home/werte liegen die zu kopierenden Daten und die sollen auf den RasPi2 in den Ordner Auswertung. Der Befehl wird auf RasPi2 ausgeführt. Was mir nicht gefällt ist, dass das Passwort eingegeben und später vermutlich im Script im Klartext hinterlegt werden muss, oder?
    Aber erst mal werde ich ausgesperrt, obwohl Port und eingetipptes Passwort stimmen....

    Hm, was genau hast du an meinem Beitrag #5 nicht verstanden? (keine Fangfrage!)

    scp kann man machen, ist aber wegen der von dir angesprochenen Passwort-Problematik nicht immer optimal... (man kann da natürlich einen speziellen, nur für diesen Zweck dienenden User anlegen, aber das ist lästig...)

  • Zentris: Prinzipiell spricht nichts gegen HTTP als Protokoll, zumal wenn auf dem Quellsystem bereits ein HTTP-daemon läuft. Wenn man den erst einrichten muß, erscheint mir persönlich das aber als relativ umständlicher Weg - vermutlich auch deswegen, weil ich alle meine Pis headless betreibe und daher SSH ohnehin auf allen aktiviert habe.

    docadams: Daß scp nicht funktioniert, liegt daran, daß der SSH-daemon auf dem Quell-RasPi nicht aktiviert ist. Wenn Du diesen Weg ausprobieren willst, kannst Du das über raspi-config ändern. Ein Übertragen des Passworts ist nicht notwendig, das Schlüsselwort hierfür heißt "key based authentification". Deren Gültigkeit kann man auch auf bestimmte Befehle beschränken. Wenn Du bei HTTP bleiben willst, musst Du die Daten in der Tat nach /var/www/html kopieren/verschieben, wie Zentris richtig schreibt.


  • Zentris: Prinzipiell spricht nichts gegen HTTP als Protokoll, zumal wenn auf dem Quellsystem bereits ein HTTP-daemon läuft. Wenn man den erst einrichten muß, erscheint mir persönlich das aber als relativ umständlicher Weg - vermutlich auch deswegen, weil ich alle meine Pis headless betreibe und daher SSH ohnehin auf allen aktiviert habe.

    Ich betreibe ebenfalls _alle_ meine RPs headless (eben als "echte" Server) und finde das http-REST Konzept inzwischen als relativ genial:
    Einfach einzurichten, keine Portprobleme, recht einfach abzusichern, schnell, skalierbar und sehr flexibel.

    Der Datenaustausch zwischen meinen RPs, den ESP8266-Sensoren und Cloud-Storage basiert bei mir aktuell komplett auf http-REST, ebenso der Datenaustausch zwischen den ESPs selbst (Datenabgleiche...).

    Aber jeder, wie er mag :)

  • @Zentis
    Als ich geantwortet hatte, kannte ich deinen Beitrag noch nicht. Ich hatte das mit meinem EDIT1 angedeutet.

    Alle RasPis werden headless betrieben, SSH funktioniert also.

    Vielleicht muss ich mal kurz ausholen (bitte nicht schlagen).
    Ich habe 2 RasPis im LAN laufen, die teilweise unterschiedliche Dinge machen, teilweise aber auch Gleiche Dinge, nur an unterschiedlichen Orten. Nähmlich Temperaturen messen. Nun habe ich mir einen Dritten eingerichtet, mit dem ich etwas experimentieren mochte, ohne die laufenden Konstellationen durch unbedachte Dinge zu gefährten. Um aber mit möglichst aktuellen Daten zu arbeiten, möchte ich gern die Dateien alle Stunde von den beiden RasPis auf den dritten holen. Das ist der Hintergrund. Das mich zur Verzweiflung Bringende ist, dass es von dem einen RasPi geht, und von dem anderen eben nicht.

    Und jetzt kommt meine Vergesslichkeit ins Spiel. Als ich vor 3 Jahren damit angefangen hatte, hatte ich auf dem ersten RasPi tatsächlich mal einen Softlink in /var/www/ auf die Dateien in /home/pi/werte gelegt. Allerdings ohne ihn wirklich zu benutzen (lange her). Hier funktioniert der wget-Befehl, wie ich ihn in #1 dargestellt habe.

    Den zweiten RasPi hatte ich viel später eingerichtet. Allerdings ohne den Softlink und vor allem mit einem anderen Benutzernamen. Hier funktioniert wget nicht, warum auch immer. In /var/www/ liegt die index.lighttpd.html, die müsste ja zumindest rüber geholt werden. Dann habe ich einen Softlink erstellt

    Code
    doc@raspi2 /var/www $ sudo ln -s /home/doc/werte/


    Geht immer noch nicht.

    Ich habe keinen Plan, worin sich die beiden RasPis noch unterscheiden, dass es bei einem klappt, und bei dem anderen nicht

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,


  • Alle RasPis werden headless betrieben, SSH funktioniert also.

    Ups, da habe ich oben nicht richtig hingeschaut. Die Fehlermeldung sieht allerdings so aus, als würde ssh auf raspi2 nicht laufen. Versuch mal (auf raspi2):

    Code
    scp -r doc@raspi1:werte/ /pfad/zu/Auswertung


    Den zweiten RasPi hatte ich viel später eingerichtet. Allerdings ohne den Softlink und vor allem mit einem anderen Benutzernamen. Hier funktioniert wget nicht, warum auch immer. In /var/www/ liegt die index.lighttpd.html, die müsste ja zumindest rüber geholt werden. Dann habe ich einen Softlink erstellt

    Code
    doc@raspi2 /var/www $ sudo ln -s /home/doc/werte/


    Geht immer noch nicht.

    Das ist jetzt halb geraten: Soweit ich weiß, hat sich das default-Verzeichnis für Webserver in Raspbian irgendwann von /var/www zu /var/www/html geändert. Schau doch mal in die lighttpd-Konfiguration auf raspi1 und raspi2, ob das vielleicht das Problem ist - oder wie sich die Konfigurationen sonst unterscheiden.

  • Jippiii,
    erst mal ein kurzer Zwischenstand:
    Manuls Tipp

    Code
    scp -r doc@raspi1:werte/ /pfad/zu/Auswertung


    holt die Daten rüber. Geht doch...

    Das Prinzip funktioniert erst mal.
    Allerdings gefallen mir noch 2 Dinge nicht, er holt immer alle Dateien rüber, obwohl einige Dateien nicht verändert wurden, und vor allen, er will das Passwort haben. Da gab es oben schon mal einen Beitrag, das muss ich mir anschauen.

    Wollt mich nur mal melden ;)

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,


  • Dann habe ich einen Softlink erstellt

    Code
    doc@raspi2 /var/www $ sudo ln -s /home/doc/werte/


    Geht immer noch nicht.

    Ähm: Ist "werte" jetzt eine einzelne Datei oder ein Verzeichnis?

    Die Änderung im default home Verzeichnis von /var/www/doc nach /var/www/html hatte ich übersehen (da hat Manul recht), aber da ich verschiedene Linux-Versionen im Einsatz habe, muss ich da 'eh immer nachsehen :)

    Ich denke, der oben angeführte Weg mit dem rsync ist für deinen Anwendungsfall der geschmeidigste... da nur die Files umkopiert werden, welche neu oder modifiziert wurden.

    Wenn du das Ganze noch in einen cron-Job packst, der alle paar (Minuten/Stunden/Tage) aufgerufen wird, geht das vollkommen transparent im Hintergrund.

  • Ich sitz jetzt nicht vor den Rechnern, denke aber, ich weiß was du meinst.
    Der ordentliche Schlüssel kommt in den .ssh-Ordner der Quelle.
    Habe aber noch keine Beschreibung gefunden, wie ich den privaten Schlüssel in den Ziel-RasPi einbinden.

    Muss ich dann künftig auch mit diesem Schlüsselpaar via Kitty und WinSCP auf den Quell-RasPi zugreifen?
    Wie gesagt, das spielt sich alles im eigenen LAN ab.

    Viele Grüße DocAdams
    Automatisch zusammengefügt:
    Sorry, meinte den öffentlichen Schlüssel.
    (Mit Tapatalk kann ich im Forum nicht korrigieren)

    Viele Grüße DocAdams

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

    Einmal editiert, zuletzt von docadams (29. Dezember 2016 um 00:08)

  • Ich würde das so machen:

    - Auf dem Zielraspi einen privaten Schlüssel (ohne Passphrase) nur für diesen Zweck erzeugen:

    Code
    ssh-keygen -f ~/.ssh/id_werte -C "irgendein nützlicher Kommentar"

    - Den erzeugten öffentlichen Schlüssel auf dem Quellraspi in die authorized_keys eintragen.

    - Auf dem Zielraspi in ~/.ssh/config einen Eintrag dieser Art anlegen:

    Code
    Host werte
    Hostname raspi1
    IdentityFile ~/.ssh/id_werte
    User doc

    - Im rsync-Aufruf statt "doc@raspi:" "werte:" verwenden.

    Andere ssh-Verbindungen oder Schlüssel werden davon nicht berührt. Wenn Du die Verwendung des Schlüssels zusätzlich auf rsync beschränken willst, kannst Du nach dieser Anleitung noch ein "command=..." in den authorized_keys ergänzen.

    Einmal editiert, zuletzt von Manul (29. Dezember 2016 um 00:28)

Jetzt mitmachen!

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