Control-p 冻结 SSH 会话

Control-p 冻结 SSH 会话

我在日常使用的一台 SSH ARM 机器上遇到了一种奇怪的情况。每次我连接到服务器并按Ctrl+P调用previous-historyBASH 函数时,SSH 连接都会冻结。我只能使用波形符 SSH 序列退出。我试图调查造成这种情况的可能原因:

  1. 这不是 BASH 错误,因为按向上箭头也可以previous-history正常调用

  2. Ctrl+P不受任何异常情况的约束,根据bind -p

    $ bind -p | grep previous-history
    "\C-p": previous-history
    "\eOA": previous-history
    "\e[A": previous-history
    
  3. 像这样将Ctrl+绑定P到不同的函数没有帮助 - Ctrl+P仍然冻结 SSH:

    $ bind '"\C-p":"\necho hi\n"'`
    
  4. BASH 正确打印Ctrl+的原始字符, ++打印PCtrlV CtrlP^P

  5. $TERM设置为screen/etc/termcapBASH readline 默认使用的值是正确的 - 例如,Ctrl+L清除屏幕。设置$TERM为 xterm 或 linux Ctrl+后P仍然冻结 SSH

  6. 我尝试使用--noprofileand启动 BASH--nobashrcCtrl+P仍然不起作用

  7. 我连接到服务器,-vvv但我没有注意到日志消息中有任何不寻常的内容

  8. 当 SSH 连接冻结时,我可以毫无问题地连接到另一个子 shell 上的同一服务器。执行此操作后,在前一个子 shell 上冻结的会话再次恢复正常 - 我可以看到我键入的内容,但看不到会话冻结时我键入的所有内容

  9. 我从多台机器连接到该服务器以排除本地问题,但Ctrl+P从来没有工作过

bash 版本:

GNU bash,版本 4.1.5(1)-release (armv7l-unknown-linux-gnueabi)

SSH 版本:

OpenSSH_5.3p1、OpenSSL 1.0.1c 2012 年 5 月 10 日

Linux内核:

30年10月3日

我不知道这种行为的原因是什么。我已经习惯了Ctrl+P按键绑定。有人知道吗?

答案1

在 ssh 中调试时使用

ssh -vvv remotehost

启用最大调试输出:对于发送到远程端的每次击键,您应该看到“debug3:总共写入 NNNN 48 个字节”。如果您没有看到 Ctrl-P,则表明问题出在本地(客户端)而不是远程。

您有权限控制远程端的守护进程吗? sshd 的 -D 和 -d 选项(再次,-ddd为了最大调试输出)可以帮助您将问题隔离到连接的那一半。

在本地端,是否有任何不寻常的终端键绑定?stty -a或者stty -a | fgrep '^D'应该显示 Ctrl-P 是否在那里有绑定。 (什么必然会“停止”?)

客户端死机后:

  1. 如果发出诸如 之类的命令touch /tmp/foo,对服务器有影响吗? (即,只是显示冻结,还是执行)。
  2. 你能发出 ssh 客户端转义吗?您可以输入<enter>~? 并获取“支持的转义序列”列表吗?您可以键入 <enter>~.并终止连接吗?如果是这样,任何冻结肯定是在服务器上。

您可能会更好地了解服务器端使用 strace 所做的事情:

strace -fo /tmp/strace.out sshd -ddd -D

相关内容