staging.inyokaproject.org

mitJava auf Konsole schreiben

Status: Gelöst | Ubuntu-Version: Kubuntu 6.06 (Dapper Drake)
Antworten |

caliban

Avatar von caliban

Anmeldungsdatum:
9. März 2006

Beiträge: Zähle...

Guten Tag

Intro
Ich habe in letzter zeit festgestellt, dass kubuntu einige schön aussehende tools hat, die aber selten genau das machen was man eigentlich will. Insbesondere im Wireless berreich. da gibt man häufig Parameter ein und es passiert... nichts. Damit habe ich mich abgefunden und mittlerweile für die 6-7 Wireless lans die ich häufig benutze schöne Shell Skripte geschrieben mit den jeweiligen Parametern. Nun hat mich der Basteltrieb gepackt und ich habe mir überlegt mittels java ein schönes Gui zu schreiben wo ich per knopfdruck auf die jeweiligen skripte zugreifen kann und die aktivieren kann. Zusätzlich später noch ein Gui hinzufügen zum generieren eines neuen Skriptes.

Problem
nun habe ich das Problem das ich zwar sehr wohl auf die Konsole zugreifen kann mittels

public static void testmethode() throws IOException
{
		Process proc = Runtime.getRuntime().exec("konsole");
}


dies öffnet dann eben die Konsole.
Aber was ich bisher noch nicht kann, ist dann dort via Java einen Befehl unterzujubeln. So rein überlegungstechnisch wollte ich das mit einem Outputstream machen im stil von:

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));
out.write("ls");


ls hier rein zum test. es passiert aber genau nichts.

Mit der windoof cmd sieht die Sache so ungefähr so aus:

Process proc = Runtime.getRuntime().exec( "cmd /c ipconfig /all" );


Öffnet also die Cmd Konsole und gibt gerade die Ipconfig aus. Das geht widerum leider nicht unter Linux

Hätte da jemand eine idee?
Besten Dank im voraus.

Zero

Anmeldungsdatum:
28. September 2005

Beiträge: Zähle...

Der Methode exec() einfach das Kommando das du ausführen möchtest direkt übergeben.

Also z.B. um bei deinem Beispiel zu bleiben die Ausgabe der Interfaces.

Process proc = Runtime.getRuntime().exec( "ifconfig -a" );

Mit

proc.getInputStream()

könntest du das Ergebnis dann wiederum einlesen zur Weiterverarbeitung.

DrScott Team-Icon

Ehemalige
Avatar von DrScott

Anmeldungsdatum:
7. Juli 2005

Beiträge: 6018

Mit der Klasse Process begibst Du Dich auf gefährliches Terrain (Threads):

Der Prozess schreibt ja seine Ausgaben in einen Buffer. Ist diese Ausgabe 'relativ' kurz, so wirst Du keine Probleme feststellen. Bei sehr langen Ausgaben mußt Du aber dafür Sorge tragen, daß dieser Buffer immer schon brav ausgelesen wird, ansonsten blockierst Du den Prozess (da der Buffer irgendwann voll läuft und erst mal 'abwartet').

Sehr ungut wäre also z.b.

Process proc = Runtime.getRuntime().exec( "kommando_welches_sehr_lange_ausgabe_erzeugt" );

int exit_code = proc.waitFor();

InputStream is = proc.getInputStream();

da hier eben ein DeadLock zwischen den beteiligten Threads auftreten kann. Also immer schön sowohl InputStream als auch ErrorStream auslesen. Jetzt die Preisfrage: muß das auch wiederum unabhängig voneinander geschehen? Ich glaube nicht, bin mir da aber nicht so sicher...

Und immer daran denken: Threads sind böse!

Zero

Anmeldungsdatum:
28. September 2005

Beiträge: Zähle...

DrScott hat geschrieben:

Und immer daran denken: Threads sind böse!

Würde ich jetzt so direkt nicht behaupten, aber man muß schon genau überlegen und aufpassen sonst bringt man sich schnell in Teufels-Küche. 😉

Ich würde den Inputstream allerdings auch in einen BufferedInputStream oder BufferedReader schachteln.

caliban

(Themenstarter)
Avatar von caliban

Anmeldungsdatum:
9. März 2006

Beiträge: 35

vielen dank für die hilfe.

leider bin ich noch nicht weitergekommen: der vorschlag mit ifconfig -a direkt aufzurufen hat nichts gebracht. ich kann also weiterhin nicht innerhalb der shell arbeiten. was ich eben suche ist eine möglichkeit direkt in das eben mit dem befehl konsole geöffnete fenster zu schreiben.. bzw direkt mit java.

und threads sind böse \^^. merkt man spätestens wenn man das erste mal ein programm debuggen muss, dass mehrere threads hat. darum kümmere ich mich aber später.

bitte vorläufig mal ignorieren ☺. hab ne möglichkeit gefunden die ausgabe des befehls zu lesen. ev ergeben sich aber noch weitere fragen.

Zero

Anmeldungsdatum:
28. September 2005

Beiträge: 62

caliban hat geschrieben:

leider bin ich noch nicht weitergekommen: der vorschlag mit ifconfig -a direkt aufzurufen hat nichts gebracht. ich kann also weiterhin nicht innerhalb der shell arbeiten. was ich eben suche ist eine möglichkeit direkt in das eben mit dem befehl konsole geöffnete fenster zu schreiben.. bzw direkt mit java.

Wenn ich dich jetzt richtig verstehe, öffnest du also per exec() eine Konsole und willst in dieser dann per Java Befehle abarbeiten? So ad hoc würde ich sagen, das geht nicht oder wenn dann nur mit viel Aufwand. Lasse mich aber gerne eines besseren belehren.

Es geht aber auf jeden Fall so wie ich beschrieben haben. Mal ein kurzes Beispiel anhand von ifconfig -a das den Befehl per Java ausführt und das Ergebnis auf der Konsole anzeigt.
Blödsinnig und nicht unbedingt schön, aber sollte klar machen, was ich meine.

Process proc = Runtime.getRuntime().exec( "ifconfig -a" );

BufferedReader bfr = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = "";

while((line = bfr.readLine()) != null)
        System.out.println(line);

Oder ich habe dich total falsch verstanden. 😉

Edit: Ok, hab ich wohl zulange gebraucht. Bin vom Kollegen abgelenkt worden. 😉

DrScott Team-Icon

Ehemalige
Avatar von DrScott

Anmeldungsdatum:
7. Juli 2005

Beiträge: 6018

Siehst Du Zero, davon rede ich: Threads sind böse! Dein Code hat nämlich das Potential zum Deadlock (allerdings wohl nicht mit ifconfig -a):

Der Buffer des ErrorStreams könnte jetzt volllaufen, dann nützt Dir Dein braves (gemeint ist schleifendes) Auslesen des InputStreams gar nichts: Ich hab's bisher ohne Threads nicht sauber hinbekommen...

Antworten |