编写脚本不是我的强项,但我正在努力学习。
尝试从主服务器的远程系统上提取 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
(和egrep
、fgrep
等)来使匹配不区分大小写,这意味着我不需要事先知道大小写
因此考虑到以上情况:
for i in $( cat /home/file_with_hostnames ); do ssh -q $i "echo "$( hostname ) $( date ) $( dmidecode --string system-product-name )" "; done
我希望这能有所帮助,如果我说错了,请对我宽容一点,这是我的第一篇正式帖子,
缺口
PS 我老眼昏花,以为你的帖子发表于 2023 年,现在我意识到已经快一年了,你可能已经从这件事中走出来,积累了更多的脚本编写经验。
唉,就在我以为我找到了一篇可以实际上答案:)
我会把它留在这里,希望它能够帮助其他人。