我需要通过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
。
答案 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