如何防止随机控制台输出破坏终端?

rr-*_*rr- 24 terminal escape-characters output

SE 上有很多问题显示了如何从被cat /dev/urandom. 对于那些不熟悉这个问题的人 - 这里是关于:

  1. 您执行cat /dev/urandom或等效(例如,cat binary_file.dat)。
  2. 垃圾被打印出来。
  3. 那没问题……除非您的终端在命令完成继续打印垃圾!这是实际上是 g++ 输出的错误渲染文本的屏幕截图:

    示例截图

    我想人们对 C++ 错误有时太神秘的看法是正确的!

通常的解决方案是 run stty sane && reset,尽管每次发生这种情况时都运行它有点烦人。

正因为如此,我想在这个问题中关注的是发生这种情况的原始原因,以及在发出此类命令后如何防止终端中断。我不是在寻找解决方案,例如将有问题的命令通过管道传递给tror xxd,因为这要求您在实际运行/打印之前知道程序/文件输出二进制文件,并且每次碰巧输出此类数据时都需要记住.

我注意到 URxvt、PuTTY 和 Linux 帧缓冲区中的相同行为,所以我认为这不是特定于终端的问题。我的主要怀疑是随机输出包含一些翻转字符编码的 ANSI 转义码(事实上,如果你cat /dev/urandom再次运行,它可能会打开终端,这似乎证实了这个理论)。如果这是正确的,这个转义码是什么?是否有任何标准方法可以禁用它?

Tho*_*key 22

不:

  • 没有标准的方法可以“禁用它”,并且
  • 破损的细节实际上是终端特定的,但是
  • 有一些常见实现的功能可能会导致您出现不当行为。

对于常用实现的功能,请查看 VT100 样式的备用字符集,该字符集由^N^O(启用/禁用)激活。这可能在一些终端使用UTF-8模式下被抑制,但在同一终端拥有捣毁你的屏幕(谈论GNU屏幕,Linux控制台,腻子这里)与他们的转义序列充分的机会认识。

例如,一些其他转义序列依赖于终端对主机查询(转义序列)的响应。如果主机不希望它,结果是屏幕上的垃圾。

在其他情况下(例如在 Linux 控制台带有硬编码转义序列的网络设备中看到),其他终端将其视为错误编码,并且似乎冻结。

所以...你可以只专注于一个终端,删除任何看起来令人讨厌的东西(例如,有些人建议删除使用鼠标在编辑器中定位的功能),你可能会得到一些没有明显漏洞的东西。但这只是一个终端。