2010-10-16 27 views
24

Tengo un programa java Desktop/testfolder/xyz.jar en una máquina remota.Múltiples comandos en la máquina remota usando script de shell

También tiene un archivo de configuración en la misma carpeta. Cuando ssh en la máquina, lo hago:

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

El problema aquí es el archivo de configuración no está en el camino, ya que estamos en la carpeta de inicio por lo que mi programa no puede readup la configuración.

Así que primero quiero ir a esa carpeta y luego ejecutar el programa desde esa carpeta. En un script de shell si hiciera esto

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

se ejecuta la primera instrucción y cuando se ejecuta la segunda instrucción se ejecuta en mi actual máquina no la máquina remota.

¿Podemos hacer un solo comando o hay otras soluciones para esto?

Gracias, Lalith

Respuesta

38

intentar algo como esto:

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

¡Gracias a ambos comentarios ayudados! – Lalith

+5

¡De nada! Trey y mi respuesta hacen lo mismo siempre que la primera parte del comando "funcione": la versión con el && no realiza la segunda parte del comando si falla la primera parte. Por ejemplo, compare 'ssh [email protected]" cd/non-existant; ls -l "' to 'ssh [email protected]" cd/non-existant && ls -l "'. En el primer caso, todavía obtienes algún resultado del comando 'ls -l' (aunque el' cd' falló, probablemente el directorio de inicio del usuario 'you') y en este último caso el comando' ls -l' es omitido porque el primer * operando * devolvió * falso *. – Robin

+0

Gracias por la sugerencia '&&'. muy útil –

15

Usted podría intentar separar los comandos por un punto y coma:

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

Es importante tener en cuenta la diferencia entre estos dos operadores: ** && ** y **; **. ** && ** Significa que el segundo comando se ejecutará * if, y solo si * el primer comando se ejecuta y regresa con un estado de salida de cero (sin errores) mientras **; ** permite ejecutar el siguiente comando independientemente de su estado de salida – earthmeLon

+0

También vale la pena señalar que se permite una nueva línea en la cadena donde tiene un punto y coma. (Sí, [las cadenas regulares pueden abarcar varias líneas en 'sh'] (http://stackoverflow.com/a/9140181/874188) y derivadas, sin ninguna sintaxis adicional.) – tripleee

3

Si desea dividir sus comandos a través de múltiples líneas en aras de la legibilidad, también puede pasar la lista de comandos al comando bash de la siguiente manera:

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