^ error de sintaxis en awk cuando se llama a través de ssh

^ error de sintaxis en awk cuando se llama a través de ssh

Estoy ejecutando el comando de uso del sistema de archivos para detectar /varel uso del sistema de archivos más allá del 80% desde un host a varios hosts remotos.

Mi comando funciona bien ( df -h /var | awk '$1 > 80'), pero sshme da errores de sintaxis.

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

Respuesta1

El tema es que $4en el awkprograma forma parte de una cadena entre comillas dobles. Como está entre comillas dobles, el shell (local) lo expandirá antes de llamar ssh.

En el shell, $4está el cuarto parámetro posicional, que probablemente esté vacío. Esto significa que el $4código awkserá reemplazado por una cadena vacía, lo que producirá un awkprograma no válido.

En este caso, no es necesario ejecutar el awkcomando en el host remoto. En lugar de eso, simplemente haz

while IFS= read -r remote; do
    ssh -n -o BatchMode=yes "$remote" 'df /var' | awk 'FNR == 2 && $5 > 80'
done </etc/gridhosts

Tenga en cuenta que cambié el awkcódigo para que se mire $5en la línea 2 en lugar de en $4cada línea, ya que aquí es donde generalmente se ubica el porcentaje. Además, eliminé la -hopción porque dfno es necesaria y hice que el bucle lea el archivo de entrada línea por línea en lugar de expandir el contenido completo del archivo en un forencabezado de bucle (lo cual es poco elegante y podría, en (en el caso general, consume mucha memoria innecesariamente).

Quizás también le interese evaluar Ansible o software similar, ya que esto facilitaría mucho las operaciones en todo el clúster.

información relacionada