平时用 SSH 远程连机器,大部分人就只会 ssh user@主机 登录,敲命令,最后 exit 退出。但 OpenSSH 客户端藏了一套很实用的逃逸快捷键,触发符号就是波浪号 ~。不用关掉当前会话,就能做不少操作:强制断开、临时加端口转发、调试隧道、调整日志输出都可以直接完成。
普通日常运维里这些能力可能只是加分项,但经常折腾多层跳板机、调试隧道、处理网络卡顿的人,会发现这些功能非常顶用。可惜很多人不知道这套机制:会话卡死第一反应直接关终端窗口,想要加端口转发就得断开重连。这篇整理下 OpenSSH 全部波浪号逃逸用法,结合真实工作场景讲清楚怎么用,把 SSH 被忽略的能力用起来。
注意:所有逃逸命令必须放在行首。先按回车新开一行,前面不能有空格或者别的字符,不然会直接把波浪号当成普通文本发给远端服务器,不会触发逃逸。这套功能只支持官方 OpenSSH 客户端,Linux、macOS、WSL 自带的都可以;PuTTY、MobaXTerm 这类第三方 SSH 工具并不兼容。
逃逸快捷键速查表
| 快捷键 | 说明 | 实用度 |
|---|---|---|
~? |
输出帮助菜单,查看当前客户端全部可用逃逸指令 | ⭐⭐⭐⭐⭐ |
~. |
强制断开 SSH 连接。会话卡死、Shell 无响应的时候救急,不需要执行 exit | ⭐⭐⭐⭐⭐ |
~C |
调出 ssh> 交互控制台,动态增删端口转发(‑L /‑R /‑D)。OpenSSH 9.2 默认关闭该功能,需要配置 EnableEscapeCommandline=yes 开启 |
⭐⭐⭐⭐⭐ |
~# |
列出所有正在运行的端口转发隧道,排查转发是否生效很方便 | ⭐⭐⭐⭐ |
~^Z |
把 SSH 会话放到本地后台,效果等同于 Ctrl+Z;输入 fg 切回会话 |
⭐⭐⭐ |
~& |
后台驻留 SSH:退出远程 Shell 之后,端口转发不会跟着关掉,等全部转发连接结束才彻底退出 SSH 进程 | ⭐⭐⭐⭐ |
~R |
会话运行途中重新协商加密密钥;长时间渗透、长时间驻留会话可以手动触发,提升安全性 | ⭐⭐ |
~~ |
向远程机器输出一个普通波浪号 ~;远端确实需要输入 ~ 时敲两次 |
⭐⭐ |
~B |
发送 BREAK 中断信号,仅串口、路由器、嵌入式控制台生效,普通 Linux 主机用不上 | ⭐ |
~V |
调高客户端日志详细等级,等价于加 -v 参数,不重连就能排查连接问题 |
⭐⭐⭐ |
~v |
降低日志输出等级 | ⭐⭐⭐ |
多层跳板嵌套:波浪号的层数技巧
场景示例:本机 → SSH 登录机器A → 在A内部再 SSH 登录机器B,两级跳板。
- 单个
~,只会作用在最内层的 SSH 会话 - 想要操控外层第一层 SSH:输入
~~ - 如果三层嵌套,就用
~~~
每多一层 SSH 跳板,就多打一个波浪号,就可以操控外层隧道,调试多层内网跳板的端口转发特别好用。
举个例子:
本机 → jumpbox(A) → target(B)
在B的命令行,回车换行输入 ~~C
会调出第一层(本机到 jumpboxA)的 ssh> 控制台,可以直接给第一层跳板新增端口转发。
ssh> 控制台可用指令(开启 EnableEscapeCommandline 后)
进入 ssh> 提示符,直接写转发参数,不需要断开重连 SSH:
ssh> -L 8080:127.0.0.1:80 #本地端口转发
ssh> -R 9090:127.0.0.1:9090 #远程端口转发
ssh> -D 1080 #SOCKS5动态代理
ssh> -K #销毁指定端口转发
ssh> ? #查看控制台内置帮助
其他容易被忽略的 SSH 实用配置
1. 连接复用 Multiplexing
编辑 ~/.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%h_%p_%r.sock
ControlPersist 30m
第一次 SSH 建立主连接;后续访问同一台机器的 ssh、scp,直接复用现存 TCP 连接,不用重复握手鉴权,内网跳板场景速度提升明显。
2. 自定义逃逸字符
配置项 EscapeChar ~,也可以直接关闭全部逃逸功能:EscapeChar none。
3. 快速确认本机支持哪些逃逸
随便连一台机器,回车之后敲 ~?,就会打印当前 OpenSSH 完整逃逸列表;如果看到 Command line: disabled,代表 ~C 动态命令行已经被关闭。
实际工作场景用法
- 靶机 SSH 会话卡死,完全输不了指令:回车换行,敲
~.直接断开,不用关掉终端窗口。 - 连上机器才想起忘记开端口转发:提前开启
EnableEscapeCommandline,敲~C直接追加隧道,不用重连。 - 不清楚当前开了几条转发:回车输入
~#,直接打印全部活跃转发条目。 - 想退出远端 Shell,但保留 SOCKS 代理继续跑:执行 exit 之前敲
~&,退出 Shell 后隧道会继续后台运行。
小结
学会波浪号逃逸,本质就是把 SSH 从“连上就听天由命,卡死只能重开”,变成可以中途干预、动态调整会话的工具。这套快捷键核心目标很简单:不破坏现有连接的前提下,灵活控制会话状态、隧道、日志和进程生命周期。
优先把 ~? 和 ~. 记熟,一个是随身帮助手册,一个是僵死会话的应急手段。在此之上再上手 ~C 动态转发、~# 隧道排查、~& 后台保活,SSH 就不再只是简单的远程登录工具。
注意:不同 OpenSSH 版本特性略有区别,尤其是 9.2 版本之后
~C默认关闭。换环境之后建议先敲一遍~?确认可用能力,避免关键时刻踩坑。另外就算客户端开启~C,如果服务端配置禁用了端口转发AllowTcpForwarding,控制台新增隧道依旧会失败,这一点需要提前留意。
原文 https://blog.csdn.net/2301_79518550/article/details/163999570