arrays - 通过 SSH 执行存储在关联数组中的 bash 命令,存储结果

标签 arrays linux bash shell ssh

对于不相关的大型项目,我需要从本地系统或远程系统收集系统统计信息。由于我以任何一种方式收集相同的统计信息,因此我通过将统计信息收集命令存储在 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 在远程系统上评估存储在关联数组中的命令,并将结果存储在本地脚本的数据结构中?

最佳答案

确保您存储在数组中的命令在分配数组时不会展开!

另请注意,在嵌套单引号时,必须使用外观复杂的引号样式。参见 this所以张贴解释。

stats_cmds=([total_ram]='free -m | awk '"'"'/^Mem:/{print $2}'"'"'')

然后只需启动您的 ssh 即可:

sh "$ssh_hostname" "${stats_cmds[total_ram]}"

(是的,我将你的变量名小写了,因为 Bash 中的大写变量名真的很恶心)。然后:

get_local_system_stats() {
    # Collect stats about local system
    complex_data_structure_that_doesnt_matter=$( ${stats_cmds[total_ram]} )
    # Many more similar calls here
}

get_remote_system_stats() {
    # Collect stats about remote system
    complex_data_structure_that_doesnt_matter=$(ssh "$ssh_hostname" "${stats_cmds[total_ram]}")
}

关于arrays - 通过 SSH 执行存储在关联数组中的 bash 命令,存储结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24334927/

相关文章:

c - 在C中查找具有唯一数字的数字

regex - 在正则表达式中使用带有换行符的 sed

linux - 使用 UBUNTU 和 arm-linux-gnueabi-gcc 为 ARM linux 交叉编译 JamVM - 缺少 zlib

git - 我需要手动获取 ~/.bashrc 以在我的命令提示符中显示和更新 GIT 分支

php - 数组迭代中的 echo 覆盖以前的 echo (PHP)

c - 数组索引方法一个棘手的案例

php - 替换 php 数组中的所有键

正则表达式从文件中提取多行

sh : 1 file not found error with system() command? 的原因在 StackOverflow 中尝试了可能的解决方案(如下所列)但失败

bash - 如何通过 bash 脚本连接到 ftp 服务器?