我在日常使用的一台 SSH ARM 机器上遇到了一种奇怪的情况。每次我连接到服务器并按Ctrl+P调用previous-history
BASH 函数时,SSH 连接都会冻结。我只能使用波形符 SSH 序列退出。我试图调查造成这种情况的可能原因:
这不是 BASH 错误,因为按向上箭头也可以
previous-history
正常调用Ctrl+P不受任何异常情况的约束,根据
bind -p
:$ bind -p | grep previous-history "\C-p": previous-history "\eOA": previous-history "\e[A": previous-history
像这样将Ctrl+绑定P到不同的函数没有帮助 - Ctrl+P仍然冻结 SSH:
$ bind '"\C-p":"\necho hi\n"'`
BASH 正确打印Ctrl+的原始字符, ++打印PCtrlV CtrlP
^P
$TERM
设置为screen
,/etc/termcap
BASH readline 默认使用的值是正确的 - 例如,Ctrl+L清除屏幕。设置$TERM
为 xterm 或 linux Ctrl+后P仍然冻结 SSH我尝试使用
--noprofile
and启动 BASH--nobashrc
但Ctrl+P仍然不起作用我连接到服务器,
-vvv
但我没有注意到日志消息中有任何不寻常的内容当 SSH 连接冻结时,我可以毫无问题地连接到另一个子 shell 上的同一服务器。执行此操作后,在前一个子 shell 上冻结的会话再次恢复正常 - 我可以看到我键入的内容,但看不到会话冻结时我键入的所有内容
我从多台机器连接到该服务器以排除本地问题,但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 是否在那里有绑定。 (什么必然会“停止”?)
客户端死机后:
- 如果发出诸如 之类的命令
touch /tmp/foo
,对服务器有影响吗? (即,只是显示冻结,还是执行)。 - 你能发出 ssh 客户端转义吗?您可以输入
<enter>~?
并获取“支持的转义序列”列表吗?您可以键入<enter>~.
并终止连接吗?如果是这样,任何冻结肯定是在服务器上。
您可能会更好地了解服务器端使用 strace 所做的事情:
strace -fo /tmp/strace.out sshd -ddd -D