Betriebssystem herunterfahren
Betriebssystem herunterfahren
Hallo,
ich bin dabei ein Programm zu schreiben, dass auf einem Rechner laufen soll, der lediglich über sechs Funktionstasten bedient wird. Das Programm wird entsprechend im Autostart geladen. Es einfach zu beenden ist ja nicht das Problem. Allerdings geben die Tasten es nicht her danach das Betriebssystem herunter zu fahren. Die Frage ist jetzt, ob das irgendwie aus dem Programm heraus gelöst werden kann. Sprich, dass ich nicht nur das Programm schliesse, sondern auch gleichzeitig das System herunterfahre.
Thx
Blackfyre
ich bin dabei ein Programm zu schreiben, dass auf einem Rechner laufen soll, der lediglich über sechs Funktionstasten bedient wird. Das Programm wird entsprechend im Autostart geladen. Es einfach zu beenden ist ja nicht das Problem. Allerdings geben die Tasten es nicht her danach das Betriebssystem herunter zu fahren. Die Frage ist jetzt, ob das irgendwie aus dem Programm heraus gelöst werden kann. Sprich, dass ich nicht nur das Programm schliesse, sondern auch gleichzeitig das System herunterfahre.
Thx
Blackfyre
-
RED Squirrel
- Beiträge: 50
- Registriert: 3. Februar 2007 22:21
-
CKassiopaia
- Beiträge: 38
- Registriert: 21. April 2009 16:42
Wie kann man das unter Linux/Debian machen?
Tuts leider nicht...Warum kann ich nicht sagen...
Als normaler User kann ich mit "/sbin/shutdown -P now" die Kiste ausschalten!
Code: Alles auswählen
QProcess *shutdown = new QProcess;
shutdown->start("/sbin/shutdown", QStringList() << "-P" << "now");
Als normaler User kann ich mit "/sbin/shutdown -P now" die Kiste ausschalten!
-
CKassiopaia
- Beiträge: 38
- Registriert: 21. April 2009 16:42
ups....hab da ein "-h" vergessen....so ein Mist....
Funktioniert 
Man muss abe zuvor shutdown für den User freischalten:
Code: Alles auswählen
QProcess *shutdown = new QProcess;
shutdown->start("/sbin/shutdown -P -h now");
Man muss abe zuvor shutdown für den User freischalten:
Code: Alles auswählen
chmod +s /sbin/shutdown
Wobei die ideale Lösung über sudo läuft!
aus meiner /etc/sudoers:
Dann reicht ein sudo halt für einen lokalen user um den Rechner runterzufahren.
aus meiner /etc/sudoers:
Code: Alles auswählen
%users local_machine=(ALL) NOPASSWD: /sbin/halt
%users local_machine=(ALL) NOPASSWD: /sbin/rebootwindows:
Statt dem üblen system aufruf wuerd ich lieber die winapi direkt bemuehen !
ExitWindowsEx heisst die entsprechende Winapi funktion.
Da kann dir keiner nen anderes Binary unterjubeln ...
Linux:
Programme die nen shutdown fahren koennen, sollten auch die rechte haben. Die Loesung ueber Sudoers iss auch nur ne kruecke.
Besser, das "Programm" als "Shell" mit priviligierteren Rechten laufen lassen, und das herunterfahren ueber nen posix kompatiblen weg anstatt ueber nen drittprogramm.
Aus der Shell bricht jemand mit destruktiven Neigungen dann auch ned so schnell aus ...
Ciao ...
Statt dem üblen system aufruf wuerd ich lieber die winapi direkt bemuehen !
ExitWindowsEx heisst die entsprechende Winapi funktion.
Da kann dir keiner nen anderes Binary unterjubeln ...
Linux:
Programme die nen shutdown fahren koennen, sollten auch die rechte haben. Die Loesung ueber Sudoers iss auch nur ne kruecke.
Besser, das "Programm" als "Shell" mit priviligierteren Rechten laufen lassen, und das herunterfahren ueber nen posix kompatiblen weg anstatt ueber nen drittprogramm.
Aus der Shell bricht jemand mit destruktiven Neigungen dann auch ned so schnell aus ...
Ciao ...
-
CKassiopaia
- Beiträge: 38
- Registriert: 21. April 2009 16:42
Passwort?
Der Fragt dann aber immer noch nach einem Passwort...
kannst du dann ohne ein passwort einzugeben den PC ausschalten?
Also...wenn ich "sudo halt" in der Konsule unter X eingebe...funktioniert es wunderbar... aber wenn ich dann im Qt_programm mit QProcess das aufrufe, funktioniert es nicht mehr... warum?
Gibt es noch andere Möglichkeiten Linux aus C++/Qt zu beenden?
@RHBaum: Kannst du deins nen Bisschen besser beschreiben? danke!
kannst du dann ohne ein passwort einzugeben den PC ausschalten?
Also...wenn ich "sudo halt" in der Konsule unter X eingebe...funktioniert es wunderbar... aber wenn ich dann im Qt_programm mit QProcess das aufrufe, funktioniert es nicht mehr... warum?
Gibt es noch andere Möglichkeiten Linux aus C++/Qt zu beenden?
@RHBaum: Kannst du deins nen Bisschen besser beschreiben? danke!
-
CKassiopaia
- Beiträge: 38
- Registriert: 21. April 2009 16:42
Wenn du mir noch sagst, in welchen LogFiles...dann werd ich vielleicht Fündig....so hab ich nichts gefunden`?
Noch mal ne andere Frage: Wenn ich als "user1" im X-System angemeldet bin... und dann ein Programm starte, wie z.B. das Programm was ich erstellt habe, und darin mit QProcess("halt") ausgeführt wird... als welcher User wird der Prozess gestartet? Auch als "user1"?
Ich hab nämlich mit visudo dem user1 die Rechte gegeben, halt ohne Passwort eingabe zu starte... in der Console funktioniert das auch...aber nicht mehr im Programm selber? Warum?
Noch mal ne andere Frage: Wenn ich als "user1" im X-System angemeldet bin... und dann ein Programm starte, wie z.B. das Programm was ich erstellt habe, und darin mit QProcess("halt") ausgeführt wird... als welcher User wird der Prozess gestartet? Auch als "user1"?
Ich hab nämlich mit visudo dem user1 die Rechte gegeben, halt ohne Passwort eingabe zu starte... in der Console funktioniert das auch...aber nicht mehr im Programm selber? Warum?
Die User ID (uid) und die Effektive UserID (euid) sind Teil der Prozessumgebung. Werden also vom Aufrufenden Prozess an die aufgerufenen Prozesse "weitervererbt". Der Prozess selber kann die aber wechseln, wenn er die berechtigung hat.
Im X-System faengt alles mit dem init an. Der hat natuerlich die uid und euid = 0 (root).
Irgendwann kommt der login prozess, der laeuft auch noch mit der uid=0 (zugriff auf die passwoerter).
Du loggst dich mit deinen Daten an, dann checkt der login Prozess die, wenn die korrekt waren, macht der eine "changeUser" auf Deine UserId.
Dann ueberlagert er sich selber mit der Shell als Prozess.
Die shell laeuft dann natuerlich mit deiner UserID.
Nen User change darf aber nicht jeder .... "eigentlich" darf das nur der root. Also funktioniert das nur nach richtung unten.
Um hochzuswitchen, muss man sich eines anderen Mechanismus bedienen.
Also nochmal bisher zusammengefasst:
euid = die ID, mit derer versucht auf die Ressourcen zuzugreifen
uid = die ID, unter dessen kennung der Prozess gestartet wurde, meist irgendwann vom login prozess aus. (sich der user eingeloggt hat).
Meist gilt, fuer normale prozesse, wenn man nix manipuliert: uid=euid
nun kommt der andere Zweig:
Ein programm hat zusaetzlich noch ein SUID flag(eigenschaft im filesystem) , und einen eigentuemer (ebenfalls eigenschaft im filesystem, teil des eigentlichen berechtigungssystem).
fuer binaries mit gesetzten SUID flag wird nun die effektive user UD nicht mehr aus der uid ermittelt, sondern es wird der eigentuemer der Datei hergenommen !
zu deutsch, hat ein binary das suid flag gesetzt, und der eigentuemer ist root(0) kann die uid (also der eingeloggte user) sonstwas sein, die effektieve userID wird 0. Nur so ist zum beispiel ein switch user moeglich, da fuer das login ja der zugriff auf die passwoerter gebraucht wird, und auf die darf nur root.
Also schau im system nach, das su "Programm" sollte als eigentuemer den root haben und das SUID sollt gesetzt sein. !
Wenn man probleme am Rechtesystem hat, empfehle ich das man sich das auch verinnerlicht ....
DU kannst das natuerlich auch nutzen, in dem du z.b. deinem Programm das suid flag gibst, und eigentuemer root. Dann faehrt dein programm mit euid 0 (root) und kann privilegierte Systemfunktionen nutzen.
Natuerlich kann so ein programm dann nur noch der root selber auf dem PC einrichten ....
Die frage ist eigentlich .... was ist wirklich gewollt (von Dir) und geht das konform mit der Posix / System V Mentalitaet.
Wer soll einen PC ausschalten koennen. eigentlich nur der root, und technisch bedingt, der der davor sitzt ^^
Linux ist nen Multiuser BS, eigentlich sollt das keiner "so ohne weiteres" abschalten koennen. Kann ja sein das noch wer (der root z.b.) auf dem system drauf ist, und wichtige wartungsarbeiten parrallel macht. Der waer sicher ned erfreut.
Muss der rechner wirklich ausgeschalten werden, wenn dein Program sich beendet ? ist es ned denkbar, das wer die konsole switcht, und sich ein 2tes mal anmeldet und das programm nochmal startet ... so dass du 2 instanzen laufen hasst ? soll sich dann immer noch beim beenden des programms, der rechner runterfahren.
Die bessere loesung IMHO waer, zumindest was ich bis hierher raushoere, dein programm als shell einzurichten.
Also so das nach dem login nicht die linux shell, sondern dein prog ausgefuehrt wird. Dann wird ned nur die app gleich gestartet, sondern der User hat gar keine Interaktionsmoeglichkeit mit dem system ausser ueber dein programm, hat keine desktopumgebung, filemanager etc.
Und wenn er dein programm beendet, kommt er gleich wieder zum login.
Dein prog braucht dann nichtmal privilegiertere rechte, sondern kann normal mit userrechten laufen ....
Unter X isses bissi mehr tricky, aber da geht aehnliches (X Sessions und eigenes Programm als desktopumgebung starten).
Ciao ....
Im X-System faengt alles mit dem init an. Der hat natuerlich die uid und euid = 0 (root).
Irgendwann kommt der login prozess, der laeuft auch noch mit der uid=0 (zugriff auf die passwoerter).
Du loggst dich mit deinen Daten an, dann checkt der login Prozess die, wenn die korrekt waren, macht der eine "changeUser" auf Deine UserId.
Dann ueberlagert er sich selber mit der Shell als Prozess.
Die shell laeuft dann natuerlich mit deiner UserID.
Nen User change darf aber nicht jeder .... "eigentlich" darf das nur der root. Also funktioniert das nur nach richtung unten.
Um hochzuswitchen, muss man sich eines anderen Mechanismus bedienen.
Also nochmal bisher zusammengefasst:
euid = die ID, mit derer versucht auf die Ressourcen zuzugreifen
uid = die ID, unter dessen kennung der Prozess gestartet wurde, meist irgendwann vom login prozess aus. (sich der user eingeloggt hat).
Meist gilt, fuer normale prozesse, wenn man nix manipuliert: uid=euid
nun kommt der andere Zweig:
Ein programm hat zusaetzlich noch ein SUID flag(eigenschaft im filesystem) , und einen eigentuemer (ebenfalls eigenschaft im filesystem, teil des eigentlichen berechtigungssystem).
fuer binaries mit gesetzten SUID flag wird nun die effektive user UD nicht mehr aus der uid ermittelt, sondern es wird der eigentuemer der Datei hergenommen !
zu deutsch, hat ein binary das suid flag gesetzt, und der eigentuemer ist root(0) kann die uid (also der eingeloggte user) sonstwas sein, die effektieve userID wird 0. Nur so ist zum beispiel ein switch user moeglich, da fuer das login ja der zugriff auf die passwoerter gebraucht wird, und auf die darf nur root.
Also schau im system nach, das su "Programm" sollte als eigentuemer den root haben und das SUID sollt gesetzt sein. !
Wenn man probleme am Rechtesystem hat, empfehle ich das man sich das auch verinnerlicht ....
DU kannst das natuerlich auch nutzen, in dem du z.b. deinem Programm das suid flag gibst, und eigentuemer root. Dann faehrt dein programm mit euid 0 (root) und kann privilegierte Systemfunktionen nutzen.
Natuerlich kann so ein programm dann nur noch der root selber auf dem PC einrichten ....
Die frage ist eigentlich .... was ist wirklich gewollt (von Dir) und geht das konform mit der Posix / System V Mentalitaet.
Wer soll einen PC ausschalten koennen. eigentlich nur der root, und technisch bedingt, der der davor sitzt ^^
Linux ist nen Multiuser BS, eigentlich sollt das keiner "so ohne weiteres" abschalten koennen. Kann ja sein das noch wer (der root z.b.) auf dem system drauf ist, und wichtige wartungsarbeiten parrallel macht. Der waer sicher ned erfreut.
Muss der rechner wirklich ausgeschalten werden, wenn dein Program sich beendet ? ist es ned denkbar, das wer die konsole switcht, und sich ein 2tes mal anmeldet und das programm nochmal startet ... so dass du 2 instanzen laufen hasst ? soll sich dann immer noch beim beenden des programms, der rechner runterfahren.
Die bessere loesung IMHO waer, zumindest was ich bis hierher raushoere, dein programm als shell einzurichten.
Also so das nach dem login nicht die linux shell, sondern dein prog ausgefuehrt wird. Dann wird ned nur die app gleich gestartet, sondern der User hat gar keine Interaktionsmoeglichkeit mit dem system ausser ueber dein programm, hat keine desktopumgebung, filemanager etc.
Und wenn er dein programm beendet, kommt er gleich wieder zum login.
Dein prog braucht dann nichtmal privilegiertere rechte, sondern kann normal mit userrechten laufen ....
Unter X isses bissi mehr tricky, aber da geht aehnliches (X Sessions und eigenes Programm als desktopumgebung starten).
Ciao ....
-
CKassiopaia
- Beiträge: 38
- Registriert: 21. April 2009 16:42
Also...
...bei mir drehts sich alles um ein CarPC!
Das Ding ist im Auto eingebaut...Mann soll das Gerät per Hand oder über Zündungsplus einschalten können was auch kein Problem darstellt!
Anschließend soll, wenn das Auto aus ist, und das Programm von Hand bzw. automatisiert beendet wird, auch der PC heruntergefahren werden. Da an dem Gerät nur ein TouchScreen und keine Tastatur ist...muss halt in "meinem" Programm ein "großer Butten" zum Auschalten sein... nicht nur dieser einfache Klick über das Debian-System!
Eigentlich wäre es noch besser, wenn der User nur das Programm zu sehen bekommt und kein Desktop-Manager wie Gnome oder so... weil man soll ja nicht unötig viel am System herumfummeln können...
Danke für die Infos!
Das Ding ist im Auto eingebaut...Mann soll das Gerät per Hand oder über Zündungsplus einschalten können was auch kein Problem darstellt!
Anschließend soll, wenn das Auto aus ist, und das Programm von Hand bzw. automatisiert beendet wird, auch der PC heruntergefahren werden. Da an dem Gerät nur ein TouchScreen und keine Tastatur ist...muss halt in "meinem" Programm ein "großer Butten" zum Auschalten sein... nicht nur dieser einfache Klick über das Debian-System!
Eigentlich wäre es noch besser, wenn der User nur das Programm zu sehen bekommt und kein Desktop-Manager wie Gnome oder so... weil man soll ja nicht unötig viel am System herumfummeln können...
Danke für die Infos!