kita / notes

约 2 分钟

敲完那行 ssh 之后什么都不显示,我以为是卡了

用 VNC 连远程桌面的时候有个很实际的难受点:复制粘贴难用。

要执行的命令越来越长,一行行敲不现实,粘贴又经常失败。于是我想换个路子——在 VNC 里把 SSH 开起来,之后的命令都在 SSH 终端里跑。

思路是:从远程桌面那边反向连回我本地,然后再通过它连服务器。

那条命令

我要做的是把这个关系建起来:

ssh -N -R 2222:127.0.0.1:22 root@<服务器>

拆开看每个部分:

  • -R 2222:127.0.0.1:22 —— 在服务器上监听 2222 端口,把所有连到它的流量转发到本机的 22 端口(也就是我这里的 SSH 服务)
  • -N —— 不执行任何远程命令(我只是要隧道,不需要开 shell)
  • 连的是服务器

效果:以后我从服务器上连 127.0.0.1:2222,实际连回的是我这台机器的 SSH。

回车之后没有任何反应

敲完回车,光标跳到下一行,然后……什么都没有。不报错,不退出,也不给提示符。

我等了一会儿,以为它卡住了,又敲了个回车——依然没反应。

实际上这是正常的。

-N 的意思是"不要执行远程命令",那么会话里就没有 shell 可以交互——没有提示符是应该的。连接建立成功之后,这个命令会一直挂着,占着那个终端,直到你手动中断它。

它什么都不输出,正说明它工作正常。 有问题才会报错。

这类工具的"静默"很容易被误读为"卡死"。判断标准很简单:只要它没报错、没退出、连接还在(进程没结束),它就正常。真要验证,得另开一个终端去试那个端口通不通。

一个反直觉的地方

平时用 ssh 的习惯是"执行命令 → 看输出 → 结束"。而带 -N 的用法是"建立通道 → 挂住不动"。

这是两种不同的使用模式:前者是"用一次就完",后者是"维持一个长期存在的通道"。后者需要的是不打扰——它挂在那儿占一个终端窗口,就是它的工作状态。

我在这上面耽误了几分钟,因为一直等着它"给出点什么"。后来才反应过来:它不输出才是对的。

顺带说一句这类工具的通病

ssh、nc、socat 这类网络工具都有这个特点:成功时静默,失败时报错。

所以判断它们的状态不能靠"看输出",得靠"看进程状态"和"从另一端试"。这条经验在很多地方适用——凡是"建立连接/监听/转发"这类动作,都别指望它会欢快地告诉你"我好了"。

← 回到全部笔记