在 BASH 中不可见的无效字符

Posted

技术标签:

【中文标题】在 BASH 中不可见的无效字符【英文标题】:invalid characters not visible in BASH 【发布时间】:2018-10-11 20:45:59 【问题描述】:

我一直在研究一些允许通过 telnet 登录的设备,我从设备中提取了一些数据并制作了一些报告,没有任何问题。最近,我不得不切换到 SSH,而其余的脚本都是一样的,只有登录过程从 telnet 更改为 SSH。切换到SSH后,我在提取的数据中遇到了一些问题,即某些行中有一些无效字符,下面是一个示例:可以看出,该行中PON7之后有一个无效字符:

OLT:LT6.PON7.ONT1,ALARM,Date time,

问题是这个无效字符在 bash/csv 文件中甚至不可见,但是当我在 notepad++ 中复制该行或在此处发布时发现了它。

现在我有两个问题: 第一:如果有人知道在 telnet/ssh 之间切换时导致这些无效字符的原因。 第二:如何处理 BASH 中的这个无效字符,因为它在 BASH 中甚至不可见,但是这个报告正在某个地方使用,这些无效字符正在引起问题。

编辑:

将文本粘贴到 text-to-hex converter 中会产生这样的结果:

4f 4c 54 3a 4c 54 36 2e 50 4f 4e 37 11 2e 4f 4e 54 31 2c 41 4c 41 52 4d 2c 44 61 74 65 20 74 69 6d 65 2c

“7”和“.”之间似乎有一个 DC1 字符(十六进制 11)。

不幸的是,此编辑还具有从示例文本中删除字符的副作用。

【问题讨论】:

无效字符在此处发布时可见,但在我发布问题后,它不再可见。如何分享实际文本? 【参考方案1】:

通过text to hexadecimal converter 传递您的文本表明不可见字符是ASCII DC1 character(十六进制11,八进制021)。此字符也称为 Ctrl-Q 或 XON。它有时用于流量控制。

在 bash 脚本中,您可以使用 tr 程序将其过滤掉:

echo $badtext | tr -d '\021'

SSH 本身并不会将 DC1 字符插入到文本流中。如果您在设备的输出中获得 DC1 字符,则可能是设备发送了该字符。

【讨论】:

是的,有 DC1 字符,似乎设备本身正在发送该字符,但问题是我只需要从输出中过滤该字符,同时保持整行完整,我会尝试使用 sed 来解决这个问题,如果你能提出一些建议,请做 如果您需要帮助将过滤器添加到现有脚本中,您应该在问题中包含现有脚本的相关部分。 我认为您的上述评论就足够了,我已经按照您的建议附和了文本并翻译了它,在下一份报告中,我将验证这一点。实际上这些设备使用的是 TL1 语言(电信设备的典型语言),并且可能这个 DC1 字符一直都存在,但不知道为什么它在使用 telnet 时没有出现任何问题。 下面是代码的一部分,我按照您的建议添加了翻译,但我仍然在输出中看到 DC1 字符。 echo "$ONTID,$ALM,$COMBDate,$INVDATA" | tr -d '\017' 我误读了ascii table。应该是... | tr -d '\021'

以上是关于在 BASH 中不可见的无效字符的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉python在将命令传递给bash时忽略一个字符(Python到bash命令SyntaxError:因为{而无效的语法)

虚拟图像路径在部分视图中不可见

bash 导致 ec2 cli 请求的 json 无效

JWPlayer 在 Qt5 QWebView 中不可见

iTunes连接从xcode 8上传的无效构建

为啥在一个函数中声明的联合类型在另一个函数中使用无效?