Wie führe ich Unix-Befehle über Windows / cygwin mit Java aus?

8

Ich versuche zwei Dinge zu erreichen:

  1. Ich führe cygwin unter Windows7 aus, um meine Unix-Shell-Befehle auszuführen, und ich muss den Prozess automatisieren, indem ich eine Java-App schreibe. Ich weiß bereits, wie man die Windows-Shell über Java verwendet, indem ich die 'Prozessklasse' und Runtime.getRuntime().exec("cmd /c dir") verwende. Ich muss in der Lage sein, das gleiche mit Unix-Befehlen zu tun: z.B. ls -la und so weiter. Worauf sollte ich achten?

  2. Gibt es eine Möglichkeit, sich an den Zustand einer Shell zu erinnern? Erklärung: Wenn ich: Runtime.getRuntime().exec("cmd /c dir") verwende, erhalte ich immer eine Liste meines Home-Verzeichnisses. Wenn ich Runtime.getRuntime().exec("cmd /c cd <some-folder>") und dann Runtime.getRuntime().exec("cmd /c dir") wieder mache, erhalte ich immer noch die Liste meines Home-Ordners. Gibt es eine Möglichkeit, dem Prozess zu sagen, dass er sich an seinen Zustand erinnern soll, wie eine normale Shell?

Es scheint, dass die von Paŭlo vorgeschlagene Befehlszeile bash nicht funktioniert:

%Vor%

Ich habe Probleme, die technischen Details herauszufinden.

Das ist mein Code:

%Vor%

line endet mit einem Nullwert.

Ich habe das zu meinem .bash_profile hinzugefügt:

%Vor%

Ich habe auch Folgendes hinzugefügt:

  

Systemeigenschaften - & gt; fortgeschritten - & gt; Umgebungsvariablen - & gt; Benutzer variebales - & gt; Variable: BASH , Wert: c:\cygwin\bin

Immer noch nichts ...

Wenn ich das stattdessen ausführe, funktioniert es!

%Vor%     
Martin Klosi 19.07.2011, 18:09
quelle

2 Antworten

8

1. Unix-Befehle aufrufen:

Sie müssen einfach Ihre Unix-Shell aufrufen (z. B. die mit cygwin ausgelieferte Bash) anstatt cmd .

%Vor%

sollte tun. Wenn Ihr Befehl ein externes Programm ist, können Sie es natürlich einfach direkt aufrufen:

%Vor%

Wenn Sie dies von Java aus starten, ist es am besten, die Variante zu verwenden, die ein String-Array verwendet Sie haben Java nicht parat, um zu sehen, wo die Argumente beginnen und enden:

%Vor%

Die Fehlermeldung in Ihrem Beispiel ( ls: command not found ) scheint zu zeigen, dass Ihre bash den Befehl ls nicht finden kann. Vielleicht müssen Sie es in die PATH-Variable einfügen (siehe oben für eine Möglichkeit, dies aus Java zu tun).

Vielleicht statt /cygdrive/c/cygwin/bin wäre der richtige Verzeichnisname /usr/bin .

(Hier ist alles ein wenig kompliziert, weil man zwischen Unix und Windows überbrücken muss)  Konventionen überall.)

Der einfache Befehl ls kann wie folgt aufgerufen werden:

%Vor%

2. Mehrere Befehle aufrufen:

Es gibt grundsätzlich zwei Möglichkeiten, mehrere Befehle in einer Shell aufzurufen:

  • übergibt sie alle gleichzeitig an die Muschel; oder
  • übergibt sie interaktiv an die Shell.

Für den ersten Weg geben Sie einfach mehrere Befehle als Argument für die Option -c , getrennt durch ; oder \n (eine neue Zeile), wie folgt:

%Vor%

oder aus Java (Anpassung des obigen Beispiels):

%Vor%

Hier analysiert die Shell die Befehlszeile als und führt sie als Skript aus. Wenn es mehrere Befehle enthält, werden sie alle ausgeführt, wenn die Shell aus irgendeinem Grund nicht irgendwie beendet wird (wie ein Befehl exit ). (Ich bin mir nicht sicher, ob das Windows cmd auf ähnliche Weise funktioniert. Bitte testen und melden.)

Anstatt die bash (oder cmd oder irgendeine Shell, die Sie benutzen) zu übergeben, müssen Sie die Befehle auf der Befehlszeile können Sie sie über den Eingabe-Stream Prozess übergeben.

  • Eine im "Eingabemodus" gestartete Shell (zB eine, die weder die -c -Option noch ein Shell-Script-Dateiargument hat) liest Eingaben aus dem Stream und interpretiert die erste Zeile als einen Befehl (oder mehrere).
  • Dann wird es diesen Befehl ausführen. Der Befehl selbst könnte mehr Input aus dem Stream lesen, wenn er möchte.
  • Dann liest die Shell die nächste Zeile, interpretiert sie als Befehl und führt sie aus.
  • (In einigen Fällen muss die Shell mehr als eine Zeile lesen, zum Beispiel für lange Strings oder kompilierte Befehle wie if oder loops.)
  • Dies wird bis zum Ende des Streams (z. B. stream.close () an Ihrer Seite) oder zur Ausführung eines expliziten exit -Befehls (oder anderer Gründe zum Beenden) fortgesetzt.

Hier wäre ein Beispiel dafür:

%Vor%     
Paŭlo Ebermann 19.07.2011 18:18
quelle
1

Du brauchst Cygwin hier nicht. Es gibt mehrere reine Java-Bibliotheken, die das SSH-Protokoll implementieren. Benutze sie. BTW werden sie Ihr zweites Problem lösen. Sie öffnen die Sitzung und führen den Befehl mit derselben Sitzung aus, sodass der Shell-Status automatisch beibehalten wird.

Ein Beispiel wäre JSch .

    
AlexR 19.07.2011 18:18
quelle

Tags und Links