Zum Inhalt springen

ProcessBuilder kleine frage


DerKoenig

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...