我编写了一个包装脚本,并将其命名cat
为 safecat,这样可以防止我意外地cat
ing 二进制文件并从我的 PC 扬声器中听到大量刺耳的声音。现在,它将文件视为二进制文件,并且如果第一页中的 30% 或更多字符是非文本字符(ASCII 范围 32-127 和 、\n
、\r
、\t
)\b
,它将拒绝对其进行 cat 处理。
我突然想到,只要我没有听到尖叫声并且终端事后没有混乱,我对二进制文件进行 cat 处理真的没有任何问题。是否有一组字符或字符序列,我可以专门查找并拒绝 cat 处理(如果存在)?这样会更可靠。
safecat.py 来源:
答案1
我通过使用 less 作为分页器(而不是 cat)并使用 scrollback 来解决此问题。
Less 会警告您“此文件可能是二进制文件,继续吗?[y/N]”。
答案2
尝试cat -vet
,这将确保所有控制字符都转换为适合屏幕显示的安全字符。
是的,我承认我记得它,因为它很有趣;)
答案3
如果您使用纯 ASCII,则只希望让字符 32 到 127、13、10 和 9 通过。32 以下的字符是除 13、10 和 9 之外的控制字符,这些字符分别是回车符和换行符(用于行尾)和顶部。127 以上的字符在 ASCII 中没有定义,但通常会映射到某个位置,但它们映射到什么位置取决于您当前的代码页设置。
如果您想查看二进制文件中的文本(即存储在可执行文件或您没有阅读器的二进制文档格式中的帮助文本和其他文档),则要记住的一个有用工具是命令strings
。它会扫描可打印字符序列并输出它们而不输出其余字符。输出可以通过管道传输到其他工具,如grep
和less
。但是,如果文本被压缩或不是痛苦文本,它就没有用了。您可以更新包装器以调用它而不是cat
只是拒绝执行任何操作(尽管我建议先输出一条消息,以便用户知道内容输出已被过滤)。
答案4
检查控制台代码(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 都被视为控制字符,无论“显示控制字符”模式如何。