Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

ProcessBuilder kleine frage

Empfohlene Antworten

Veröffentlicht

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")

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

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 von speedi

ja also das hab ich schon versucht, aber funktioniert nicht so ganz, hast du nen beispiel parat ? =) wäre nett

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.

wunderbar, danke =)

Bearbeitet von DerKoenig

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 von speedi

besser gehts nicht, sehr sehr nett :-*

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

leider passiert eben garnichts, dass ist mein problem, ich weiß nicht wie ich reagieren soll, weil ich nichts wiederkrieg und auch keine fehlermeldung :(

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();

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

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.

hmm habs bisher mit dem BufferedWriter gemacht wie funktioniert das mit dem Print...

=) danke dass du dir so viel mühe gibst thX

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 von speedi

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.