Ich möchte relevante Zeilen in Echtzeit aus einem SNMP-Logger abrufen und sie zur Überprüfung auf meinen Anwendungsserver übertragen. Die zweite Hälfte ist in Ordnung und scp
funktioniert. Die erste Hälfte bereitet mir einige Probleme.
Ich möchte die letzten drei Protokolldateien auf relevante Meldungen überprüfen. Ich würde also Folgendes tun:
[user@SNMPServer]$ cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files
trap.csv trap.csv.2019-05-31_07_00_01 trap.csv.2019-05-31_06_00_01
Das ist großartig, denn dann habe ich vor:
[user@SNMPServer]$ grep $ipAddress $files
Das funktioniert wiederum einwandfrei, wenn ich es auf dem SNMP-Server ausführe.
Wenn ich es jedoch von meiner VM aus mache,
admin@alarmux:~$sudo ssh [email protected] "cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files"
Ich erhalte diese Ausgabe:
assets bash: testerlog: command not found bash: count.txt: command not found
Dies sind die ls -t
Ergebnisse aus dem Home-Verzeichnis meiner VM, nicht aus dem Remote-Verzeichnis. Fehlen mir irgendwo Escape-Zeichen?
Antwort1
Backquotes und $( … )
Interpolation innerhalb von doppelten Anführungszeichen. Verwenden Sie einfache Anführungszeichen, dann funktioniert es.
sudo ssh [email protected] 'cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files'
Oder vermeiden Sie die Untershell vollständig mit xargs:
sudo ssh [email protected] 'ls -td /var/opt/OV/log/nnm/* | grep -m 3 trap.csv | xargs grep '$ipAddress
Antwort2
Mit der Shell würden zsh
die drei Dateien mit dem aktuellsten Änderungszeitstempel und den *trap.cvs
im Verzeichnis übereinstimmenden Dateinamen mit dem Muster/var/opt/OV/log/nnm
/var/opt/OV/log/nnm/*trap.cvs(.om[1,3])
wobei (...)
das Verhalten des vorhergehenden Musters geändert wird. .
Wählt nur normale Dateien aus (keine Verzeichnisnamen usw.) und om
sortiert nach abnehmendem Änderungszeitstempel. [1,3]
Gibt nur die ersten drei Übereinstimmungen zurück (oder weniger, wenn es weniger Übereinstimmungen gibt).
Wenn Sie also die zsh
Shell auf dem Remote-Computer installiert haben, können Sie Folgendes tun:
ssh [email protected] zsh -c 'grep -wF "$1" /var/opt/OV/log/nnm/*trap.cvs(.om[1,3])' zsh "$ipAddress"
Dadurch wird grep
nach der IP-Adresse gesucht, die $ipAddress
in den drei zuletzt geänderten Dateien auf dem Remote-System gespeichert ist.
Die mit verwendeten Flags grep
führen dazu, dass Zeichenfolgenvergleiche anstelle von Übereinstimmungen mit regulären Ausdrücken verwendet werden (das ist -F
), und es ist erforderlich, dass die übereinstimmende Zeichenfolge ein vollständiges Wort ist (das ist -w
;, sodass das 123.123.123.123
nicht mit übereinstimmt 23.123.123.1
).