【发布时间】:2014-06-20 20:11:12
【问题描述】:
对于不相关的大型项目,我需要从本地系统或远程系统收集系统统计信息。由于我以任何一种方式收集相同的统计信息,因此我通过将收集统计信息的命令存储在 Bash 关联数组中来防止代码重复。
declare -A stats_cmds
# Actually contains many more key:value pairs, similar style
stats_cmds=([total_ram]="$(free -m | awk '/^Mem:/{print $2}')")
我可以像这样收集本地系统统计信息:
get_local_system_stats()
{
# Collect stats about local system
complex_data_structure_that_doesnt_matter=${stats_cmds[total_ram]}
# Many more similar calls here
}
我的脚本的先决条件是 ~/.ssh/config 的设置使得 ssh $SSH_HOSTNAME 在没有任何用户输入的情况下工作。我想要这样的东西:
get_remote_system_stats()
{
# Collect stats about remote system
complex_data_structure_that_doesnt_matter=`ssh $SSH_HOSTNAME ${stats_cmds[total_ram]}`
}
我已经尝试了单引号、双引号、反引号等我能想象到的所有组合。某些组合会导致 stats 命令过早执行 (bash: 7986: command not found),其他组合会导致语法错误,其他组合会返回 null(stats 命令周围的单引号),但没有一个将正确的结果存储在我的数据结构中。
如何通过 SSH 在远程系统上评估存储在关联数组中的命令,并将结果存储在本地脚本的数据结构中?
【问题讨论】:
-
这仍然是一个悬而未决的问题,我正在积极寻求答案。正如 gniourf_gniourif 的回答中的 cmets 中所述,它不支持远程和本地执行。
-
还开着吗? 2014 年 10 月添加的评论是否解决了您对先前答案的问题似乎尚未得到答复。
-
是的,它仍然开放。我正在使用基于两种解决方案组合的解决方法。 github.com/dfarrell07/wcbench/blob/master/wcbench.sh#L56-L82
-
Eww。再说一次,一定数量的“ewww”与该领域有关——在字符串中嵌入任意 shell 命令至少是中等程度的邪恶。我至少会考虑将它们封装在函数中——然后你可以直接在本地运行函数,或者使用
declare -f要求 shell 给你一个字符串,当评估时,它将远程定义它。 -
顺便说一句,您能否澄清如何该评论未能解决您的问题(以及为什么您仍需要该解决方法)?
标签: arrays linux bash shell ssh