Текст, выводимый из SSH-соединения с устройством Mikrotik, не может быть правильно прочитан bash?

#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