我最近开始租用远程服务器的空间,以便可以开展一个项目。我发现在 Windows 机器上访问它的一种相对轻松的方式是通过 PuTTY。然而,使用它时有一件事总是让我恼火:有时似乎毫无理由地在光标处插入随机字符。
大多数情况下,它只是一个波浪符号,但很少会吐出看起来像转义序列的东西([[^8 或类似的东西)。只有当我专注于窗口时,它才会出现,无论我是在打字还是在距离键盘 20 英尺的地方。如果时间足够长,它会以随机间隔吐出波浪符号(平均约 1 分钟)。
最后,在运行 nano 或 mysql 界面等程序时,这种行为似乎不一致:在 nano 中,它不会插入波浪号,而是设置标记(ctrl-^);在 mysql 中,行将变得不可编辑。
我的问题是:其他人在PuTTY中遇到过这种行为吗?如果是这样,可以做些什么来防止/纠正这种行为?
答案1
我在使用 PuTTY 时也遇到了同样的问题,我发现这是由一个名为“caffeine”的应用程序引起的,该应用程序每分钟都会按一次 F13 键来阻止激活屏幕保护程序(组策略阻止我更改计算机上的屏幕保护程序超时)。禁用该应用程序解决了我的问题。
答案2
如果您希望运行 Putty 和 Caffeine,请按照以下步骤操作:
- 停止咖啡因
- 检查 Caffeine readme.txt 以了解模拟的默认按键 - 我的是
F15
- 通过 Putty 登录到远程终端
- 启动 Caffeine(提示:以短间隔启动 Caffeine,例如 3 秒)。
- 使 Putty 会话成为焦点。
- 在 bash 命令提示符下按
Ctrl+V
(这是获取密钥的特殊代码所必需的。例如,尝试Ctrl+V
后跟F12
) - 等待 Caffeine 模拟密钥
- 键代码将显示在命令行上(例如,
F15
is^[[28~
,其中^[
is escape)。停止Caffeine - 现在你可以将此键绑定为空白,这样当 Caffeine 模拟它时,它就不会输入
~
- 编辑
~/.inputrc
(如果不存在则创建新文件) - 添加行
"\e[28~":""
- 编辑
- 开始喝咖啡
- 重新启动终端会话
~
在 Linux 服务器上使用 Putty 终端时,应该不会再出现随机情况
答案3
我发现什雷扬斯普的解决方案是最令人满意的(但不是完全令人满意的)解决方案 :)
这是我改进它的尝试(当然 YMMV)。希望这对那些寻找解决方案的人有用 :)
我的解决方案如下:
- 咖啡因向 Windows 发送适当的虚拟键代码,该代码:
- 防止 Windows 进入睡眠或空闲状态
- 不会在 Windows 上产生任何副作用,无论是单独使用还是组合使用(无 Ctrl、Shift、Alt、Alt-Gr、Win、F1-F5、F10 等)
- 未发送到 Putty 或被 Putty 忽略
TL;DR:我的解决方案应用在步骤 2 和步骤 3 之间(见下文),并带有-key:0E
咖啡因参数:
退出 Caffeine 并重新启动:(
caffeine.exe 5 -key:0E
为了方便测试)
caffeine.exe 50 -key:0E
(强制屏幕保护程序设置为 1 分钟)
read
在远程主机上启动程序并观察每 5 秒或 50 秒没有收到任何击键。- 退出
read
Ctrl+C
什雷扬斯普提出了一个解决方案,即在步骤 5 和步骤 10 之间应用修复(见下文)。
这样做的副作用(在我的配置上)是,每次击键时,putty 都会从 caffeine 转发到远程主机:
- 它触发了‘按键时重置滚动条’(在 Putty/Window 页面上设置),
这是我通常想要的,但只有当我(人类)按下按键而不是定期喝咖啡时才会触发:) - readline/bash 翻译版本(从
'"\e[28~"'
到'""'
(空白键?)导致远程会话交互挂起几秒钟
为了轻松测试上述内容,退出 Caffeine 并以 5 秒间隔和虚拟键代码 07 重新启动它:
caffeine.exe 5 -key:07
- 在远程主机上启动
read
程序并观察每 5 秒或 50 秒如何接收击键。 - 退出
read
Ctrl+C
据我了解,按键‘管道’是:
- Caffeine 向 Windows 发送虚拟键代码
- Windows 将虚拟键代码发送到 Putty
- Putty 根据一些会话设置进行一些“翻译”/“映射”:
- 终端/*
- 窗户/*
- Putty 将“翻译”/“映射”键代码发送到远程主机
- 在远程主机上,“终端”程序(例如:、、、、等等
$TERM=xterm
)将“线路协议”转换为键代码。vt100
vt102
vt220
- readline 库根据以下条件进行一些转换/映射:
~/.inputrc
- readline 发送键代码给 bash
- bash 根据
~/.bashrc
(基于内置 bind 命令)进行一些转换/映射 - bash 或 readline (不确定哪一个)将翻译后的键代码发送到 nano (我的文本编辑器)
screen
通过添加程序(包括$TERM=screen
步骤 5,并在步骤 6 到 10 再次循环),这个管道可以变得更长。
笔记:一旦进入第 4 步,精确控制“翻译”/“映射”的不同层次就变得非常困难。如果可以的话,我建议避免这种情况。
背景:
我使用了caffeine.exe -key:07
很多年,才开始处理 pfsense 2.3.3-RELEASE-p1(基于 FreeBSD 10.3-RELEASE)。
然后,caffeine.exe -key:07
在另一端收到的是^[[28~
...,似乎映射到Ctrl+^
Nano 中的 (Set Mark)。
这非常烦人(想象一下,有人在记事本中移动文本插入符号时按住 Shift 键)。
之前,我在 Putty 设置中做了大量自定义,以获得我~/.tcshrc
认为的基本功能(,,,,,,,,,,Numpad ,Numpad )在bash/nano/screen 之间一致运行~/.inputrc
。~/.bashrc
~/.nanorc
~/.screenrc
Backspace
Delete
Home
End
PgUp
PgDown
Ctrl+Left
Ctrl+Right
0-9
./*-+
一旦我发现了这个caffeine.exe -key:07
“错误”,我就不想再重新追溯它了:)
已测试:
视窗8.1 64 位企业版 (6.3.9600) /油灰0.66 /普福斯2.3.3-RELEASE-p1(基于FreeBSD10.3-发布)/狂欢4.4.12-发布 /纳米2.7.3 /屏幕4.04.00
参考:
咖啡因:
- Caffeine 向 Windows 发送的虚拟键代码
(我会选择
Undefined
适合您的设置的第一个代码)
- Caffeine 向 Windows 发送的虚拟键代码
(我会选择
Readline/inputrc/bash/bashrc/(内置) 绑定:
- http://www.softpanorama.org/Scripting/Shellorama/inputrc.shtml
- http://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html
- https://docs.freebsd.org/info/readline/readline.pdf
- 概括:
- 使用“bind -r keyseq”解除绑定只会将未翻译的键转发给应用程序(在我的情况下是 nano)
- 从“keyseq”重新映射到“”仅意味着向应用程序发送一个空键(无论其含义是什么)(导致一些锁定)
油灰:
- PuTTY 希望便携键盘(处理者)
- PuTTY 希望键映射
- 概括:
- Putty 没有规定让它忽略一个或多个特定的键(它甚至没有被列为需要/想要的功能)
- 但是,Putty 似乎会过滤掉它不能识别/支持的虚拟键代码(这对我们有好处:)
答案4
更好的解决方案是在您的 putty 会话上配置设置,以便 Caffine 不会干扰它。
在 Putty 中的 Terminal Keyboard 下选择 SCO 选项。在 Putty 中的 Terminal Bell 下将操作更改为 None(关闭铃声)。
Caffine 仍会执行其工作,并且不会干扰您的 Putty 会话。(我在 Putty 会话期间不使用 Fn 键,因此我不知道如果您想使用 Fn 键会发生什么)。