Betriebssystem herunterfahren

Alles rund um die Programmierung mit Qt
Blackfyre
Beiträge: 5
Registriert: 19. März 2008 18:48

Betriebssystem herunterfahren

Beitrag von Blackfyre »

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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann teile halt deinem Window-Manager kurz vor Ende des Programmes mit, daß er das System herunterfahren zu hat.
RED Squirrel
Beiträge: 50
Registriert: 3. Februar 2007 22:21

Beitrag von RED Squirrel »

das ist glaub ich von OS zu OS unterschiedlich.

unter windows schreibst du einfach einen system(); aufruf, wenn ich mich noch richtig an meine Windowszeit erinnere

lg. RED
Blackfyre
Beiträge: 5
Registriert: 19. März 2008 18:48

Beitrag von Blackfyre »

Danke für die Antworten. Ich habe das Ganze jetzt mit einem Aufruf der shutdown.exe mit Hilfe eines QProcess gelöst.
CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

Beitrag von CKassiopaia »

Wie kann man das unter Linux/Debian machen?

Code: Alles auswählen

QProcess *shutdown = new QProcess;
shutdown->start("/sbin/shutdown", QStringList() << "-P" << "now");
Tuts leider nicht...Warum kann ich nicht sagen...
Als normaler User kann ich mit "/sbin/shutdown -P now" die Kiste ausschalten!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Was sagen error() bzw. errorString()?
CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

Beitrag von CKassiopaia »

ups....hab da ein "-h" vergessen....so ein Mist....

Code: Alles auswählen

QProcess *shutdown = new QProcess; 
shutdown->start("/sbin/shutdown -P -h now"); 
Funktioniert :-)

Man muss abe zuvor shutdown für den User freischalten:

Code: Alles auswählen

chmod +s /sbin/shutdown 
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wobei die ideale Lösung über sudo läuft!
aus meiner /etc/sudoers:

Code: Alles auswählen

%users local_machine=(ALL) NOPASSWD: /sbin/halt
%users local_machine=(ALL) NOPASSWD: /sbin/reboot
Dann reicht ein sudo halt für einen lokalen user um den Rechner runterzufahren.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

windows:

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?

Beitrag von CKassiopaia »

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!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn etwas nicht funktioniert schaut man in den Log-Files nach, dort findet sich meist auch die Lösung...
CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

Beitrag von CKassiopaia »

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?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

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 ....
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

grep sudo /var/log*
CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

Also...

Beitrag von CKassiopaia »

...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!
Antworten