没有任何问题需要解决(据我所知)。我正在尝试更好地理解 ssh。
在我的系统上,ssh 转义字符是波形符 (~)。如果我在某个地方 ssh 我可以按预期使用它:
me@local$ ssh remote
me@remote$ # here I press tilde, control+z
[1]+ Stopped ssh remote
me@local$
一切都很好。但是,如果我vim
在遥控器上运行,vim 会突然看到转义字符。好像不再发送转义字符了到 ssh
但反而通过 ssh
,就好像它不是转义字符一样。
me@local$ ssh remote
me@remote$ vim
# vim opens, here I press tilde, control+z
[1]+ Stopped vim
me@remote$
我的问题是,如何影响 的转义字符vim
的行为?ssh
答案1
来自评论:
如果在按波浪号和 Control+Z 键之前按 Return/Enter 键,效果如何? - 低声
如果我这样做,它确实会将 ssh 置于后台。为什么 Return/Enter 会改变行为?这在哪里记录? - 杀死-9
反向回答,因为第二个问题的答案比第一个问题更简洁:
这个(在~之前按回车键)记录在哪里?
这Openssh 手册页的转义字符部分描述命令转义序列,使ssh
客户端程序执行操作而不是将击键转发到远程服务器。第二段有这样一句话:
转义字符必须始终跟在换行符之后才能被解释为特殊字符。
如果您发现这有点模糊且容易被忽视,我不会责怪您。以前的情况更糟!我第一次遇到~.
exit 命令是在 20 世纪 90 年代的 SunOS 4.x 命令中tip
,它的手册页说:
作为一行的第一个字符出现的波形符 (~) 是一个转义信号,指示提示执行某些特殊操作。
这个描述让读者推断,对于密钥~
来说一行的第一个字符,前面的击键必须是 Return/Enter。在文档中推理并不是一件好事。大多数人都没有抓住要点,并且当tip
似乎忽视他们的~.
(退出)命令时感到沮丧。手册ssh
页改进了描述,使其更加明确。
~
这些转义序列(似乎可以追溯到1981 年的 4.1BSD Unix)之所以rlogin
要求前面有 Return/Enter 是为了防止~.
(可能在上传到远程服务器的文件中)出现无意中断开会话的情况。
为什么运行 vim 的远程会话似乎需要额外的 Return 按键?
(我对你的问题的解释)
我无法准确地告诉您为什么vim
与运行其他命令相比,您的远程会话调用需要“额外”的 Return 按键。但我可以提供一些有根据的猜测:
vim
当您在远程服务器上运行并按回车键时,您在键入 之前已经键入了一些其他按键~Ctrl-Z
。也许您按下了箭头或h
、j
、k
、l
光标移动键。或者Ctrl-L
刷新显示。vim
如果您在调用和键入之间没有按任何键~Ctrl-Z
,那么vim
程序可能正在向您的终端程序发送字符序列以请求状态,并且您的终端程序正在发送回字符作为答案。这种查询和回答通常不会由终端程序显示。答案序列来自您的终端程序,就像您的击键一样,您的 ssh 客户端会看到前面的其他字符~
而不是 Return。
第二种猜测的可能性比第一种小,但我在某些情况下也遇到过。
最终...
将转义序列/命令发送到 ssh 客户端程序的最可靠方法是将转义字符视为实际上是两个字符:Return 后跟波形符。对于大多数命令,这使得序列需要击键三次而不是两次。