2010-10-16 5 views
24

Ich habe ein Java-Programm Desktop/testfolder/xyz.jar auf einem Remote-Computer.Mehrere Befehle auf Remote-Maschine mit Shell-Skript

Es hat auch eine Konfigurationsdatei im selben Ordner. Als ich in die Maschine SSH, tun I:

"ssh [email protected] java -cp Desktop/testfolder/xyz.jar Main"

Das Problem hier ist die Konfigurationsdatei nicht im Weg ist, wie wir mein Programm sind, können im Home-Ordner so die Konfiguration nicht Einlesesteuervorrichtung.

Also ich möchte zuerst in diesen Ordner gehen und dann das Programm aus diesem Ordner ausführen. In einem Shell-Skript, wenn ich tue diesen

"ssh [email protected] cd Desktop/testfolder" 
"java -cp xyz.jar Main" 

es führt die erste Anweisung und wenn die zweite Anweisung ausgeführt wird, es läuft auf meiner aktuellen Maschine nicht die Remote-Maschine.

Können wir nur einen Befehl ausführen oder gibt es andere Lösungen dafür?

Danke, Lalith

Antwort

38

so etwas wie dieses Versuchen:

ssh [email protected] "cd /home && ls -l" 
+0

Vielen Dank für Ihre Kommentare! – Lalith

+5

Gern geschehen! Treys und meine Antwort machen dasselbe, wenn der erste Teil des Befehls "funktioniert" - die Version mit dem && führt den zweiten Teil des Befehls nicht aus, wenn der erste Teil fehlschlägt. Vergleichen Sie zum Beispiel 'ssh [email protected]" cd/non-existant; ls -l "' mit 'ssh [email protected]" cd/non-existant && ls -l "'. Im ersten Fall erhalten Sie immer noch eine Ausgabe von dem Befehl "ls -l" (obwohl das "cd" fehlgeschlagen ist - wahrscheinlich das Home-Verzeichnis des "you" -Benutzers) und im letzteren Fall ist der Befehl "ls -l" Übersprungen, weil der erste * Operand * * false * zurückgegeben hat. – Robin

+0

Danke für den '&&' Tipp. sehr hilfreich –

15

Sie könnten versuchen, die Befehle durch ein Semikolon getrennt:

ssh [email protected] "cd Desktop/testfolder ; java -cp xyz.jar Main" 
+25

Es ist wichtig, den Unterschied zwischen diesen beiden Operatoren zu beachten: ** && ** und **; **. ** && ** Bedeutet, dass der zweite Befehl ausgeführt wird * wenn und nur wenn * der erste Befehl ausgeführt wird und mit einem Exit-Status von Null (keine Fehler) zurückkehrt, während **; ** den folgenden Befehl unabhängig von dessen Ausführung erlaubt Ausgangsstatus – earthmeLon

+0

Es ist auch erwähnenswert, dass ein Newline in der Zeichenfolge erlaubt ist, wo Sie ein Semikolon haben. (Ja, [reguläre Zeichenfolgen können mehrere Zeilen in 'sh' umfassen] (http://stackoverflow.com/a/9140181/874188) und Derivate, ohne zusätzliche Syntax.) – tripleee

3

Wenn Sie möchten, dass Ihre Befehle über aufzuspalten mehrere Zeilen aus Gründen der Lesbarkeit könnten Sie auch die Liste der Befehle an den bash Befehl wie folgt übergeben:

ssh [email protected] bash -c "' 
    cd Desktop/testfolder 
    java -cp xyz.jar Main 
'"