jackcsprat
jackcsprat

Reputation: 43

OS version capture script - unexpected results when using awk

I have a small shell script as follows that I am using to login to multiple servers to capture whether the target server is using Redhat or Ubuntu as the OS version.

#!/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

The above script works, however, if I attempt to add in some awk as shown below and the server is a redhat server...my results in the osver.report.txt will only show the hostname and no OS version. I have played around with the quoting, but nothing seems to work.

 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")

If I change the script as suggested to the following:

#!/bin/bash

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

for x in cat hostlist do 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 done

Then I get the following errors: ./test.bash: line 9: unexpected EOF while looking for matching `)' ./test.bash: line 16: syntax error: unexpected end of file

Upvotes: 0

Views: 97

Answers (1)

larsks
larsks

Reputation: 311516

You're suffering from a quoting problem. When you pass a quoted command to ssh, you effectively lose one level of quoting (as if you passed the same arguments to sh -c "..."). So the command that you're running on the remote host is actually:

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

One way of resolving this is to pipe your script into a shell, rather than passing it as arguments:

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
)

The use of <<'EOF' here inhibits any variable expansion in the here document...without that, expressions like $1 would be expanded locally.


A better solution would be to look into something like ansible which has built-in facilities for sshing to groups of hosts and collecting facts about them, including distribution version information.

Upvotes: 0

Related Questions