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
read
emwhile
-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 aet
seguido 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