Hallo, ich habe folgendes Szenario: - RaspberryPi als Heimautomatisierungszentrale (kann WLAN- und Zigbee Sensoren/Aktoren ansteuern) - PC (mit Linux) mit mehreren Bildschirmen, Lautsprecher, etc. Alle am PC angeschlossenen Geräte hängen an einer Steckerleiste hinter einer Zigbee-Steckdose Ich wäre nun gern in der Lage den PC+Peripherie vom Pi aus abzuschalten. Grundsätzlich könnte der Pi über die Zigbee-Steckdose einfach alles hart abschalten. Es ist aber offensichtlich dass dies nicht gewünscht ist weil der PC erst sauber heruntergefahren werden muss. Im Prinzip muss also der Pi dem PC einen Shutdown-Befehl erteilen und nur wenn dieser erfolgreich war (kann z.B. mittels einem ping herausgefunden werden) darf die Steckerleiste weggeschalten werden. Die naheliegende Lösung ist natürlich: Pi schaltet sich über ssh auf den PC und führt ein "shutdown now" aus. Allerdings missfällt mir irgendwie die Vorstellung, dass sich mein Pi, der ja eigentlich eine Art Server ist, per ssh auf den PC schaltet. Das wär also so die Notlösung. Normal ist es ja eher andersrum. Gibt es da einen anderen, vielleicht eleganteren Weg? Am schönsten wär ein Service auf dem PC der auf ein bestimmtes Signal pollt. Der Service könnte den SHutdown-Request auch erstmal dem User melden und absegnen lassen, für den theoretischen Fall dass ich garnicht herunterfahren möchte :-) Aber sowas gibts wohl nicht von der Stange, oder? Wie könnte man so ein "Signal" senden? Eine Art "kill -USR" übers Netzwerk? Gibts sowas? Hat sonst jemand eine Idee oder Anmerkungen? Danke und euch noch schöne Ostertage :-)
Ssh - sudo - shutdown Wo ist das Problem? Sudo kann viel mehr als nur zu sagen "user x darf alles..."
Eigentlich ist die ssh Idee schon das übliche Verfahren. Du kannst per ssh anstelle von shutdown natürlich auch ein eigenes Script am PC aufrufen. Diesen könnte den Nutzer warnen/fragen.
https://de.wikipedia.org/wiki/Remote_Procedure_Call ist so ungefaehr das, was du beschreibst. Fuer dein Problem geeignet ist es eher nicht. Fuer das Modell Pi-ssht-auf-Rechner solltest du dir die command=-Operation in der authorized_keys ansehen, damit kann man genaue Befehle vorgeben, die exklusiv ausgefuehrt werden, wenn sich jemand (der Pi) mit einem bestimmten SSH-Key authentifiziert. Damit hast du schon mal dein trust model richtig herum, sodass der Pi nicht beliebige Befehle auf deinem Rechner fahren kann. Der einfachste Weg fuer die Gegenrichtung, Rechner-pollt-Pi, waere z.B. eine spezialisierte Loginshell oder ein weiterer forced command. Auf deim Rechner wuerde dann ein Skript in der Art von
1 | #!/bin/sh -eu
|
2 | |
3 | ssh -i shutdown-key raspberry-host | while read cmd; do |
4 | case "$cmd" in |
5 | shutdown) |
6 | zenity --question --title 'shutdown?' --text 'shutdown requested, continue?' && sudo poweroff |
7 | ;;
|
8 | *) |
9 | echo "invalid command '$cmd'" |
10 | ;;
|
11 | esac
|
12 | done
|
laufen, was den Pi pollt kontaktiert und eine Nachfrage stellt, sobald es als Antwort "shutdown" erhaelt. Der Pi haette dann z.B. folgendes gesetzt: authorized_keys:
1 | command="/home/pi/shutdown-poller" ssh-rsa ... |
shutdown-poller: [code] #!/bin/sh -eu f=/home/pi/shutdown-now while sleep 5; do if [ -e "$f" ]; then rm -f "$f" echo shutdown fi done [code] Triggern tust du den Shutdown, indem du /home/pi/shutdown-now anlegst, z.B. ueber touch. (Und natuerlich kann man anstatt der Schleife auch inotify verwenden...) Das ist alles ungetestet dahingetippert und bedarf potenziell Verstaendnis und Nacharbeit.
Wie wäre es mit einem Optokoppler parallel zum Power-Button? Dann kann der PC nicht nur per ACPI aus sondern auch einfach über den Raspi wieder ein geschaltet werden.
Ein alternativer Hack wäre das Nachbilden des Netzwerkverhaltens einer netzwerkfähigen USV zusammen z.B. mit https://networkupstools.org/
Hi danke für die Ideen. Fürs erste hab ich ein Script auf dem PC laufen was auf SIGINT horcht, bei Bedarf runterfährt und sich ansonsten wieder 10sec schlafen legt. Das Signal kann ich per ssh erstmal an den PC schicken. Das gefällt mir irgendwie besser als wenn der Pi direkt den PC runterfahren kann (was er aber aktuell eh ned darf, da keine interaktive Konsole). Im nächsten Schritt schau ich mal ob ich das ssh durch was anderes ersetzen kann, sockets oder so.
Josef Br. schrieb: > Im nächsten Schritt schau ich mal ob ich das ssh durch was anderes > ersetzen kann, sockets oder so. Solange ein RaspberryPI das Signal auslöst, spielt Sicherheit keine Rolle. Jeder halbwegs begabte SD-Karten-Wechsler kann beliebige Dinge mit dem Dateisystem darauf anstellen. Ob du nun SSH oder irgendetwas anderes damit machst, andere Rechner abzuschalten, spielt so ziemlich gar keine Rolle. Du könntest sogar einen CRON-Job auf der auzuschaltenden Maschine einrichten, der den RaspberryPI kontaktiert (bspw. per curl, wget oder irgendeinem anderen Netzwerkkommunikationsmittel) und beim richtigen/ falschen Ergebnis das Herunterfahren auslöst. Dann ließe sich das auch auf andere Maschinen ausweiten und wäre portierbar. Ich halte das für ziemlichen Quatsch, da ein kurzer Druck auf den Power-Button genügt, den Shutdown auszulösen (vorausgesetzt acpid läuft und darf das). Deshalb bin ich für die Optokoppler-Fraktion. (Mir ist auch nicht so ganz klar, was im Fall des Stromausfalls passiert, bzw. ob dich das interessiert. Sowohl das Netzteil vom PI als auch vom anderen Rechner können kaputtgehen, mancherorts sei sogar die Stromversorgung zusammengebrochen – erzählen sich die Alten. Das spricht eher nach etwas Netzwerkverwaltung und geordnetem Herunterfahren in Zusammenarbeit mit einer USV, wenigstens für den RPI? Und fährt die andere Maschine dann irgendwie wieder von selbst hoch, auch mit defektem Dateisystem?)
Ich betreibe einen Linux-Rechner mit xfce Oberfläche. Ein AVR sendet per serieller Schnittstelle allmögliche Signale zur Mediasteuerung. Und per xfce-session-logout -h fährt der Rechner sauber runter. Einfach nur die STOP-Taste der Fernbedienung 5 Sekunden drücken.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.