• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

Terminal Befehle aus Java mitgeben

  • Ersteller Ersteller Nik
  • Erstellt am Erstellt am

Nik

Schöner von Nordhausen
Registriert
04.07.10
Beiträge
319
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 :)
 
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