使用EOF在远程计算机上执行ssh时,如何在其他函数中调用函数?

时间:2018-07-21 17:52:00

标签: bash shell ssh scripting eof

因此,我正在尝试使用bash中的EOF在远程计算机上调用函数。 这是一个示例:

#!/bin/bash
other_func() {
c='This is it';
echo $c;
}
test_func() {
a='this is some random string'
ssh -i "somepemkey.pem" ubuntu@xx.xx.xx.xx << EOF
b='some random sting inside remote server';
echo $a;
echo \$b;
other_func
EOF
}
test_func

所以,现在我得到这个错误:other_func: command not found

我不想创建文件并在其中放置一个函数,然后将其复制到远程计算机中,然后在其中调用它。 我也不想将函数放在here document中。

在上面的示例中,可以在远程计算机中调用本地计算机中的变量,那么如何在远程计算机中调用本地函数?

为什么EOF无法理解远程计算机中的函数调用?

因此,我通过在ubuntu@xx.xx.xx.xx之后添加此行"$(declare -f other_func); export -f other_func"来解决该问题

1 个答案:

答案 0 :(得分:1)

由于ssh创建的远程Shell无法访问运行ssh的计算机上创建的变量或函数,因此它无法读取运行{{1]的服务器上的文件。 }}中的ssh会话中。您要在远程计算机上使用的任何本地内容都需要以一种或另一种方式复制到那里。

使用仅需要在远程计算机上执行的功能,将其琐碎地放在此处文档中即可。

ssh

对于在本地和远程都需要的功能,可以将其放在单独的文件中,然后以某种方式复制。

ssh user@remote  <<____EOF
    other_func() {
        c='This is it'
        # backslash required inside here doc
        # quoting should be fixed outside here doc, too
        echo "\$c"
    }
    other_func
____EOF

尽管如此,内联这样的函数还是很模糊的;只需将文件# make func available locally . path/to/func_def ssh user@remote <<____EOF # make func available remotely $(cat path/to/func_def) # and call it other_func ____EOF 放置到需要的每台服务器上的标准位置,可能会更好。