如果有什么字符将会弄乱我的terminal,并造成大量的噪音?

我写了一个我称为safecat的别名的包装脚本 ,它可以防止我偶然捕获二进制文件,并从我的PC扬声器中得到大量的尖叫声。 现在它认为一个文件是二进制文件,如果第一页中30%或更多的字符是非文本字符(ASCII范围32-127和\n\r\t\b )。

我发现,只要我没有得到尖叫,我的terminal没有被搞乱,我真的没有任何问题。 是否有一组字符或字符序列,我可以专门寻找并拒绝如果这些猫存在? 这将更加强劲。

safecat.py源码:

我通过使用less作为传呼机,而不是猫,并使用回滚来解决这个问题。

less警告你“这个文件可能是二进制的,继续?[y / N]”。

试试cat -vet ,这将确保所有的控制字符转换成安全的屏幕显示。

是的,我会承认我记得那样,因为这很有趣;)

如果你使用纯ASCII工作,那么你只想让字符32到127,13,10和9通过。 那些低于32的是除13,10和9之外的控制字符,它们分别是回车符和换行符(用于行结束)和顶部。 127以上的字符没有在ASCII中定义,但是通常映射到某些内容,但是它们映射的内容取决于当前的代码页设置。

一个有用的工具,要记住,如果你想看看二进制文件中的文本(即帮助文本和其他文件存储在一个可执行文件或一些二进制文件格式,你没有读者)是strings命令。 它扫描可打印字符的序列,然后输出它们。 输出可以通过其他工具,如grepless 。 如果文本被压缩或者不是痛苦的文本是没有用的。 你可以更新你的包装来调用这个而不是cat而不是拒绝做任何事情(尽pipe我build议先输出一个消息,这样用户就知道内容输出已被过滤)。

最可能导致问题的字符是ESC(27),SI(14),SO(15)和DC-3 / X-OFF(19)。 一些terminal支持CSI(155 = 128 + 27)作为引入ESCape序列的简写forms。

逃逸(ESC)引入控制序列。 换档(SI)和换档(SO)可以改变字符集和其他function。 X-OFF(DC3)可能会阻止terminal发送任何数据。 贝尔(8)可能会嘈杂。

您可能需要过滤十进制32范围内的非格式化控制字符。大多数使用的格式化字符是TAB(9),LF(10),CR(13)和FF(12)。 BS(7)和VT(11)现在较less使用。

控制字符按function分组排列,使过滤更容易。

现有的工具已经很好地处理了这个问题。 考虑将其中一个别名为cat。 这可以打破命令链。 您可以始终通过在反斜杠前添加生猫。

如果最终出现错误的字符集, reset将会修复terminal。

检查console_codes(4)手册页:

一个字符是一个控制字符,如果(在根据映射表转换之前)具有14个代码00(NUL),07(BEL),08(BS),09(HT),0a(LF),0b VT),0c(FF),0d(CR),0e(SO),0f(SI),18(CAN),1a(SUB),1b(ESC),7f(DEL)。 可以设置“显示控制字符”模式(见下文),并允许07,09,0b,18,1a,7f显示为字形。 另一方面,在UTF-8模式下,所有代码00-1f都被视为控制字符,而不pipe任何“显示控制字符”模式。