为什么 Windows 终端中会出现随机字符?

为什么 Windows 终端中会出现随机字符?

我已经在 Windows 上编程几年了,当我开始真正使用 Windows 中的各种终端进行开发时,出现了一个越来越令人沮丧的问题。要登录远程机器,我使用 PuTTy,最近我发现了 Cygwin,我发现它是一款非常棒的 shell。我还有一台 MacBook Pro,我也使用终端。

我注意到,无需我输入任何内容,8~ 就会自动在我的终端中输入内容,如果我离开电脑 10 或 15 分钟,我会定期看到类似这样的内容:

8~8~8~8~8~8~8~8~8~

此外,当我使用 emacs 时,我注意到一些数字会随机出现,而无需输入它们,例如 012 或 34 等。这种情况发生在我各种不同的 Windows 机器上,我尝试了数百次不同的 Google 搜索,试图确定为什么会发生这种情况,但我完全没有找到导致这种情况的原因。

我将非常感激任何帮助。我知道这本身并不是一个编程问题,但我认为 Stack Overflow 不会喜欢这个问题,而且由于你们都是程序员,我想你们中的一个会有一些见解。

非常感谢。

编辑:我最初发布于www.programmers.stackexchange.com我收到了三条评论要求我澄清,因此我重新发布了该问题并要求澄清。

  1. 这几乎肯定是某种形式的 keepalive,但上下文不太清楚。您在 Windows 上使用 PuTTy,并连接到另一台机器上的 emacs,并获取随机字符?您尝试过什么来隔离它?如果您只是打开一个窗口而不连接,它们会显示出来吗?如果您只是打开一个控制台窗口?

当我在本地使用 emacs/Cygwin 时会发生这种情况,当我通过 puTTy 使用 emacs 登录学校的 linux 服务器时也会发生这种情况。我真的不知道我能做些什么来隔离它,我甚至不知道原因!它从未在 Mac 上发生过,无论是在本地还是在我登录同一台服务器时,所以我认为问题一定是本地的。由于当我通过 Cygwin 或 putty 登录学校服务器时会发生这种情况,以及当我在本地使用 Cygwin 和 emacs 时也会发生这种情况,所以它一定是 Windows 的问题。

  1. 这是否只发生在 Windows 上,还是也会发生在 Mac 上?这是否只发生在您登录特定计算机时,还是也会发生在其他计算机上?如果只发生在特定计算机上,那么它运行的是什么操作系统(什么发行版、什么版本)?这是否与移动鼠标有关?您的问题在这里是题外话,但如果您添加我们要求的信息,您可以在超级用户上重新发布它。

不,这种情况不会发生在本地 Mac 上或我登录学校服务器时。我使用的是 Windows 8 Pro 和 Windows 7 Ultimate,但发生了这种情况。

答案1

就我而言,8~ 个字符序列的周期性输出是由于后台进程与作为活动窗口的 cygwin shell(64 位 Windows7)窗口相结合所致。为了禁止每隔 x 分钟进入一次屏幕保护程序模式并锁定我的工作计算机,我安装了一个名为 caffeine.exe 的程序,该程序在后台模拟周期性输入活动(键盘或鼠标;我现在还不能 100% 确定)。我大约每分钟都会看到相同的周期性 8~ 个字符串输出,这可能是模拟输入生成的时间。总之,如果我的 cygwin 窗口不是活动窗口,或者如果我的 cygwin 窗口是活动窗口但我禁用了咖啡因,则不会出现 8~ 个字符;否则,我会看到 8~。

问候,格雷格

答案2

有时,在 Cygwin/SSH 中的终端或某些 Linux 程序中可能会出现看似“随机”的字符,因为您键入了未在机器上映射的键盘键。造成这种情况的主要原因是扩展键盘上的宏或多媒体键,或者(在极少数情况下)如果您Fn的键盘上有需要用于某些击键的键。这些键可能未被您控制的操作系统映射,因此可能会出现在终端或其他可以输入文本的地方,作为键盘发送给操作系统进行解释的原始键盘代码/字符。这与Conrol+C出现在终端中的原因相同^C,例如。

可能发生的情况是,您按下了键盘上的某个组合键或按键,而该组合键或按键并未在该特定机器上被 Linux 映射,最终被输入到您的终端或文本编辑器中。或者,计算机上可能设置了常规事件,可自动触发按键并使其显示出来。

您没有说明这种情况是否在您输入内容时发生,或者即使您没有输入内容也会发生。但根据我的经验,这就是您可能会看到这种情况发生的原因。

更新:

通过对 Cygwin 进行反复试验,我发现了与之8~相关的东西。

当您输入组合键Ctrl+ Alt+ Shift+时,它就会出现Del。我不知道为什么它出现得这么频繁,但您的计算机上的某些东西显然触发了该输入。可能是后台运行的某些软件,也可能是键盘故障。

您可以尝试自己验证这一点。我会先尝试不同的键盘,如果没有帮助,则开始检查正在运行的进程,并使用排除法尝试找出是哪一个。

答案3

在类 Unix 操作系统中,程序通过发送转义序列到终端。当您按下各种特殊键时,或者(如果程序已启用)在终端窗口内使用鼠标时,或者响应某些查询时,终端本身会向程序发送转义序列。

这些序列总是以一个ESC字节开头,该字节在不同的地方可能显示为^[(实际上意味着Ctrl [,但由于 ASCII 的工作方式,它是相同的字节),所以^[[2~实际上是ESC[2~

(这狂欢shell 以“原始”模式运行并解释某些按键序列,例如箭头键。当它无法识别输入的序列时,它会丢弃看到的部分,并继续将剩余部分解释为常规按键 - 这就是为什么一半的序列(例如)~最终会插入命令行的原因。另一方面,当您运行cat或编译某些内容时,您输入的所有内容都会由终端本身完整显示,因此您可以看到完整的“未损坏”序列。这就是我要求您运行的原因cat。)

通常,表示按键的序列以 结尾~。您在评论中提到的两个中,ESC [ 2 ~对应于Insert按键。另一个(ESC [ 8 ~)我甚至在 PuTTY 的源代码中都找不到。所以我不确定您是否记得正确的代码。

相关内容