首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作系统版本捕获脚本-使用awk时出现意外结果

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

Stack Overflow用户
提问于 2019-12-03 05:07:11
回答 1查看 39关注 0票数 0

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

代码语言:javascript
复制
#!/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 server...my,则osver.report.txt中的结果将只显示主机名,而不显示操作系统版本。我试着引用了一下,但似乎什么都没有用。

代码语言:javascript
复制
 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

对于cat hostlist中的x,执行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行:语法错误:意外的文件结尾

EN

回答 1

Stack Overflow用户

发布于 2019-12-03 05:46:52

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

代码语言:javascript
复制
cat /etc/redhat-release | awk '{print ,,,}' | grep -i DISTRIB_DESCRIPTION /etc/lsb-release

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

代码语言:javascript
复制
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'禁止在here document...without中的任何变量扩展,像$1这样的表达式将在本地扩展。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59146681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档