微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。