通过 SSH 获取 dmidecode 信息,并将信息保存到包含主机名条目的本地文件中

通过 SSH 获取 dmidecode 信息,并将信息保存到包含主机名条目的本地文件中

编写脚本不是我的强项,但我正在努力学习。

尝试从主服务器的远程系统上提取 dmidecode 信息,特别是 dmidecode 输出中的“产品”,并将信息保存到服务器上的本地文件中,每个条目都由通过 SSH 访问的远程主机名记录。

这是我目前脚本中的内容:

for i in `{cat /home/file_with_hostnames}`; do ssh $i "dmidecode | grep Prod"; done

当我运行上述程序时,我会得到服务器标准输出上“file_with_hostnames”中每个条目的如下输出:

Product Name: Elo AiO

Product Name: Elo AiO

Product Name: Elo AiO

但是,每个条目都没有注明所连接的主机名,该主机名是从文件 /home/file_with_hostnames 读取的。我希望将我提取的信息存储在一个文件中,并运行 dmidecode | grep Prod 命令,以记录所连接的每台计算机的名称。

例如,我希望信息看起来像这样:

PC1 - Product Name: Elo AiO

PC2 - Product Name: Elo AiO

等等...如 /home/file_with_hostnames 文件所示。

时间戳并不是那么重要,但如果也可以包括在内,那就太好了。

答案1

欢迎来到“奇妙的脚本世界”。

最快的答案是从传递给 ssh 的字符串中回显主机名、日期和 dmidecode 的输出:

for i in `{cat /home/file_with_hostnames}`; do ssh $i "echo "`hostname` `date` `dmidecode | grep Prod`" "; done
  • 您可以在命令之间使用其他字符(例如分号)来帮助解析输出
  • 令我惊讶的是,它遵循内外双引号对的顺序("),通常这样的构造需要对内部双引号对进行转义(\")。

我不知道为什么你在命令{...}周围使用cat,当我尝试该格式(总是愿意发现新事物)时它返回-bash: {cat: command not found,然后我意识到我假设你正在使用 Bash,这是我的错,我的建议,如下,可能不起作用,抱歉。

以下这些事情可能会让你的生活更轻松:

  • 我认为,使用格式而不是反引号执行命令的新方法$( ... )更简单,并且允许嵌套。命令字符串前后的空格只是我的个人偏好
  • 使用,这-q意味着ssh“安静”并停止显示任何横幅,这不是必需的,但有助于使输出更易于阅读
  • dmidecode接受将输出特定信息的参数,从而避免Prod从其他硬件获取行(就像我在测试时所做的那样):,dmidecode --string system-product-name手册页显示了您可以使用的其他字符串
  • 另一个个人偏好是,我总是使用-i命令grep(和egrepfgrep等)来使匹配不区分大小写,这意味着我不需要事先知道大小写

因此考虑到以上情况:

for i in $( cat /home/file_with_hostnames ); do ssh -q $i "echo "$( hostname ) $( date ) $( dmidecode --string system-product-name )" "; done

我希望这能有所帮助,如果我说错了,请对我宽容一点,这是我的第一篇正式帖子,

缺口

PS 我老眼昏花,以为你的帖子发表于 2023 年,现在我意识到已经快一年了,你可能已经从这件事中走出来,积累了更多的脚本编写经验。
唉,就在我以为我找到了一篇可以实际上答案:)
我会把它留在这里,希望它能够帮助其他人。

相关内容