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


23

SE上有许多问题,显示了如何从损坏的终端中恢复cat /dev/urandom。对于那些不熟悉此问题的人-这里的内容是:

  1. 您执行cat /dev/urandom或等效操作(例如cat binary_file.dat)。
  2. 打印垃圾。
  3. 没关系...除非您的终端即使命令完成仍继续打印垃圾!这是实际上是g ++输出的文本错误呈现的屏幕截图:

    屏幕截图示例

    我猜人们对C ++错误有时过于神秘是正确的!

通常的解决方案是运行stty sane && reset,尽管每次发生时都运行它很烦人。

因此,我要重点关注的是发生这种情况的原始原因,以及在发出此命令后如何防止终端损坏。我不是在寻找诸如将有问题的命令传递到tr或的解决方案xxd,因为这要求您在实际运行/打印之前知道程序/文件输出二进制文件,并且每次输出此类数据时都需要记住该文件/二进制文件。

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

Answers:


22

没有:

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

对于常用功能,请查看VT100样式的备用字符集,该字符集由^N和激活^O(启用/禁用)。在某些使用UTF-8模式的终端中,这可能会被抑制,但是相同的终端有足够的机会将它们确实识别的转义序列浪费在屏幕上(谈论GNU屏幕,Linux控制台,PuTTY)。

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

在其他情况下(例如,在具有硬编码转义序列的网络设备中,用于Linux控制台),其他终端会认为这是错误编码的,并且似乎冻结了。

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


0

如果您掌握了控制权,并且知道命令会给您带来麻烦,那么我通常会以更少的方式查看输出。

head -n4 /dev/urandom | less

这通常看起来是捕获垃圾并用理智的表示形式打印它,我记得在退出q之后再也没有遇到任何麻烦,我会用粗体显示您不熟悉的情况。


2
这个问题专门说他不是在寻找需要您提前知道程序产生二进制输出的解决方案。
Barmar 2015年

-1

将命令的输出等通过管道传输到tee-


2
那将有什么帮助?它仍然会打印输出,也将其保存在文件中。
Barmar 2015年

也许你的意思more还是less
Barmar 2015年

根据操作规范,我特别强调:“ ... 发出此类命令之后。我不寻求解决方案,例如管道传输有问题的命令”
杰夫·谢勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.