Shell脚本:通过ssh从脚本运行函数

时间:2014-02-28 23:15:10

标签: linux bash shell sh

有没有聪明的方法可以通过ssh在远程主机上运行本地Bash功能?

例如:

#!/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

是的,我知道它不起作用,但有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:78)

您可以使用typeset命令通过ssh在远程计算机上使用您的功能。根据您希望如何运行远程脚本,有几个选项。

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

要在远程主机上使用该功能:

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

更好的是,为什么要麻烦管道:

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

或者您可以使用HEREDOC:

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

如果您想发送脚本中定义的所有功能,而不仅仅是myfn,请使用typeset -f,如下所示:

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

<强>解释

typeset -f myfn将显示myfn

的定义

cat将接收函数的定义作为文本,$()将在当前shell中执行它,它将成为远程shell中的已定义函数。最后,可以执行该功能。

最后一个代码将在ssh执行之前将函数的定义放入内联。

答案 1 :(得分:5)

我个人不知道你问题的正确答案,但是我有很多安装脚本只能使用ssh复制自己。

让命令复制文件,加载文件功能,运行文件功能,然后删除文件。

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

答案 2 :(得分:3)

另一种方式:

#!/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打印函数

的定义