^ Syntaxfehler in awk beim Aufruf über ssh

^ Syntaxfehler in awk beim Aufruf über ssh

Ich führe einen Befehl zur Dateisystemnutzung aus, um /vareine Dateisystemnutzung über 80 % von einem Host auf mehreren Remote-Hosts zu erkennen.

Mein Befehl läuft einwandfrei ( df -h /var | awk '$1 > 80'), aber ssher verursacht Syntaxfehler.

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

Antwort1

Das Problem besteht darin, dass $4im awkProgramm Teil einer Zeichenfolge in doppelten Anführungszeichen ist. Da es in doppelten Anführungszeichen steht, wird die (lokale) Shell es erweitern, bevor es aufgerufen wird ssh.

In der Shell $4ist dies der vierte Positionsparameter, der höchstwahrscheinlich leer ist. Das bedeutet, dass $4im awkCode durch eine leere Zeichenfolge ersetzt wird, wodurch ein ungültiges awkProgramm entsteht.

In diesem Fall ist es nicht notwendig, den Befehl auf dem Remote-Host auszuführen awk. Führen Sie stattdessen einfach Folgendes aus:

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

awkBeachten Sie, dass ich den Code so geändert habe, dass $5in Zeile 2 nach at gesucht wird, anstatt $4in jeder Zeile nach at, da sich hier normalerweise der Prozentsatz befindet. Außerdem habe ich die -hOption for entfernt df, da sie nicht benötigt wird, und ich habe die Schleife so eingestellt, dass sie die Eingabedatei Zeile für Zeile liest, anstatt den gesamten Inhalt der Datei in einem forSchleifenkopf zu erweitern (was unelegant ist und im Allgemeinen unnötig viel Speicher verbrauchen könnte).

Möglicherweise möchten Sie auch Ansible oder eine ähnliche Software testen, da dies clusterweite Vorgänge erheblich vereinfachen würde.

verwandte Informationen