提问人:flyingdutchman 提问时间:12/18/2022 最后编辑:flyingdutchman 更新时间:12/18/2022 访问量:245
通过 ssh 使用 heredoc 在本地保存远程变量
Saving a remote variable locally with heredoc through ssh
问:
我正在尝试在机器上远程运行本地函数,并在本地函数中检索此函数的多个变量的值。
heredoc 部分的第一行使我能够通过在远程机器上定义函数来远程运行该函数。
将本地计算机命名为“远程计算机”(Local Machine),将远程计算机命名为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
换句话说,我需要存储在本地的远程 AND 数组的值。tmpResult
arr
补遗:
这里我以命令为例,但实际上我正在“扫描”远程主机并生成存储在 tmpResult 变量中的 JSON 字符串。如果我在扫描过程中遇到问题,我会在 中附加一个字符串来解释问题。这样,在我的最终json中,我可以列出在扫描多个主机期间遇到的所有问题。hostname
arr
答:
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的返回值,或者是错误消息怎么办?
评论