通过 ssh 使用 heredoc 在本地保存远程变量

Saving a remote variable locally with heredoc through ssh

提问人:flyingdutchman 提问时间:12/18/2022 最后编辑:flyingdutchman 更新时间:12/18/2022 访问量:245

问:

我正在尝试在机器上远程运行本地函数,并在本地函数中检索此函数的多个变量的值。

heredoc 部分的第一行使我能够通过在远程机器上定义函数来远程运行该函数。

将本地计算机命名为“远程计算机”(Local Machine),将远程计算机命名为localmachremotemach

#! /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

换句话说,我需要存储在本地的远程 AND 数组的值。tmpResultarr

补遗: 这里我以命令为例,但实际上我正在“扫描”远程主机并生成存储在 tmpResult 变量中的 JSON 字符串。如果我在扫描过程中遇到问题,我会在 中附加一个字符串来解释问题。这样,在我的最终json中,我可以列出在扫描多个主机期间遇到的所有问题。hostnamearr

bash shell eof heredoc

评论


答:

1赞 Philippe 12/18/2022 #1

您需要收集命令的结果: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

评论

0赞 flyingdutchman 12/18/2022
我意识到我的问题不够准确。您的答案有效,但我实际上在扫描过程中遇到了一系列错误。因此,我需要获取变量值而不是收集结果。我将更新我的问题以包括这一点。
0赞 flyingdutchman 12/19/2022
非常感谢您的快速帮助!顺便说一句,我的 VIM 配色方案很挣扎,并且由于子 shell 调用“$(ssh [...])”而错误地解析了文件,这让我之前认为我的测试是错误的。
0赞 flyingdutchman 12/21/2022
快速跟进问题:如果我想获取ssh的返回值,或者是错误消息怎么办?