操作系统版本捕获脚本 - 使用 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
)
在此处使用<<'EOF'
会禁止此处文档中的任何变量扩展...否则,$1
之类的表达式将在本地扩展。
更好的解决方案是研究 ansible 之类的东西,它具有内置的工具,用于 ssh 到主机组并收集有关它们的事实,包括分发版本信息。
【讨论】:
不应该是'print $1,$2,$6,$7'
吗?
谢谢 larsks。我对您的解决方案的一个问题是它似乎没有将结果写入文件。
嗯,不。它正在设置一个变量 ($OSVER
),就像您在问题中发布的示例一样。以上是关于操作系统版本捕获脚本 - 使用 awk 时出现意外结果的主要内容,如果未能解决你的问题,请参考以下文章
将 Moment js 与 ASP 5/MVC6 一起使用时出现“未捕获的 SyntaxError:意外的令牌导入”
Bash & awk:尝试在 awk 中使用 bash 脚本参数时出现分段错误