在 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:因为{而无效的语法)