Mehrere PIs über ein Display steuern

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich habe mehrer PIs im Einsatz...

    PI 1: Hausautomation mit 4x20 Display und Tastern, 24/7
    PI 2: Ambilight
    PI 3: XBMC
    PI 4: Wetterstation
    PI 5: Zum testen und rumspielen :)

    Diese fünf PIs würde ich gerne über das Display von PI 1 steuern oder mir Daten der anderen PIs ausgeben lassen. Hier mal ein paar Beispiele die mit spontan eingefallen sind

    1. Beispiele:
    Das Runterfahren vom PI 1 über das angeschlossene Display funktioniert ja einwandfrei (shutdown -h now), aber wie kann ich diesen Shutdown-Befehl an die anderen PIs senden?

    2. Beispiel:
    Am PI 4 (Wetterstation) ist ein DHT 11/22 angeschlossen... Kann der PI 1 die Temperaturdaten am PI 4 abfragen und auf dem Display ausgeben?

    3. Beispiel
    Auf den Display von PI 1 sollen die IP Adressen der fünf PIs angezeigt werden.
    Die IP des PI 1 ist kein Problem, nur wie frage ich die anderen an.

    Leider finde ich keine Tutorial oä. oder suche einfach nach den falschen Begriffen.

    Könnte ihr mir vielleicht helfen.

    Vielen Dank schon mal und viele Grüße

    Markus

    • Offizieller Beitrag

    zu 1,2 und 3) zum beispiel so:

    Code
    dbvs-MacBook-Air:~ dbv$ ssh root@192.168.5.60 "ifconfig"
    root@192.168.5.60's password: 
    eth0      Link encap:Ethernet  Hardware Adresse b8:27:eb:96:bb:d0  
              inet Adresse:192.168.5.60  Bcast:192.168.5.255  Maske:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
              RX packets:6407312 errors:0 dropped:0 overruns:0 frame:0
              TX packets:1291540 errors:0 dropped:0 overruns:0 carrier:0
              Kollisionen:0 Sendewarteschlangenlänge:1000 
              RX bytes:761343353 (726.0 MiB)  TX bytes:164789587 (157.1 MiB)

    Das ganze noch mit ssh keys versehen, damit man keine pw eingeben muss und gut ;)

    google: ssh remote command ;)

  • Hi dbv,

    äh ... wenn er die IP weiss, braucht er sie nicht remote abzufragen ;) ...

    cu,
    -ds-

  • Zu 1) und 2):
    Du kannst - wie dbv schon zeigte - über ssh Befehle an die anderen PI's schicken. Darüber kannst du dann eben auch einen anderen PI neu starten lassen, oder die Ausgabe eines Scripts dir anzeigen lassen.

    Zu 3):
    Du machst das so dass du einen PI als Master deklarierst, zum beispiel PI-1, darauf dann ein kleines PHP Script für den Webserver erstellst und die ganzen anderen PI's rufen dann nach dem booten diese PHP Seite auf woraufhin der Master-PI deren IP dann speichert..

    Oder du vergibst über den DHCP Server deines Routers, anhand der MAC, jeden PI eine feste IP

  • Hallo Zusammen,

    vielen vielen Dank für die schnell und vor allem gute Hilfe !!
    Die Geschichte... ssh name@IP "befehl" habe ich gesucht.

    Jetzt muss ich mich erstmal ein bisschen in das SSH Keys Thema einlesen, aber wenn man weiß wo nach man suchen muss findet man sowas mit Sicherheit

    Mal schauen ob ich feste IPs vergebe, aber über ein PHP Script Funktioniert ja auch recht einfach, da auf den PI 1 eh einen Webserver läuft.

    Mal schauen was man damit noch alles machen kann, im Prinzip ja alles :)

    Vielen Dank und viele Grüße
    Markus

  • Hallo zusammen,

    ich versuche gerade mit Hilfe des PIs mit Display einen anderen Pi runterzufahren.

    Die ssh-keys habe ich eingefügt.

    mit dem Befehl "ssh pi@192.168.178.26" kann ich mich ohne Passwort auf den zweiten Pi einloggen.

    Wenn über das Display der Befehl ssh pi@192.168.178.26 "sudo shutdown -h now" ausgeführt werden soll kommt trotz Keys eine Passwortabfrage...

    Weiß jemand warum?

    Wenn ich den gleichen Behle direkt über Putty ausführe wird der zwei Pi anstandslos runtergefahren, ohne Passwortabfrage.

    Vielen Dank und viele Grüße

    Markus

    EDIT: Hier der Code des Display

    Code
    def ambilight_off():
            commands.getoutput('ssh pi@192.168.178.26 "sudo shutdown -h now"')
            sleep(60)
            commands.getoutput('echo "0" > /sys/class/gpio/gpio27/value')

    Einmal editiert, zuletzt von Markus1979 (5. August 2014 um 19:26)

  • OK, ich habe gerade noch versucht einen DHT22 Sensor abzufragen.
    direkt über Putty einwandfrei, über das Display bekomme ich ebenfalls die Passwortabfrage.

    Vielleicht hat jemand eine idee woran das liegen könnte, bzw wie man es beheben kann?

    Vielen Dank und viele Grüße
    Markus

  • Hi dvb,

    hmm, mehr Code gibt es eigentlich nicht :)

    ich nutze die Adafruit Bibliothek und ein 20x4 Display mit Buttons anzusteuern.
    Dazu diesen Code um die Navigation auf dem Display abzubilden.

    https://github.com/aufder/RaspberryPiLcdMenu

    Über commands.getoutput kann ich befehle ausführen.

    Den Pi auf dem die Navigation läuft kann ich so einwandfrei runterfahren

    Code
    commands.getoutput('sudo shutdown -h now')

    Wenn ich diese Befehl ausführe kann ich alle PIs runterfahren oder zB auch
    die DHT11/22 Sensoren auslesen... und es wir kein Passwort abgefragt.

    Code
    ssh pi@192.168.178.26 "sudo shutdown -h now"

    Ich hab keine Ahnung, wärum das über die Navigation/Display nicht funktioniert,
    bzw immer die Passwortabfrage erscheint.

    Die SSH-Keys funktionieren ja einwandfrei... ich kann nicht ja auf alle PIs verbinden...

    Leider bin ich nicht nicht so in der Materie drin... Muss man evtl noch etwas importieren?

    im Moment läd die pythondatei den Display folgendes...

    Vielleicht fehlt da ja noch irgendwas... keine Ahnung...

    Ich hoffe ihr könnt mir helfen, daran könnte das gesamte projekt scheitern
    und es war viel viel arbeit :(

    Vielen Dank schon mal

    Markus

    Edit:
    Sollte "subprocess" dann so aussehen?
    Wenn ja, dann funktioniert es auch nicht, kommt weiterhin die Passwortaufforderung

    Code
    def ambilight_off():
            shutdown = subprocess.call('ssh pi@192.168.178.26 "shutdown -h now"', shell=True)
            commands.getoutput(shutdown)
            sleep(60)
            commands.getoutput('echo "0" > /sys/class/gpio/gpio27/value')

    Einmal editiert, zuletzt von Markus1979 (6. August 2014 um 00:31)

  • Hallo zusammen,
    Markus:
    ich bin mir überhaupt nicht sicher und es könnte sein, dass ich Mist schreibe, aber ich meine mich erinnern zu können, dass es in einem anderen Thread auch um SSH-Probleme mit Befehlen ging (frag' mich bitte nicht welcher es war). Lange Rede, kurzer Sinn: hast du vielleicht in deiner SSH-Abfrage einen DOPPELPUNKT vergessen (ich glaube, der müßte vielleicht hinter der IP stehen ?).

    Viel Glück !

    so long
    Perlchamp

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Hallo Perlchamp,

    ich hab das mit dem Doppelpunkt mal probiert, bringt aber nix...
    soweit ich im Internet gelesen habe ist die schreibweise in Ordnung.

    Ich versteh es einfach nicht... der befehl funktioniert direkt in der Konsole
    einwandfrei !! Im Internet finde ich leider auch nichts, weiß auch nicht so
    genau wonach ich suchen soll =(

  • Hi..

    Zitat

    Wenn über das Display der Befehl ssh pi@192.168.178.26 "sudo shutdown -h now" ausgeführt werden soll kommt trotz Keys eine Passwortabfrage...

    Weiß jemand warum?

    ja, wahrscheinlich benötigt der Befehl "shutdown" root-Rechte, welche der user 'pi' auf dem host 192.168.178.26 nicht hat.

    Die Keys sorgen nur dafür das du dich ohne PW einloggen kannst.
    Der "lokale"-Benutzer (in diesem Beispiel:'pi') braucht aber auch noch ein Passwort um 'shudown' auszuführen. (Oder irre ich mich da? Ich fahr meinen PI NIE herunter ;))
    Naja.. abhilfe kann hier die Datei /etc/sudoers schaffen, aber bitte nur mit visudo öffnen ;)

    • Offizieller Beitrag

    Das funzt bei mir...wollte nur nicht den pi runterfahren ;)

  • Hallo zusammen,

    BooStar: Ja, Sudo muss sein, aber in der Konsole funktioniert der Befehl
    ssh pi@192.168.178.26 "sudo shutdown -h now"
    ja einwandfrei und es erscheint keine Passwortabfrage !!
    Der Pi 192.168.178.26 wird anstandslos runtergefahren !

    Der Befhl funktioniert nur nicht wen er aus dem Python-Script des Display
    ausgeführt werden soll... dann kommt die Passwortaufforderung.


    dbv: Du hast dich auch einfach nur auf 192.168.5.60 über die Konsole eingeloggt, oder?
    Das funktioniert bei mir ja auch... nur nicht aus der Python Datei des Displays

  • Wie übergibst du denn den ssh Key? ssh agent? Mit oder ohne Passphrase?
    Ich vermute du musst den Key mit laden ssh -i oder -f privatersshey pi@derandererechner -n "sudo shutdown"
    man-page sagt dir ob -i oder -f richtig ist. Desweiteren würde ich den publickey bei root auf dem remote pi packen, erspart einem das sudo. Aber da birgt auch gewisse Risiken.

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.

    • Offizieller Beitrag


    dbv: Du hast dich auch einfach nur auf 192.168.5.60 über die Konsole eingeloggt, oder?
    Das funktioniert bei mir ja auch... nur nicht aus der Python Datei des Displays

    aber das ist doch python :denker: ?

    ich hab das ganze jetzt mal in eine Datei gepackt und auch da funktioniert es wie erwartet.

    Code
    root@nagios-master:~# python test.py 
    eth0      Link encap:Ethernet  Hardware Adresse b8:27:eb:96:bb:d0  
              inet Adresse:192.168.5.60  Bcast:192.168.5.255  Maske:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
              RX packets:43712 errors:0 dropped:0 overruns:0 frame:0
              TX packets:18391 errors:0 dropped:0 overruns:0 carrier:0
              Kollisionen:0 Sendewarteschlangenlänge:1000 
              RX bytes:16979361 (16.1 MiB)  TX bytes:2037372 (1.9 MiB)

    Inhalt der datei:

    Python
    #!/usr/bin/python
    import subprocess
    p = subprocess.Popen(['ssh', 'root@192.168.5.60', "ifconfig"], stdout=subprocess.PIPE)
    o, e = p.communicate()
    print o

Jetzt mitmachen!

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