Локальный/удалённый ls

Локальный/удалённый ls

Я хочу извлечь соответствующие строки из SNMP-логера в режиме реального времени и переместить их на мой сервер приложений для проверки. Вторая половина в порядке, scpона делает свое дело. Первая половина вызывает у меня некоторые огорчения.

Я хочу проверить три последних файла журнала на наличие соответствующих сообщений. Поэтому я бы сделал: [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

И это здорово, потому что затем я планирую:

[user@SNMPServer]$ grep $ipAddress $files

Опять же, все отлично работает, когда я запускаю его на SNMP-сервере.

Когда я делаю это из своей виртуальной машины, однако,
admin@alarmux:~$sudo ssh [email protected] "cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files"

Я получаю такой вывод:
assets bash: testerlog: command not found bash: count.txt: command not found

Это ls -tрезультаты из домашнего каталога моей виртуальной машины, а не удаленного. Я где-то пропустил символы экранирования?

решение1

Обратные кавычки и $( … )интерполяция внутри двойных кавычек. Используйте одинарные кавычки, и это сработает.

sudo ssh [email protected] 'cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files'

Или вообще избегайте подоболочки с помощью xargs:

sudo ssh [email protected] 'ls -td /var/opt/OV/log/nnm/* | grep -m 3 trap.csv | xargs grep '$ipAddress

решение2

С помощью zshоболочки три файла с самой последней меткой времени изменения, с совпадающими именами файлов *trap.cvsв /var/opt/OV/log/nnmкаталоге, будут иметь шаблон

/var/opt/OV/log/nnm/*trap.cvs(.om[1,3])

где (...)изменяет поведение предыдущего шаблона. .выбирает только обычные файлы (не имена каталогов и т. д.) и omупорядочивает по убыванию временной метки модификации. [1,3]Возвращает только первые три совпадения (или меньше, если совпадений меньше).

Итак, если у вас zshустановлена ​​оболочка на удаленной машине, вы сможете сделать следующее:

ssh [email protected] zsh -c 'grep -wF "$1" /var/opt/OV/log/nnm/*trap.cvs(.om[1,3])' zsh "$ipAddress"

Это запустит grepпоиск IP-адреса, хранящегося $ipAddressв трех последних измененных файлах на удаленной системе.

Флаги, используемые с , grepзаставляют его использовать сравнение строк, а не сопоставление с регулярными выражениями (то есть -F), и требуют, чтобы совпадающая строка была полным словом (то есть -w; , поэтому оно 123.123.123.123не сопоставляется с 23.123.123.1).

Связанный контент