将方法传递给heredocs

时间:2015-08-12 11:04:29

标签: bash shell ssh heredoc

我需要通过ssh在大量主机上调用一些代码。

我尝试使用所谓的heredocs

function verifyFiles {
    ...
}

...

ssh user@$server <<-SSH
    cd $DIRECTORY
    verifyFiles
    createSum
    copyFiles
SSH

ssh user@server2 <<-SSH
    cd $DIRECTORY
    verifyFiles
    verifySums
SSH
...

不幸的是,在服务器端不知道以这种方式使用的函数。

是否有一种优雅的方式来使用这些功能而不将它们粘贴到每个heredoc

PS。每个主机上的代码调用略有不同,但使用相同的功能集。我真的希望在代码中拥有每个方法定义的一个副本。

PS2。当然,如果有更好的方法来调用此代码,我不必使用heredocs

3 个答案:

答案 0 :(得分:1)

如果你有一个本地函数fooX可以在每个hostX上远程执行,你可以在相应的主机上通过ssh定义并执行它,如下所示:

#!/bin/bash

function foo1() {
    echo foo
}

function foo2() {
    echo f0o
}

function remotefn() {
    # echo the function definition:
    type "$1" | tail -n +2
    # echo the function call:
    echo "$1"
}

while read user host fn
do
    # remotely execute function definition and the function itself:
    remotefn "$fn" | ssh "$user"@"$host"
done <<END
user1 host1 foo1
user2 host2 foo2
END

注意循环后的heredoc如何灵活地将函数映射到用户和主机。 ssh将读取并执行remotefn在相应主机上提供的每个函数定义和函数调用。

答案 1 :(得分:1)

这个怎么样?

funs='
  foo() { echo "foo"; }
  bar() { local a; for a in "$@"; do echo "$a"; done; }
'
# eval "$funs"  # if you want the functions locally as well
ssh user@$server1 <<-____HERE
    cd $DIRECTORY
    $funs
    foo && bar some args
____HERE

不是特别开心的解决方案,但我相信它符合您的要求。

答案 2 :(得分:0)

由于here-文档经历了各种扩展,您可以通过参数替换而不是函数调用来实现目标:

VERIFYFILES='ls; df'

ssh user@$server <<-SSH
    cd $DIRECTORY
    $VERIFYFILES
SSH