如何通过SSH Heredoc远程执行函数并同步远程变量至本地
问题:远程执行Bash函数后同步变量到本地
需求:在远程主机remotemach上运行本地定义的Bash函数scanHost,并将该函数执行后生成的数组变量arr与普通变量tmpResult的值同步回本地主机localmach。
原脚本
#! /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
补充说明:示例中用hostname命令演示,实际场景为远程主机扫描,扫描结果存入tmpResult(JSON格式),扫描异常信息追加至arr,用于汇总多主机扫描问题。
解决方案
原脚本的问题在于,ssh是独立子进程,远程执行的变量无法直接同步回本地。需要让远程端执行完函数后,将变量内容输出到标准输出,再由本地捕获并解析赋值。
修改后的脚本如下:
#!/bin/bash arr=() scanHost() { arr+=("$(hostname)") tmpResult=$(hostname) } # 本地执行函数 scanHost # 远程执行函数并获取输出的变量内容 remote_output=$(ssh user@remotemach "bash -s --" <<EOF $(typeset -f scanHost) # 初始化远程arr为本地当前数组内容 arr=(${arr[@]}) tmpResult=$tmpResult scanHost # 转义输出数组元素,避免特殊字符解析错误 printf "%q " "\${arr[@]}" echo # 转义输出tmpResult printf "%q" "\$tmpResult" EOF ) # 解析远程输出,更新本地变量 read -r remote_arr <<< "$(echo "$remote_output" | head -n1)" read -r remote_tmpResult <<< "$(echo "$remote_output" | tail -n1)" arr=($remote_arr) tmpResult=$remote_tmpResult echo "Local array -> ${arr[@]}" echo "Local echo -> $tmpResult"
关键说明
- 远程变量初始化:远程端先将
arr初始化为本地当前的数组内容,确保函数执行时是在本地数组基础上追加元素。 - 安全输出处理:用
printf "%q"对变量内容转义,避免空格、引号、JSON特殊字符等导致的解析错误。 - 本地解析赋值:将远程输出按行拆分,分别赋值给本地变量,完成同步。
内容的提问来源于stack exchange,提问作者flyingdutchman
相关产品推荐
相关产品推荐

