我试图在一台机器上远程运行一个本地函数,并在本地函数中检索该函数的多个变量的值。
heredoc部分的第一行使我能够通过在远程机器上定义该函数来远程运行该函数。
本地机器名为localmach
,远程机器名为remotemach
#! /bin/bash
arr=()
scanHost()
{
arr+=("$(hostname)")
tmpResult=$(hostname)
}
scanHost
ssh user@remotemach "bash -s --" <<EOF
$(typeset -f scanHost)
tmpResult=$tmpResult
scanHost
EOF
echo "Local array -> ${arr[@]}"
echo "Local echo -> $tmpResult"
上面的代码片段返回
Local array -> localmach
Local echo -> localmach
但我需要的是
Local array -> localmach remotemach
Local echo -> remotemach
换句话说,我需要远程tmpResult
的值和本地存储的数组arr
。
附录:这里我以命令hostname
为例,但实际上我是在"扫描"。并生成一个JSON字符串,存储在tmpResult变量中。如果我在扫描过程中遇到问题,我在arr
中附加一个字符串来解释这个问题。这样,在最后的json中,我可以列出扫描多个主机时遇到的所有问题。
需要收集ssh
命令的结果:
#! /bin/bash
scanHost()
{
tmpResult=$(hostname)
}
scanHost
tmpResult=$(ssh user@remotemach "bash -s" <<EOF
$(typeset -f scanHost)
scanHost
echo "$tmpResult"
EOF
)
echo "Local echo -> $tmpResult"
新版本
#! /bin/bash
arr=()
scanHost()
{
arr+=("$(hostname)")
tmpResult=$(hostname)
}
scanHost
eval "$(ssh user@remotemach "bash -s" <<EOF
$(typeset -f scanHost)
$(declare -p arr)
scanHost
declare -p arr
declare -p tmpResult
EOF
)"
echo "Local array -> ${arr[@]}"
echo "Local echo -> $tmpResult"
eval
有副作用,请谨慎使用。