2010-10-16 13 views
24

Ho un programma Java/testfolder/xyz.jar su un computer remoto.Comandi multipli su macchine remote usando lo script di shell

Ha anche un file di configurazione nella stessa cartella. Quando ho SSH nella macchina, lo faccio:

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

Il problema qui è il file di configurazione non è nel percorso, come siamo nella cartella home quindi il mio programma non può readup la configurazione.

Quindi voglio prima andare in quella cartella e quindi eseguire il programma da quella cartella. In uno script di shell, se ho fatto questo

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

esegue la prima istruzione e quando la seconda istruzione è gestito corre sulla mia macchina non corrente della macchina remota.

Possiamo fare solo un comando o ci sono altre soluzioni per questo?

Grazie, Lalith

risposta

38

provare qualcosa di simile:

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

Grazie a entrambi i tuoi commenti! – Lalith

+5

Prego! Trey e la mia risposta fanno la stessa cosa a condizione che la prima parte del comando "funzioni" - la versione con && non esegua la seconda parte del comando se la prima parte fallisce. Per esempio, confronta 'ssh [email protected]" cd/non-esistente; ls -l "' a 'ssh [email protected]" cd/non-esistente && ls -l "'. Nel primo caso si ottiene ancora un output dal comando 'ls -l' (anche se' cd' ha avuto esito negativo - probabilmente la directory home dell'utente 'you') e nel secondo caso il comando' ls -l' è saltato perché il primo * operando * ha restituito * falso *. – Robin

+0

Grazie per il suggerimento '&&'. molto utile –

15

Si potrebbe provare a separare i comandi da un punto e virgola:

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

È importante notare la differenza tra questi due operatori: ** && ** e **; **. ** && ** Significa che il secondo comando verrà eseguito * if, e solo se * il primo comando viene eseguito e restituisce con uno stato di uscita pari a zero (nessun errore) mentre **; ** consente il seguente comando da eseguire indipendentemente dal suo stato di uscita. – earthmeLon

+0

Vale anche la pena notare che una stringa di nuova riga è consentita nella stringa in cui si ha un punto e virgola. (Sì, [le stringhe regolari possono estendersi su più righe in 'sh'] (http://stackoverflow.com/a/9140181/874188) e derivati, senza alcuna sintassi aggiuntiva.) – tripleee

3

Se si desidera dividere i comandi sopra più righe per motivi di leggibilità, è anche possibile passare l'elenco di comandi al comando bash come segue:

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