Is there any clever way to run a local Bash function on a remote host over ssh?
For example:
#!/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
Yeah, I know it doesn’t work, but is there a way to achieve this?
Advertisement
Answer
You can use the typeset
command to make your functions available on a remote machine via ssh
. There are several options depending on how you want to run your remote script.
#!/bin/bash # Define your function myfn () { ls -l; }
To use the function on the remote hosts:
typeset -f myfn | ssh user@host "$(cat); myfn" typeset -f myfn | ssh user@host2 "$(cat); myfn"
Better yet, why bother with pipe:
ssh user@host "$(typeset -f myfn); myfn"
Or you can use a HEREDOC:
ssh user@host << EOF $(typeset -f myfn) myfn EOF
If you want to send all the functions defined within the script, not just myfn
, just use typeset -f
like so:
ssh user@host "$(typeset -f); myfn"
Explanation
typeset -f myfn
will display the definition of myfn
.
cat
will receive the definition of the function as a text and $()
will execute it in the current shell which will become a defined function in the remote shell. Finally the function can be executed.
The last code will put the definition of the functions inline before ssh execution.