Script de shell: ejecuta la función desde el script sobre ssh

¿Hay alguna manera inteligente de ejecutar una función Bash local en un host remoto a través de ssh?

Por ejemplo:

#!/bin/bash #Definition of the function f () { ls -l; } #I want to use the function locally f #Execution of the function on the remote machine. ssh user@host f #Reuse of the same function on another machine. ssh user@host2 f 

Sí, sé que no funciona, pero ¿hay alguna manera de lograr esto?

Puede usar el comando typeset para hacer que sus funciones estén disponibles en una máquina remota a través de ssh . Hay varias opciones según cómo quiera ejecutar su script remoto.

 #!/bin/bash # Define your function myfn () { ls -l; } 

Para usar la función en los hosts remotos:

 typeset -f myfn | ssh user@host "$(cat); myfn" typeset -f myfn | ssh user@host2 "$(cat); myfn" 

Mejor aún, ¿por qué molestarse con la tubería?

 ssh user@host "$(typeset -f myfn); myfn" 

O puede usar un HEREDOC:

 ssh user@host << EOF $(typeset -f myfn) myfn EOF 

Si desea enviar todas las funciones definidas en el script, no solo myfn , simplemente use typeset -f como myfn :

 ssh user@host "$(typeset -f); myfn" 

Explicación

typeset -f myfn mostrará la definición de myfn .

cat recibirá la definición de la función como texto y $() lo ejecutará en el shell actual que se convertirá en una función definida en el shell remoto. Finalmente la función puede ser ejecutada.

El último código pondrá la definición de las funciones en línea antes de la ejecución de ssh.

Personalmente no conozco la respuesta correcta a su pregunta, pero tengo muchas secuencias de comandos de instalación que solo se copian a sí mismas sobre el uso de ssh.

Haga que el comando copie el archivo, cargue las funciones del archivo, ejecute las funciones del archivo y luego elimine el archivo.

 ssh user@host "scp user@otherhost:/myFile ; . myFile ; f ; rm Myfile" 

De otra manera:

 #!/bin/bash # Definition of the function foo () { ls -l; } # Use the function locally foo # Execution of the function on the remote machine. ssh user@host "$(declare -f foo);foo" 

declare -f foo imprimir la definición de función