有安全的猫吗?

Яро*_*лин 1 terminal escape-characters cat

我有时会从curl 或本地文件系统中获取二进制文件。在大多数情况下,损坏的终端可以通过重置来修复。在其他情况下,特别是如果二进制文件很大,终端将卡住几分钟打印输出,如下所示:

2c1

又名

c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;
Run Code Online (Sandbox Code Playgroud)

关于这个场景我有三个问题;

  1. 2c1 是什么意思?为什么终端会打印这个?
  2. 您是否见过cat在交互式会话中实际防范这种不良行为的情况?
  3. 您对如何对这样的猫进行编程有什么建议(在 cee 或 golang 中)

我最初的本能是将 cat 包装在一个函数中来检测这一点,但我很快意识到这是相当困难的,而且会有很多边缘情况。

function cat() {
    # warn user if
    #   - argument 1 is a large  executable 
    #   - argument 1 to the previous command in the a pipe-chain looks like a large binary
    # abort if
    #   - session is interactive and we are able to detect 2c1 garbage
}
Run Code Online (Sandbox Code Playgroud)

一个实用的解决方案可能是在查看“不安全”输入时始终使用 less (使用 LESSPIPE),但这个问题与寻呼机无关。我知道管子越来越少了。我每天都积极使用它们。也许 less+lesspipe是这个问题的解决方案,less 的作者在大约 20-30 年前实现了同样的问题

然而,cat 与“寻呼机”的不同之处不止一种......主要是 cat 是非交互式的。这对我来说意义重大。

关于 less+lesspipe 的建议实际上非常好(恕我直言),但我更关心控制字符的本质、特殊的转义序列以及不同的终端如何处理这些输入。

我对控制字符的技术细节以及终端或 shell 如何解释“垃圾”和控制字符更感兴趣。我不是在问“你将如何解决这个问题”。我问“为什么终端要这样处理二进制文件”。

Aar*_*sco 6

我会使用less它,它会警告二进制文件,并且在某些系统上可以处理各种类型(例如,在 CentOS 7 上,我可以执行less file.rpm并查看 RPM 中的文件)。我相信这就是所谓的“lesspipe”。

另外,下次发生这种情况时,您可以尝试reset恢复tput reset正常。它们将转义序列发送到终端,告诉它重置为默认的正常状态,并执行相当于将stty sanetty 设备文件的设置更改为正常默认值的操作(不过转储二进制文件不应影响这些设置)。reset还可以修复 tty 设备文件的终端或终端仿真器窗口大小的概念(如 所报告的tty size)以及支持查询它的终端。