bash 无法正确读取从 SSH 连接到 Mikrotik 设备的文本输出?

问题描述

我正在编写一个简单的脚本,以便在我的 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

最后一个总是不返回任何内容,无论是在脚本中运行还是直接在 shell 中运行。

我错过了什么?

解决方法

哦,没关系,我刚刚修好了。

将输出重定向到 /tmp/mikrotik.tmp 文件后,我只想运行:

file /tmp/mikrotik.tmp

然后我看到它返回了这个:

mikrotik: ASCII text,with CRLF line terminators

因此,一旦我在字符串过滤器命令中添加了 | dos2unix,它就开始按预期工作,现在:

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