You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在本地脚本中存储远程服务器命令输出为变量?

如何在本地脚本中捕获远程SSH命令的输出到变量?

当然可以实现,但你的示例脚本里有个容易踩的坑——你现在写的$(command)会在本地执行,而不是远程服务器上。我给你梳理几种靠谱的实现方式:

1. 直接捕获单条远程命令的输出到本地变量

这是最直观的方式,把远程命令作为SSH的参数,整个SSH命令的输出会被捕获到本地变量中:

#!/bin/bash
# 捕获远程主机名到本地变量
remote_hostname=$(ssh remote@hostname "hostname")
# 捕获远程根目录磁盘使用率到本地变量
disk_usage=$(ssh remote@hostname "df -h / | grep -v Filesystem | awk '{print \$5}'")

echo "远程主机名:$remote_hostname"
echo "根目录使用率:$disk_usage"

注意:如果远程命令里包含管道、引号这类特殊字符,要确保正确转义,或者用单引号包裹整个远程命令。

2. 执行多条远程命令并处理远程变量

如果需要在远程服务器上先定义变量、执行多步逻辑,再把结果传回本地,有两种实用方式:

方式A:用带单引号的Here文档

把远程要执行的脚本放在Here文档里,并且给EOF加上单引号,这样本地shell不会解析文档里的$()或变量,会原封不动传给远程执行:

#!/bin/bash
# 远程执行多条命令,同时在远程端定义变量
ssh remote@hostname <<'EOF'
# 这些变量是在远程服务器上创建的
remote_var1=$(command1)
remote_var2=$(command2)
remote_var3=$(command3)

# 在远程端使用这些变量,比如输出结果(会被本地SSH捕获)
echo "命令1输出:$remote_var1"
echo "命令2输出:$remote_var2"
EOF

方式B:将远程变量结果打包传回本地

如果需要把远程的多个变量分别存到本地变量里,可以让远程输出格式化的键值对,再在本地解析:

#!/bin/bash
# 远程执行命令,输出键值对格式的结果
remote_output=$(ssh remote@hostname <<'EOF'
var1=$(command1)
var2=$(command2)
# 输出用分号分隔的键值对
echo "var1=$var1;var2=$var2"
EOF
)

# 本地解析结果,把远程的变量赋值到本地
eval "$remote_output"

# 现在可以直接使用本地的var1、var2
echo "远程command1的输出:$var1"
echo "远程command2的输出:$var2"

为什么你的原脚本不对?

你原来的写法:

ssh remote@hostname << EOF
variable=$(command1)
variable=$(command2)
EOF

这里的$(command1)会被本地shell先解析,替换成本地执行command1的输出,再把这个结果传给远程服务器,完全不是你想要的“远程执行command1并赋值”。解决办法要么给EOF加单引号(<<'EOF'),要么转义$为\$(比如variable=\$(command1))。

内容的提问来源于stack exchange,提问作者Rockie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:06:51