因此,我正在尝试使用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"
来解决该问题
答案 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
放置到需要的每台服务器上的标准位置,可能会更好。