
Estou executando o comando de uso do sistema de arquivos para detectar /var
o uso do sistema de arquivos além de 80% de um host para vários hosts remotos.
Meu comando funciona bem ( df -h /var | awk '$1 > 80'
), mas ssh
gera erros de sintaxe.
for i in `cat /etc/gridhosts`; do ssh -n -o BatchMode=yes ${i} "df -h /var | awk '$4 > 80'" ; done
awk: > 80
awk: ^ syntax error
awk: > 80
awk: ^ syntax error
awk: > 80
Responder1
O problema é que $4
no awk
programa faz parte de uma string entre aspas duplas. Como está entre aspas duplas, o shell (local) irá expandi-lo antes de chamar ssh
.
No shell, $4
está o quarto parâmetro posicional, que provavelmente está vazio. Isso significa que o $4
no awk
código será substituído por uma string vazia, produzindo um awk
programa inválido.
Neste caso, não há necessidade de executar o awk
comando no host remoto. Em vez disso, basta fazer
while IFS= read -r remote; do
ssh -n -o BatchMode=yes "$remote" 'df /var' | awk 'FNR == 2 && $5 > 80'
done </etc/gridhosts
Observe que alterei o awk
código para olhar $5
na linha 2, em vez de em $4
todas as linhas, pois é aqui que a porcentagem geralmente está localizada. Além disso, removi a -h
opção porque df
não é necessária e fiz o loop ler o arquivo de entrada linha por linha, em vez de expandir o conteúdo completo do arquivo em um for
cabeçalho de loop (o que é deselegante e poderia, em o caso geral, consome muita memória desnecessariamente).
Você também pode estar interessado em avaliar o Ansible ou software semelhante, pois isso tornaria muito mais fácil realizar operações em todo o cluster.