Wie zum ausführen von unix-Befehlen über Windows/cygwin unter Verwendung der Java
Ich versuche zu erreichen, sind zwei Dinge:
-
Ich arbeite mit cygwin auf Windows 7 ausführen, meine unix-shell-Befehlen, und ich brauche, um den Prozess zu automatisieren, indem eine Java-app. Ich weiß schon, wie die windows shell mit Java unter Verwendung der 'Prozess' Klasse ' und
Runtime.getRuntime().exec("cmd /c dir")
. Ich muss in der Lage sein, das gleiche zu tun mit unix-Befehle: z.B.:ls -la
und so weiter. Was soll ich in? -
Gibt es eine Möglichkeit zu erinnern, eine shell ist-Zustand?
Erklärung: wenn ich mit:Runtime.getRuntime().exec("cmd /c dir")
, ich bekomme immer eine Liste meiner home-Verzeichnis. Wenn ichRuntime.getRuntime().exec("cmd /c cd <some-folder>")
tun, und dannRuntime.getRuntime().exec("cmd /c dir")
wieder, ich bekomme noch die Liste meiner home-Ordner. Gibt es eine Möglichkeit zu sagen, den Prozess zu erinnern, dessen Zustand, wie eine normale shell?
Scheint es, dass die bash
Befehlszeile vorgeschlagen Paŭlo funktioniert nicht:
C:\cygwin\bin>bash -c ls -la
-la: ls: command not found
Ich habe Schwierigkeiten, herauszufinden, die technischen.
Dies ist mein code:
p = Runtime.getRuntime().exec("C:\\cygwin\\bin\\bash.exe -c ls -la");
reader2 = new BufferedReader(new InputStreamReader(p.getInputStream()));
line = reader2.readLine();
line
endet mit einem null-Wert.
Fügte ich diese zu meinem .bash_profile:
#BASH
export BASH_HOME=/cygdrive/c/cygwin
export PATH=$BASH_HOME/bin:$PATH
Habe ich noch folgende als gut:
System Eigenschaften -> erweitert -> Umgebungsvariablen -> Benutzer variebales -> variable:
BASH
, Wert:c:\cygwin\bin
Immer noch nichts...
Jedoch, wenn ich diese ausführen stattdessen, es funktioniert!
p = Runtime.getRuntime().exec("c:\\cygwin\\bin\\ls -la ~/\"Eclipse_Workspace/RenameScript/files copy\"");
- Okay, mal sehen. Direkt ausführen der
ls.exe
scheint zu funktionieren, wenn wir den richtigen Weg. - ok, also wie mache ich bash zu erkennen, es bei der Verwendung von -c-argument?
- Ich denke, bei der Ausführung mit
-c
es nicht ausgeführt werden Ihren.bashrc
. Sie könnten versuchen, den Pfad mit denenvp
argumentexec
. (Ich werde hinzufügen, um meine Antwort.) - p = Runtime.getRuntime().exec("C:/cygwin/bin/bash -c '/bin/ls -la'"); damit das funktioniert
Du musst angemeldet sein, um einen Kommentar abzugeben.
1. Aufruf von unix-Kommandos:
Müssen Sie einfach rufen Sie Ihren unix-shell (z.B. bash geliefert mit cygwin) statt
cmd
.tun sollte. Natürlich, wenn Ihr Befehl ist ein externes Programm, können Sie einfach direkt aufrufen:
Beim starten dieses von Java, ist es am besten, die Variante verwenden, die einen string-array, wie dann
Sie haben keine Java-lassen Sie es analysieren, um zu sehen, wo die Argumente anfangen und aufhören:
Die Fehlermeldung in deinem Beispiel (
ls: command not found
) scheint zu zeigen, dass Ihre bash nicht finden können, diels
Befehl. Vielleicht müssen Sie es in die PATH-variable (siehe oben) einen Weg, dies zu tun, die von Java).Vielleicht anstelle von
/cygdrive/c/cygwin/bin
, dem richtigen Verzeichnis-Namen würde/usr/bin
.(Ist alles ein bisschen kompliziert hier, indem er zur Brücke zwischen Unix und Windows
Konventionen überall.)
Den einfachen
ls
Befehl kann aufgerufen werden wie diese:2. Aufrufen mehrerer Befehle:
Gibt es grundsätzlich zwei verschiedene Wege aufrufen mehrere Kommandos in einer shell:
Für die erste Art und Weise, geben Sie einfach mehrere Befehle als argument der
-c
option, getrennt durch;
oder\n
(Zeilenumbruch), wie diese:oder von Java (Anpassung der Beispiel oben):
Hier die shell analysiert die Befehlszeile, und führen Sie es wie ein Skript. Wenn es enthält mehrere Befehle, Sie werden alle ausgeführt, wenn die shell nicht irgendwie beenden, bevor Sie für einige Grund (wie eine
exit
- Befehl). (Ich bin mir nicht sicher, ob die Windowscmd
funktioniert in ähnlicher Weise. Bitte testen und berichten.)Statt der übergabe der bash (oder cmd oder was auch immer-shell, die Sie verwenden) die Befehle des
Befehl Linie, können Sie passieren Sie über den Prozess " input-stream.
-c
option noch ein shell-Skript-Datei-argument) liest Eingaben von dem Datenstrom, und interpretieren Sie die erste Zeile wie ein Kommando (oder mehrere).exit
Befehl (oder einige andere Gründe, um zu beenden).Hier wäre ein Beispiel für diese:
mintty
, da Sie nicht wollen, zu einer terminal - statt direkt aufrufen, Ihrebash.exe
.-c
option, und als solche werden genau ein argument - entweder zitiert (wenn Sie mit Ihrem windows-shell zu starten) oder einfach separat übergeben. Ich aktualisierte die Antwort.C:\\cygwin\\bin
- Verzeichnis (oder dessen cygwin-äquivalent) sollte in der PATH-variable. (Kann ich nicht wirklich testen, da ich nicht mit Windows (und Cygwin) für einige Jahre jetzt.)Brauchen Sie nicht cygwin hier. Es gibt mehrere Reine Java-Bibliotheken Implementierung der SSH-Protokoll. Verwenden Sie Sie. BTW, Sie lösen Ihre zweite problem. Sie Sitzung öffnen und ausführen von Befehlen innerhalb der gleichen Sitzung, so die shell-Zustand erhalten wird, automatisch.
Ein Beispiel wäre JSch.
ssh
(oderc:/cygwin/bin/ssh.exe
) anstelle von bash für alle die Beispiele.