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.
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?