• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Terminal Befehle aus Java mitgeben

Nik

Transparent von Croncels
Registriert
04.07.10
Beiträge
314
Hallo zusammen,

ich habe eine kleines Problem. Ehrlich gesagt ist es für mich sehr groß.
Also wir programmieren in der Schule mit Java, jetzt ist meine Aufgabe einen Shutdown-Manager für Mac zu bauen.
Das Frontend werde ich schon irgendwie hinbekommen, aber wollte mich erstmal damit beschäftigen wie ich überhaupt aus Java Terminal Befehle starten kann.

Das einzige was ich bisher gefunden habe war "Runtime Exec".

So da ich auf meinem Mac nur unter einem Standardbenutzer arbeite, muss ich mich im Terminal zum Shutdownbefehl logischer weise erstmal als "Master" (so heißt mein Admin-Benutzer) anmelden, um einen sudo Befehl auszuführen.

Ich habe da jetzt per "Learning by Doing" einiges probiert, und auch google hat mir irgendwann nicht mehr weiter geholfen.
Mal ein Beispiel meines aktuell probierten Codes:
Code:
Runtime.getRuntime().exec(new String []{"login", "Master", password, command, password});
Hinter command steckt einfach nur.
Code:
command = "sudo shutdown -h +1";

So ich kann halt leider keine mehrfachen Befehle hintereinander eingeben, zumindest spuckt er mir immer einen Fehler aus.
Ich habe irgendwo gelesen das es bei Windows geht wenn man davor, erstmal nochmal manuell sagt er soll die cmd öffnen. Aber das habe ich nicht fürs Terminal gefunden.

Irgendwie klappt das alles nicht so ganz, aber das wäre die Voraussetzung für das Programm.
Hat jemand von euch eine Idee? vielleicht auch eine komplett andere?
Ein kleiner Beispielcode wäre dann ganz nett, da ich nicht besonders viel Ahnung von Java habe.



Daaaankeschööön :)
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.560
So etwas wie "Terminal-Befehle" gibt es nicht wirklich. Du willst Unix-Programme von einem Java-Programm aus aufrufen, in diesem Fall das Programm /usr/bin/sudo, das seinerseits das Programm /sbin/shutdown aufrufen soll.

Das Terminal ist nur eine Art spezielles Textverarbeitungsprogramm, das sich bereits selbst per Login an einem "Textbildschirm" des Unix-Systems anmeldet und dann eine Ablaufumgebung (Shell) startet. Bei Windows gibt es als Shell zum Beispiel "cmd", bei OS X gibt es zum Beispiel "bash". Um eine Shell von einem Java-Programm aus zu starten, braucht man das Terminal nicht. Grundsätzlich musst Du nur eine Shell starten, die dann sudo startet, das dann shutdown startet. Außerdem muss das für sudo nötige Administratorkennwort vom Java-Programm an sudo durchgereicht werden.

Jedes Unix-Programm öffnet drei Ein-/Ausgabekanäle, wenn es läuft: stdout (normale Ausgaben), stderr (Ausgabe von Fehlermeldungen) und stdin (Eingaben). Diese Kanäle wären normalerweise als Textein-/ausgabe an das Terminal angeschlossen, müssen jetzt aber vom Java-Programm aus gelesen und geschrieben werden. Über den stdin-Kanal kann das Java-Programm z.B. das Kennwort an das laufende sudo-Programm schicken.

Um eine vollwertige Ablaufumgebung mit den drei Kanälen von einem Java-Programm aus zu verwalten, ist die Klasse ProcessBuilder die übliche Lösung. Anregungen findest Du hier. Die Details musst Du schon selbst herausfinden.
 
  • Like
Reaktionen: salome und Nik