操作系统版本捕获脚本 - 使用 awk 时出现意外结果

Posted

技术标签:

【中文标题】操作系统版本捕获脚本 - 使用 awk 时出现意外结果【英文标题】:OS version capture script - unexpected results when using awk 【发布时间】:2020-03-27 12:34:41 【问题描述】:

我有一个如下的小 shell 脚本,用于登录多个服务器,以捕获目标服务器是使用 Redhat 还是 Ubuntu 作为操作系统版本。

#!/bin/ksh

if [ -f $HOME/osver.report.txt ];then
rm -rf $HOME/osver.report.txt
fi

for x in `cat hostlist`
do
OSVER=$(ssh $USER@$x "cat /etc/redhat-release 2>/dev/null || grep -i DISTRIB_DESCRIPTION /etc/lsb-release 2>/dev/null")
echo -e "$x \t\t $OSVER" >> osver.report.txt
done

但是,如果我尝试添加如下所示的 awk 并且服务器是 redhat 服务器,则上面的脚本可以正常工作...我在 osver.report.txt 中的结果将只显示主机名而没有操作系统版本。我玩过引用,但似乎没有任何效果。

 OSVER=$(ssh $USER@$x "cat /etc/redhat-release | awk 'print $1,$2,$6,$7' 2>/dev/null || grep -i DISTRIB_DESCRIPTION /etc/lsb-release 2>/dev/null")

如果我按照以下建议更改脚本:

#!/bin/bash

如果 [ -f $HOME/osver.report.txt ];那么 rm -rf $HOME/osver.report.txt 菲

cat hostlist 中的 x 做 操作系统=$( ssh $USER@$x bash /dev/null || grep -i DISTRIB_DESCRIPTION /etc/lsb-release 2>/dev/null EOF ) echo -e "$x \t\t $OSVER" >> osver.report.txt 完成

然后我收到以下错误: ./test.bash:第 9 行:寻找匹配的 `)' 时出现意外的 EOF ./test.bash:第 16 行:语法错误:文件意外结束

【问题讨论】:

【参考方案1】:

您遇到了引用问题。当您将带引号的命令传递给ssh 时,您实际上会失去一层引用(就像您将相同的参数传递给sh -c "...")。所以你在远程主机上运行的命令实际上是:

cat /etc/redhat-release | awk 'print ,,,' | grep -i DISTRIB_DESCRIPTION /etc/lsb-release

解决此问题的一种方法是将脚本通过管道传输到 shell,而不是将其作为参数传递:

OSVER=$(
ssh $USER@$x bash <<'EOF'
awk 'print "$1,$2,$6,$7"' /etc/redhat-release 2>/dev/null || 
grep -i DISTRIB_DESCRIPTION /etc/lsb-release 2>/dev/null
EOF
)

在此处使用&lt;&lt;'EOF' 会禁止此处文档中的任何变量扩展...否则,$1 之类的表达式将在本地扩展。


更好的解决方案是研究 ansible 之类的东西,它具有内置的工具,用于 ssh 到主机组并收集有关它们的事实,包括分发版本信息。

【讨论】:

不应该是'print $1,$2,$6,$7'吗? 谢谢 larsks。我对您的解决方案的一个问题是它似乎没有将结果写入文件。 嗯,不。它正在设置一个变量 ($OSVER),就像您在问题中发布的示例一样。

以上是关于操作系统版本捕获脚本 - 使用 awk 时出现意外结果的主要内容,如果未能解决你的问题,请参考以下文章

将 Moment js 与 ASP 5/MVC6 一起使用时出现“未捕获的 SyntaxError:意外的令牌导入”

Bash & awk:尝试在 awk 中使用 bash 脚本参数时出现分段错误

运行 shell 脚本时出现“换行符”意外

awk脚本切割数据库8.0命令结果时出现报错

SQLCL - 引用文件中存在 SQL 错误时出现意外 Java 异常

通过 Google 表格解析时出现“JavaScript 运行时意外退出”错误