Bash函数经SSH远程执行后本地无法获取变量值的问题咨询
问题原因与解决方案
为什么本地CHECKRESULT变量无法更新?
你推测的完全正确:通过SSH执行的checkport函数运行在远程主机的独立shell进程中,远程定义的CHECKRESULT变量只存在于远程进程的内存空间里,和本地shell环境完全隔离,所以本地的CHECKRESULT不会被远程操作修改,自然始终保持原来的"ok"值。source在这里没用——source仅能在同一个shell环境中加载变量/脚本,跨SSH进程的场景下不适用。
解决方法
有两种常用的方式把远程执行的结果传递回本地:
方法1:捕获远程命令的输出结果
修改checkport函数,让它直接输出"ok"或"error"作为结果(可以把提示信息输出到标准错误,避免干扰结果捕获),然后本地通过命令替换捕获这个输出:
- 调整本地的
checkport函数:
function checkport { if nc -zv -w3 "$1" "$2" <<< '' &> /dev/null then echo -e "TCP-Port $1/$2 is open" >&2 # 提示信息输出到stderr,本地可直接看到 echo "ok" # 结果输出到stdout,供本地捕获 else echo -e "TCP-Port $1/$2 is closed" >&2 echo "error" fi }
- 本地执行SSH并捕获结果:
CHECKRESULT=$(ssh -q "$host" "$(declare -f checkport); checkport $someotherhost ${Ports[$i]}") # 后续判断逻辑 if [ "$CHECKRESULT" = "ok" ]; then # 端口开放时的处理 else # 端口关闭时的处理 fi
方法2:利用SSH的退出状态码
远程执行完checkport后,根据CHECKRESULT的值设置命令的退出码,本地直接通过SSH命令的退出状态判断结果:
if ssh -q "$host" "$(declare -f checkport); checkport $someotherhost ${Ports[$i]} &> /dev/null; [ \"\$CHECKRESULT\" = \"ok\" ]"; then # 端口开放时的处理 else # 端口关闭时的处理 fi
注意:这里要转义$CHECKRESULT的$符号(写成\$CHECKRESULT),避免本地shell提前替换这个变量。
内容的提问来源于stack exchange,提问作者Buffalosoldier
相关产品推荐
相关产品推荐

