Seite 1 von 2
Betriebssystem herunterfahren
Verfasst: 21. März 2008 12:12
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
Verfasst: 21. März 2008 12:26
von upsala
Dann teile halt deinem Window-Manager kurz vor Ende des Programmes mit, daß er das System herunterfahren zu hat.
Verfasst: 21. März 2008 18:55
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
Verfasst: 25. März 2008 19:25
von Blackfyre
Danke für die Antworten. Ich habe das Ganze jetzt mit einem Aufruf der shutdown.exe mit Hilfe eines QProcess gelöst.
Verfasst: 6. Mai 2009 14:00
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!
Verfasst: 6. Mai 2009 14:02
von franzf
Was sagen error() bzw. errorString()?
Verfasst: 6. Mai 2009 14:04
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:
Verfasst: 6. Mai 2009 14:07
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.
Verfasst: 6. Mai 2009 16:06
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 ...
Passwort?
Verfasst: 6. Mai 2009 16:09
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!
Verfasst: 6. Mai 2009 17:11
von upsala
Wenn etwas nicht funktioniert schaut man in den Log-Files nach, dort findet sich meist auch die Lösung...
Verfasst: 7. Mai 2009 08:06
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?
Verfasst: 7. Mai 2009 11:50
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 ....
Verfasst: 7. Mai 2009 12:18
von upsala
grep sudo /var/log*
Also...
Verfasst: 11. Mai 2009 14:19
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!