Você está tentando usar aspas simples em uma sequência de caracteres citada individualmente. A primeira cotação única interna, na mesma linha que o mount | awk | sort pipeline, encerrará a cotação única que é iniciada na linha ssh .
O erro real vem de awk . Ele recebe uma linha de comando parecida com {print ,,} (devido a $1 , $3 , $5 sendo expandida para strings vazias pelo shell de chamada e aspas simples estão ausentes neste ponto). Isso é interpretado como um programa awk com um erro de sintaxe (faltando } ) para ser executado em um arquivo chamado ,,} .
Eu recomendaria colocar o script em um arquivo de script real e executá-lo no host remoto, evitando problemas de cotação e permitindo que você crie um procedimento mais sustentável.
Além disso,
- Use
reademwhile-loop em vez de fazer umfor-loop sobre o resultado decat. - O script interno, em particular, carece de citações necessárias em vários lugares. Isto é necessário para que, e.
grep [0-9]não acionará a globalização de nomes de arquivo. -
grep eth*parece estranho. Você quis dizergrep -e 'eth.'? Além de agir como um padrão globbing de nome de arquivo que selecionaria qualquer nome no diretório atual que comece cometh, o padrão (se interpretado como uma expressão regular) corresponderia aetseguido por zero ou maish. / li> - Consulte Têm backticks (ou seja, 'cmd') shells in shuns foram depreciados? com relação ao uso de backticks.
Script modificado:
#!/bin/sh
now=$( date +%d%b%Y )
if [ -d output ]; then
echo 'Output directory missing' >&2
exit 1
fi
while read host; do
printf 'Collecting data from "%s"...\n' "$host"
ssh -n -o LogLevel=error -o ConnectTimeout=5 "$host" \
sh <<'END_SCRIPT' >output/"$host-$now"
echo '## HOSTNAME:'
hostname
echo '## FREE:'
free -g
echo '## NETSTAT:'
netstat -nr | grep '[0-9]' | tr 'a-z' 'A-Z'
echo '## MOUNT:'
mount | awk '{ print $1, $3, $5 }' | sort
echo '## IP:'
ip a s | grep -i 'eth.*'
END_SCRIPT
done <hosts.txt