Ejecutar script remoto con valor de parámetro local


8

¿Cómo puedo automatizar esta tarea?

1) Estás en A. 2) Entras en B. 3) Ejecutas un script en B, que necesita un parámetro conocido en A.

Primero, pensé que tal vez podría enviar el valor cuando abrí la conexión con ssh. Luego, probablemente más simple, entre 1) y 2), scp todo el script a la misma ubicación en B (reemplazando el anterior). Pero aún así, ¿cómo ejecuto el script en B? (Es decir, cómo automatizar ese último paso. Por supuesto, podría ejecutarlo manualmente después de ssh).

Otro pensamiento, tal vez descartar ssh por completo: tengo una página web en B, entonces, ¿podría el script de alguna manera ser invocado a través de una interfaz web "bajo el capó"?

¿O lo harías de una manera completamente diferente?


Respuestas:


11
myparameter=foobar
ssh user@server "myscript $myparameter"

Esto se ejecutará myscript foobaren el servidor.


¡Simple como eso! Funciona genial. (Tuve que poner un "./" antes del nombre del script porque de lo contrario se buscaba ~/.elm/aliases).
Emanuel Berg

66
Como pequeña advertencia, el uso de comillas dobles ( ") en lugar de simples ( ') es importante aquí. El uso de double significa que el shell en su máquina local expandirá la variable y luego ejecutará el sshcomando. Si se usaran los únicos, el shell local no tocaría el comando, que se envía textualmente pero aún se expande en el shell remoto.
Tilo Wiklund

3
Tenga en cuenta que si $myparametercontiene espacios, se dividirá en el lado del servidor. Bash printftiene un %qformato que puedes usar. Tengo un código de ejemplo, pero no cabe aquí. Crearé una nueva respuesta para ello.
janmoesen

7

(Este es un seguimiento de mi comentario sobre la respuesta aceptada ).

Tenga en cuenta que si $myparametercontiene espacios, se dividirá en el lado del servidor. El printf de Bash tiene un %qformato que puedes usar. Ejemplo:

$ myparameter='hello; rm somefile'
$ ssh user@server "echo $myparameter"
hello
rm: cannot remove `somefile': No such file or directory

$ ssh user@server "echo $(printf '%q' "$myparameter")"
hello; rm somefile

1

Si es seguro asumir que $myparameterva a no contener comillas simples (de lo contrario ver aquí o utilice la printf '%q' ...solución mediante janmoesen), puede simplemente hay que poner comillas simples $myparameterpara evitar el problema de Split-on-espacio en el lado del servidor.

myparameter="foo \" bar"
#myparameter="foo \" ' bar"

ssh localhost "set -xv; printf '%s\n' myscript '${myparameter}'"
ssh localhost "set -xv; echo $(set -xv; printf '%q' "$myparameter")"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.