我有一个小的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 server...my,则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
对于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行:语法错误:意外的文件结尾
发布于 2019-12-03 05:46:52
你遇到了一个引用问题。当您将一个带引号的命令传递给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'禁止在here document...without中的任何变量扩展,像$1这样的表达式将在本地扩展。
一个更好的解决方案是研究像ansible这样的东西,它有内置的工具,可以sshing到主机组,并收集关于它们的事实,包括分发版本信息。
https://stackoverflow.com/questions/59146681
复制相似问题