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?

Emanuel Berg
fuente
También eche un vistazo a la declaración Ejecutar si en la máquina remota
Ulrich Dangel

Respuestas:

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

Esto se ejecutará myscript foobaren el servidor.

Michael Hampton
fuente
¡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
janmoesen
fuente
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")"
bagazo
fuente