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



我有一个小的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 tt $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 fi

对于 x 在cat hostlist做 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学位 ) echo -e "$x \t\t $OSVER">> osver.report.txt 做

然后我收到以下错误: ./test.bash:第 9 行:查找匹配的 '(' 时意外的 EOF。 ./test.bash:第 16 行:语法错误:文件意外结尾

您遇到了引用问题。 当你把一个带引号的命令传递给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
)

在此处使用<<'EOF'会抑制此处文档中的任何变量扩展...如果没有它,像$1这样的表达式将在本地扩展。


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

最新更新