| 

.NET C# Java Javascript Exception

4
Hallo zusammen,

ich habe ein unix-tool, welches ich in meine Java-Applikation einbinden möchte. Grundsätzlich ist dies mit Runtime.exec() möglich, wobei man neben dem eigentlichen Befehl auch Parameter als Stringarray und das Working-Directory mitgeben kann. Ich muss ein Passwort an das Tool übergeben.

Jetzt kommt das ABER:
Nach meinem Wissensstand gehört es zur guten Sitte, dass man Passwörter nicht über die Kommandozeile an Programme weitergibt, weil die aufgerufenen Befehle von der Shell in der history gespeichert werden und das Passwort somit im Klartext auf der Festplatte landet.

Daraus ergeben sich für mich folgende Fragen:

  • Verhält es sich mit dem Java-Runtime.exec() genau so, wie auch mit "manuellen Aufrufen" in der Shell? Werden Aufrufe/Parameter irgendwo abgespeichert/geloggt?

  • Gibt es eine Möglichkeit mein stdout an das stdin des auszuführenden Prozess zu leiten? Unter unix ist sowas ja mit
    befehl1 | befehl2
    ohne weiteres möglich. Gibt es solch eine Funktion auch in Java?
    Anmerkung: PipedOutputStream habe ich mir bereits angeschaut. Dies scheint allerdings nur für die Kommunikation von Threads innerhalb einer JVM zu sein, nicht zur Inter-Prozess-Kommunikation.


Über jegliche Hilfe würde ich mich sehr freuen.
03.08.2011
wlami 736 1 8
wlami 736 1 8
1 Antwort
0
So Freunde,
nachdem ich von einem Kollegen einen guten Hinweis bekommen habe, bin ich auf eine Antwort für Frage 2 gekommen.

import java.io.DataOutputStream;
import java.io.IOException;

public class TestProcPipe {

public static final String command = "/path/to/my/mycommand";
public static final String param1 = "xxx";
public static final String param2 = "yyy";

public static void main(String[] args) throws IOException {
String complete = String.format("%s %s %s", command, param1, param2);
System.out.println("Invoking: " + complete);
Process proc = Runtime.getRuntime().exec(complete);
DataOutputStream dataOutputStream = new DataOutputStream(proc.getOutputStream());
dataOutputStream.writeBytes("MySecretPassword\n\n\n");
dataOutputStream.close();
}

}


Ich hatte nicht beachtet, dass exec() einen Rückgabewert liefert. Durch diesen kann man auf die Datenströme des Kind-Prozesses zugreifen. Das wirklich spannende steht in folgenden Zeilen:

Process proc = Runtime.getRuntime().exec(complete);
DataOutputStream dataOutputStream = new DataOutputStream(proc.getOutputStream());
dataOutputStream.writeBytes("MySecretPassword\n\n\n");


Es bleibt allerdings die Frage, ob dieser Aufruf Spuren im System hinterlässt, sodass "MySecreatPassword" in irgendwelchen Logs landet. Hat da jemand Informationen zu?
03.08.2011
wlami 736 1 8

Stelle deine Java-Frage jetzt!