Lokale/Remote-ls

Lokale/Remote-ls

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 scpfunktioniert. 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 -tErgebnisse 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 zshdie drei Dateien mit dem aktuellsten Änderungszeitstempel und den *trap.cvsim 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 omsortiert nach abnehmendem Änderungszeitstempel. [1,3]Gibt nur die ersten drei Übereinstimmungen zurück (oder weniger, wenn es weniger Übereinstimmungen gibt).

Wenn Sie also die zshShell 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 grepnach der IP-Adresse gesucht, die $ipAddressin den drei zuletzt geänderten Dateien auf dem Remote-System gespeichert ist.

Die mit verwendeten Flags grepfü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.123nicht mit übereinstimmt 23.123.123.1).

verwandte Informationen