^ erro de sintaxe no awk quando chamado via ssh

^ erro de sintaxe no awk quando chamado via ssh

Estou executando o comando de uso do sistema de arquivos para detectar /varo 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 sshgera 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 $4no awkprograma 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, $4está o quarto parâmetro posicional, que provavelmente está vazio. Isso significa que o $4no awkcódigo será substituído por uma string vazia, produzindo um awkprograma inválido.

Neste caso, não há necessidade de executar o awkcomando 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 awkcódigo para olhar $5na linha 2, em vez de em $4todas as linhas, pois é aqui que a porcentagem geralmente está localizada. Além disso, removi a -hopção porque dfnã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 forcabeç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.

informação relacionada