#bash #shell #scripting #mikrotik
#bash #оболочка #сценарии #микротик
Вопрос:
Я пишу простой скрипт, который уведомляет меня всякий раз, когда на моем маршрутизаторе Mikrotik доступно новое обновление прошивки. Команда RouterOS для этой цели:
ssh myrouter system package update print
И когда он запускается нормально, он работает нормально, показывая что-то вроде этого:
channel: stable
installed-version: 6.48
latest-version: 6.48.1
status: New version is available
Полная команда, которую я использую только для получения соответствующей информации, поэтому запускается уведомление:
ssh -q myrouter system package update print |tail -2 |head -1 |sed "s/: /n/" |tail -1
Что приводит к этому, когда оно выполняется «как есть» (ни внутри скрипта, ни чего-либо еще):
New version is available
Однако, похоже, я не могу разобрать этот текст внутри простого if
оператора, независимо от того, манипулирую ли я им напрямую или сначала перенаправляю его в локальный файл:
UPDATES_AVAILABLE=$(ssh myrouter system package update print |tail -2 |head -1 |cut -d: -f2)
if [[ "$(echo ${UPDATES_AVAILABLE})" == "New version is available" ]]; then
echo "INFO: New firmware version is available"
fi
Этот последний всегда не возвращает содержимого, независимо от того, выполняется ли он внутри скрипта или непосредственно в оболочке.
Чего мне не хватает?
Ответ №1:
О, неважно, я только что все починил.
После перенаправления вывода в /tmp/mikrotik.tmp
файл я просто подумал о запуске:
file /tmp/mikrotik.tmp
И затем я увидел, что он вернул это:
mikrotik: ASCII text, with CRLF line terminators
Итак, как только я добавил | dos2unix
в свою команду string filter, она просто начала работать, как ожидалось, и теперь это:
UPDATES_AVAILABLE=$(ssh myrouter system package update print |dos2unix |tail -2 |head -1 |cut -d: -f2)
if [[ "$(echo ${UPDATES_AVAILABLE})" == "New version is available" ]]; then
echo "INFO: New firmware version is available"
fi
Возвращается правильно:
INFO: New firmware version is available