DerKoenig Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 Moin Moin, ich führe ein Befehl auf der Linux Shell aus mit Hilfe vom ProcessBuilder in folgender form: ProcessBuilder builtProcess = new ProcessBuilder("befehl", "paramter1",...) process p = builtProcess.start(); alles funktioniert wies soll, an einer anderen Stelle, möchte ich allerdings ebenfalls einen script aufrufen, nur wird bevor er es ausführt gefragt ob man es wirklich ausführen möchte, dies ist mit y oder n zu beantworten. es gibt kein parameter der die abfrage unterdrückt. meine frage: wie kann ich dem processbuilder einen zweiten befehl übermitteln (nämlich: "y") Zitieren
Amstelchen Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 wenn das aufgerufene script interaktive eingaben verlangt und keinen "quiet"-parameter erlaubt, wirst du keine andere möglichkeit haben, als das script zu adaptieren. mehrere parameter kannst du ja dem script übergeben, aber dann wird ein "y" vom script wahrscheinlich ignoriert werden. s'Amstel Zitieren
speedi Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 (bearbeitet) Falls es für deine zwecke Funktioniert dann arbeite anstatt mit ProcessBuilder mit Runtime.getRuntime().exec(...). Die Methode liefert dir einen Process zurück welcher über einen InputStream und einen OutputStream verfügt. Den OutputStream kannst du dann in einen OutputStreamWriter packen und diesen in einen PrintWriter. Danach machst du noch printwriter.println("y"); und printwriter.flush(); und deine Shell bekommt ne eingabe. __________UPDATE___________ processBuilder.start(); liefert dir auch einen Process zurück. Von demher ists egal was du letztendlich verwendest um auf dem OutputStream das rauszuschreiben. Bearbeitet 3. Dezember 2008 von speedi Zitieren
DerKoenig Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 ja also das hab ich schon versucht, aber funktioniert nicht so ganz, hast du nen beispiel parat ? =) wäre nett Zitieren
speedi Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 try { Process p = Runtime.getRuntime().exec("cmd"); PrintWriter out = new PrintWriter(new OutputStreamWriter(p.getOutputStream())); out.println("ping localhost"); out.flush(); } catch (IOException e) { e.printStackTrace(); } (FÜR WINDOWS: Öffnet eine Kommandozeilenkonsole (nicht sichtbar) und führt danach einen in ihr einen Ping aus). Genau so gut könnte man anstatt "cmd" "telnet" ausführen und dann befehle eintippen. Du musst natürlich sicher stellen, dass du es auch zu dem Zeitpunkt rausschreibst, an dem dein Scipt auf die Eingabe wartet und nicht schon vorher. Indem du den InputStream liest kannst du übrigens sehen, was grade von deinem Script ausgegeben wird. Im übrigen: die Methode funktioniert wahrscheinlich nur wenn du mit dem ProcessBuilder dein Script direkt aufrufst. Bzw. wenn dein Programm direkt in der Konsole des Prozesses läuft und nicht in einer Konsole die vom Prozess zusätzlich geöffnet wurde. Zitieren
DerKoenig Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 (bearbeitet) wunderbar, danke =) Bearbeitet 3. Dezember 2008 von DerKoenig Zitieren
speedi Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 (bearbeitet) Das kann ich dir leider nicht sagen, aber ich denke es sollte schon vollkommen ausreichen, wenn du einfach dein Script mit den entsprechenden Parametern aufrufst. Wenn du dir nicht sicher bist ob es so läuft wie es soll versuchs mal damit: try { final Process p = Runtime.getRuntime().exec("deinScript -undParameter"); new Thread(){ public void run() { try{ BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String s; while((s = in.readLine()) != null){ System.out.println(s); } in.close(); }catch(IOException e){ e.printStackTrace(); } } }.start(); } catch (IOException e) { e.printStackTrace(); } Das startet dir einen Prozess und danach einen Thread in dem der InputStream des Threads gelesen wird. Optimalerweise bekommst du nun auf deiner JAVA-Konsole genau das ausgegeben, was du bekommen würdest, wenn du dein Script direkt aufrufst. Nachdem der Thread gestartet wurde kannst dann mittels PrintWriter wie oben erklärt ganz normal Befehle an das Programm schicken. Du kannst aber auch im Thread sowas machen wie: if(s.equals("Echt löschen?(Y/N)"){ //das ist natürlich nur ein Beispiel. ICh weiß ja nicht welche Frage dein Script genau stellt. out.println("y"); //Dafür muss out natürlich erstmal als PrintWriter erstellt worden sein out.flush(); } Wie schon gesagt: Du musst halt schauen, dass dein Script die "y"-Eingabe genau dann erhält wann es sie echt erwartet und nicht gleich unmittelbar nach dem start des Script. Bearbeitet 3. Dezember 2008 von speedi Zitieren
DerKoenig Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 besser gehts nicht, sehr sehr nett :-* Zitieren
speedi Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 (bearbeitet) überfällig _ entfernt! Bearbeitet 3. Dezember 2008 von speedi Zitieren
DerKoenig Geschrieben 4. Dezember 2008 Autor Geschrieben 4. Dezember 2008 es klappt immernoch nich so wie ich möchte, ich hab mal ein beispiel shellscript angehängt, kann mal jemand jenes per java ausführen und nach aufruf die abfrage mit "ja" beantworten (alles java gesteuert) falls das wer hinbekommt :-/example.rar Zitieren
speedi Geschrieben 4. Dezember 2008 Geschrieben 4. Dezember 2008 Ich kann heute Abend gern mal drüber schauen. Was passiert denn genau? Hast jetzt mal rausschreiben lassen was vom Process ausgegeben wird? Zitieren
DerKoenig Geschrieben 4. Dezember 2008 Autor Geschrieben 4. Dezember 2008 leider passiert eben garnichts, dass ist mein problem, ich weiß nicht wie ich reagieren soll, weil ich nichts wiederkrieg und auch keine fehlermeldung Zitieren
speedi Geschrieben 4. Dezember 2008 Geschrieben 4. Dezember 2008 Dein Script liegt aber schon im Hauptordner deines Java-Programms oder? Falls du dir nicht sicher bist: new File("nameDerScriptDatei").exists() (nicht den Pfad angeben sondern nur den Dateinamen) sollte mit true antworten. spontan würde mir sonst noch folgendes einfallen was du probieren könntest: mit 1. Konsole starten: "Runtime.getRuntime("bash");" 2. Ins verzeichnis des Scrips wechseln out.println("cd /verzeichnispfad"); out.flush();: 3. Script aufrufen out.println("example.sh"); out.flush(); Zitieren
DerKoenig Geschrieben 4. Dezember 2008 Autor Geschrieben 4. Dezember 2008 durch deine letzte antwort steig ich nicht wirklich durch ( out.flush ? ) ja der pfad ist richtig ich geb nen kompletten pfad zum script ein und wenn ich den befehl so wie ich ihn übergebe kopiere und im terminal ausführe, funktioniert es wie gesagt, dass programm wartet auf eine eingabe und ich kann mir vorstellen, dass es irgendwie damit zusammenhängt :S Zitieren
speedi Geschrieben 4. Dezember 2008 Geschrieben 4. Dezember 2008 out.flsuh() brauchst du deshalb weil dein Printwriter alles erstmal bufferd. Erst wenn du flushst schreibt er die Sachen wirklich raus. Optional kannst du aber auch beim Konstruktor des Printstreams per boolean einstellen das automatisch geflusht werden soll. Zitieren
DerKoenig Geschrieben 4. Dezember 2008 Autor Geschrieben 4. Dezember 2008 hmm habs bisher mit dem BufferedWriter gemacht wie funktioniert das mit dem Print... =) danke dass du dir so viel mühe gibst thX Zitieren
speedi Geschrieben 4. Dezember 2008 Geschrieben 4. Dezember 2008 (bearbeitet) Damit gehts: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; public class RunAScript { public static void main(String[] args) { try { final Process p = Runtime.getRuntime().exec("bash example.sh"); BufferedReader in = new BufferedReader(new InputStreamReader(p .getInputStream())); String s; while ((s = in.readLine()) != null) { System.out.println(s); if(s.equals("im Vorraus.")){//Wenn letzte Zeile vor der Abfrage erreicht... PrintWriter out = new PrintWriter(new OutputStreamWriter(p .getOutputStream())); out.println("ja"); out.flush(); } } } catch (IOException e) { e.printStackTrace(); } } } Mit ProcessBuilder gehts so ähnlich: LinkedList<String> liste = new LinkedList<String>(); liste.add("bash"); liste.add("example.sh"); ProcessBuilder builder = new ProcessBuilder(liste); final Process p = builder.start(); Bearbeitet 4. Dezember 2008 von speedi Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.