在 Windows 上用 SSH 干活,最让人抓狂的体验就是跑着跑着任务,终端里突然蹦出一句 Connection closed,或者干脆光标卡死、敲什么都没反应。我自己踩过无数次这个坑,尤其是用笔记本办公的时候,网络一切换、一休眠,SSH 连接基本就废了。更扎心的是,远程服务器上跑了一半的任务,断掉之后全白跑,回头你还得重新登录、重新找路径、重新执行一遍。所以这次想彻底聊聊 Windows 下的 SSH 掉线重连与会话持久化,把客户端保活、自动重连脚本、服务器端 tmux/screen 会话恢复这套组合方案完整拆开讲一遍。这篇文章面向的是经常用 Windows 连接 Linux 服务器做开发、跑任务、拉日志的同学,哪怕你只是偶尔连一次服务器,这套配置也能帮你省掉很多无谓的重复劳动。
1. 先搞清楚:为什么会掉线,以及"持久化"到底要解决什么
1.1 掉线的常见根因,其实就几类
SSH 连接不稳定,表象是"网络断了",但背后的原因差异很大,先分清楚才能对症下药。我自己把这些年遇到的掉线场景归成四类。
首先是空闲超时。SSH 本质是一条 TCP 长连接,如果长时间没有数据交互,很多设备会判定这条连接已经死了,主动把它清掉。这里的"设备"既包括服务器本身,也包括中间经过的路由器、防火墙、负载均衡。尤其是公司内网里的状态检测防火墙,特别喜欢回收空闲会话,你停下手头工作去查个文档,回来连接就已经没了。这种掉线最难受,因为根本不给你反应时间。
其次是网络拓扑变化。笔记本从 WiFi 切到有线、从办公室网络切到家里网络、DHCP 重新分配了 IP,这些都可能导致底层 TCP 连接失效。但尴尬的是,TCP 连接本身不会立刻感知到路径变了,所以你的终端看起来还"活着",实际上数据包已经送不到服务器了。这就是典型的"假死"状态,你得等 TCP 超时才能反应过来。
第三类是休眠和睡眠。Windows 笔记本合上盖子再打开,网卡会经历一个断开和恢复的过程,之前的 TCP 连接状态全部作废。如果你没有配置 keepalive,SSH 客户端可能要过很久才能发现连接已经断了,这段时间里终端就是卡死的状态。
第四类比较隐蔽,是密钥代理(ssh-agent)和转发链路的断裂。后面我会单独讲,这里先提一句:如果你配置了 SSH agent forwarding,连接断掉之后,agent socket 也会失效,重连时可能直接导致密钥认证失败。
1.2 掉线重连和会话持久化,是两个维度的事
很多人的误区是:我只要在客户端设置自动重连,就能"恢复现场"。其实不对。自动重连解决的是"重新登录到服务器",但登录进去之后你面对的是一个全新的 shell,之前的命令历史、当前目录、正在跑的进程,全都不在了。真正能让你"回到当时现场"的,是会话持久化,也就是在服务器端把终端会话完整保存下来,等重连之后重新挂载上去。
打个比方:掉线重连像是你被踢出直播间后重新挤进去,看到的还是当前直播内容;而会话持久化像是你把直播暂停了,重新进来后还能从暂停的位置继续看。两者缺一不可。在 Windows 上做 SSH 运维,最理想的效果是:网络断了我自动重连,重连后自动挂载回之前的 tmux 会话,中间的任务一直没停。这套组合拳我用了很久,基本可以做到"把远程终端当成本地窗口用"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 客户端保活:把 OpenSSH 配置到"尽量不掉线"
2.1 OpenSSH 客户端核心参数:ServerAliveInterval 和 ServerAliveCountMax
Windows 10/11 自带的 OpenSSH 客户端,配置文件在 C:\Users\你的用户名\.ssh\config。如果没有这个文件,自己新建一个就行。我推荐所有人都把下面这段配置放进去,不管你是直连服务器还是通过跳板机。
code复制Host *
ServerAliveInterval 15
ServerAliveCountMax 3
TCPKeepAlive yes
ConnectTimeout 10
ExitOnForwardFailure yes
逐个解释一下。ServerAliveInterval 15 表示每隔 15 秒,客户端会通过 SSH 加密通道发送一个"我还在"的空包给服务器。注意,这个包不是 TCP 层面的 keepalive,而是 SSH 应用层的心跳,走的是加密隧道,所以中间设备更难把它识别成空闲流量。ServerAliveCountMax 3 的意思是,如果连续 3 个心跳包发出去都没有收到服务器的响应,客户端就认为连接已经断了,主动终止本次连接。
这两个参数放一块儿的效果是:最多 15 乘 3,也就是 45 秒左右,客户端就会判定连接超时,而不是干等着不吭声。对后面的自动重连脚本来说,这个"及时判定"非常重要,因为它决定了脚本能多快进入重连流程。如果你网络环境特别差,可以把间隔调到 10 秒甚至 5 秒;如果是在稳定的服务器机房内网,60 秒也没问题。我自己一般用 15 秒,兼顾实时性和流量开销,实测下来很稳。
TCPKeepAlive yes 是让 SSH 底层也启用 TCP keepalive。虽然它和 ServerAlive 功能有点重叠,但两者机制不同,TCP keepalive 是用来探测底层链路通不通的,而 ServerAlive 是应用层心跳。两个都开着,掉线感知速度最快。
还有个参数容易被忽略:ConnectTimeout 10。它控制的是建立连接时的超时时间,单位是秒。默认情况下,如果对方 IP 不可达,SSH 可能要等很久才报错。设置成 10 秒,最多等 10 秒,连不上就立刻退出,配合重连脚本特别好用。
2.2 服务器端也要配合:ClientAliveInterval 参数
客户端配置保活只是单方面的努力,服务器端也得调整,否则服务器可能在你没操作的时候主动掐断连接。编辑服务器的 /etc/ssh/sshd_config,找到或添加以下参数:
code复制ClientAliveInterval 60
ClientAliveCountMax 4
ClientAliveInterval 60 表示服务器每 60 秒向客户端发送一次存活探测,ClientAliveCountMax 4 表示最多容忍 4 次未响应,也就是 240 秒之后判定客户端失联,清理连接。和客户端的 ServerAlive 比起来,这个值可以设置得宽松一些,因为它的作用是清理真正死掉的连接,而不是防掉线。
我一般建议两者配合:客户端 15 秒心跳,服务器 60 秒探测。这样即使网络波动导致客户端的心跳包中途丢失,服务器的探测也会起到兜底作用。改完配置记得执行 systemctl restart sshd 或者 /etc/init.d/ssh restart,不用多说了吧。
2.3 PuTTY、Bitvise 等图形工具的保活设置
如果你不习惯用命令行 OpenSSH,而是用 PuTTY 或者 Bitvise SSH Client,保活设置也很简单。PuTTY 在 Category 列表里找到 Connection,右边有个 Sending of keepalives,填入间隔秒数,比如 10,然后保存到你常用的 Session 里就行。Bitvise SSH Client 则是在 Session 属性窗口的 Options 选项卡里,勾选 Send keepalive every 并填入秒数。
这里多说一句:图形工具的好处是点点鼠标就能配置,但对自动化场景没用。我自己的经验是,日常临时连服务器可以用图形工具,但凡是需要长时间跑任务、或者需要脚本化重连的场景,一律用命令行 OpenSSH 加配置文件。原因很简单:命令行可以写成脚本、可以判断退出码、可以自动重连,图形工具做不到。
3. 自动重连:脚本、终端与工具的实操方案
3.1 PowerShell 循环重连脚本,最灵活的方案
配置好 keepalive 之后,连接断掉时 SSH 客户端会快速退出,但退出之后你还是要手动重新连接。真正省心的方案是写一个自动重连脚本。Windows 上我首选 PowerShell,因为原生支持,不需要安装额外环境。
下面这个脚本是我实际在用的,逻辑非常简单直接:
powershell复制param(
[string]$SshHost = "myserver",
[string]$SshUser = "root",
[int]$RetryDelay = 5,
[int]$MaxRetries = 0 # 0 表示无限重试
)
function Write-Log {
param([string]$Msg)
Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] $Msg"
}
$retryCount = 0
while ($true) {
Write-Log "正在尝试连接 ${SshUser}@${SshHost} ..."
ssh "$SshUser@$SshHost"
$exitCode = $LASTEXITCODE
if ($exitCode -eq 0) {
Write-Log "SSH 会话正常退出,脚本结束。"
break
}
$retryCount++
Write-Log "连接异常断开,退出码: $exitCode,重试次数: $retryCount"
if ($MaxRetries -gt 0 -and $retryCount -ge $MaxRetries) {
Write-Log "已达到最大重试次数,脚本结束。"
break
}
Write-Log "等待 $RetryDelay 秒后重连..."
Start-Sleep -Seconds $RetryDelay
}
这段脚本的核心逻辑是:调用 ssh 命令,然后检查 $LASTEXITCODE。如果用户是手动输入 exit 正常退出,退出码是 0,脚本就不该继续重连;如果是因为网络断开、连接被重置,SSH 会返回非 0 退出码,最常见的是 255,脚本就进入重试流程。这个退出码判断非常关键,不加的话,你手动 exit 之后脚本还会傻乎乎地重连,体验极差。
把脚本保存为 ssh-reconnect.ps1,然后执行:
powershell复制.\ssh-reconnect.ps1 -SshHost myserver -SshUser root -MaxRetries 10
-MaxRetries 0 表示无限重试,适合网络极其不稳定的场景。你也可以把这段函数写进 PowerShell 的 $PROFILE 文件里,这样打开 PowerShell 就能直接用 sshre myserver 这种简写命令。
关于限次重连我还想多说一句:无限重试看上去很爽,但有时候会变成灾难。如果服务器真的挂了,脚本会每 5 秒刷一次日志,把你的终端淹没。所以我个人习惯设置一个合理的重试上限,比如 20 次,超过就退出,等服务器恢复了再手动执行。
3.2 Windows Terminal 配置自动执行重连脚本
Windows Terminal 是一个非常推荐的 Windows 终端应用,配合上面的 PowerShell 脚本可以做到开箱即用的效果。你可以在 Windows Terminal 的设置(Ctrl+,)里新增一个 profile,直接指向你的重连脚本。
在 settings.json 的 profiles 数组里加一段:
json复制{
"name": "ssh-myserver",
"commandline": "powershell.exe -NoExit -NoProfile -Command \"& 'D:\\scripts\\ssh-reconnect.ps1' -SshHost myserver -SshUser root\"",
"hidden": false
}
这样你在 Windows Terminal 的下拉菜单里点一下,就会直接启动一个自动重连的 SSH 会话,断开后自动等 5 秒重连。配合标签页功能,我可以在一个窗口里同时开着多台服务器的连接,每台都是自动重连的模式。
还有一个小技巧:在 Windows Terminal 的 actions 里绑定一个快捷键,比如 "command": {"action": "newTab", "profile": "ssh-myserver"},然后 "keys": "ctrl+shift+s"。这样任何时候按 Ctrl+Shift+S 就能快速弹出一个新的远程连接标签页,非常顺滑。
另外,如果你用 VSCode 的 Remote-SSH 插件,也可以在扩展设置里开启自动重连。VSCode 的 Remote-SSH 本身有一定程度的重连机制,但实际体验比较玄学,网络闪断很容易导致整个窗口需要重新加载。我的建议是:VSCode Remote-SSH 适合写代码和调试,长任务别在里面跑,还是老老实实开终端跑 tmux。
3.3 现成工具横向对比:MobaXterm、Bitvise、Xshell
除了自己写脚本,Windows 上也有很多现成的 SSH 客户端自带掉线重连功能。我用过的几个做一个简单对比。
MobaXterm 是我用下来最顺手的图形 SSH 客户端。它的 Session 设置里有 SSH keepalive 选项,还能设置断线后自动重连,而且重连是基于会话的,重连后能保留你之前的标签页布局。MobaXterm 自带 SFTP 面板,传文件、看日志很方便。缺点是免费版有会话数量限制,会话多了会让你付费。
Bitvise SSH Client 也是老牌工具,稳定性很强,它的 Session 属性里有重连选项,还支持保存密码或密钥自动认证。我个人感觉 Bitvise 更适合被当成一个跳板工具,通过本地端口转发来访问内网服务,它的隧道管理比 MobaXterm 更清晰。
Xshell 的"保持会话活跃"和自动重连功能也不错,界面简洁,但免费版只允许个人使用,商用要付费。
我的建议很明确:如果你只是偶尔连几台服务器,用 MobaXterm 或者 Xshell 就够了;如果你像我一样需要长时间挂任务、跑批量操作、做自动化,一定要把命令行脚本这套搞起来。图形工具的重连本质上是"帮你重新登进去",它不会帮你恢复 tmux 会话,所以别指望它能替代持久化方案。
4. 服务器端会话持久化:tmux 与 screen 的正确用法
4.1 tmux:为什么它最适合"长任务"
前面反复提到恢复"现场",真正能在服务器端实现这个的,就是 tmux。tmux 是终端复用器,它运行在服务器上,会在后台持有一个或多个终端会话。你通过 SSH 登录进去之后,只是"接入"了 tmux 创建的会话;即使 SSH 断掉,tmux 本身还在服务器后台运行,会话里的进程完全不受影响。这正好和掉线重连互补:重连负责把 SSH 通道拉起来,tmux 负责让你回到原来的终端现场。
tmux 的基本概念有三个:session、window、pane。一个 session 是一整套终端状态,里面有多个 window(就像浏览器的标签页),每个 window 可以再分成多个 pane(分屏)。对于日常使用,你只需要记住 session 这一个概念就够了。
建立一个新的 tmux 会话并立即接入:
bash复制tmux new -s work
这个命令会创建一个名为 work 的会话,并让你进入 tmux 环境。之后你在里面执行长任务,比如 npm run build、python train.py、tail -f 等。接着按 Ctrl+B 然后按 D,脱离会话(detach)。注意,脱离之后任务还在跑。
重新接入某个已存在的会话:
bash复制tmux attach -t work
查看当前所有会话:
bash复制tmux ls
这三个命令加起来,就是会话持久化的全部核心。我建议每个经常远程操作的人,把建立会话变成肌肉记忆:凡是需要长时间运行的命令,一律先 tmux new -s 会话名,再在里面跑。跑完也不退出,直接 detach。下次连接过来 tmux attach 就完事。
4.2 tmux 常用配置和快捷键
tmux 默认的快捷键前缀是 Ctrl+B,这个组合键在 Windows 上有个小麻烦:因为它和 VSCode 或其他终端的某些快捷键冲突,而且小拇指够着比较费力。我改成了 Ctrl+A,在 ~/.tmux.conf 里加:
code复制set -g prefix C-a
unbind C-b
bind C-a send-prefix
然后加上提高使用体验的几行配置:
code复制set -g mouse on
set -g history-limit 50000
set -g default-terminal "screen-256color"
set -s escape-time 0
bind r source-file ~/.tmux.conf \; display "config reloaded"
mouse on 允许用鼠标滚轮查看历史输出,这在 Windows Terminal 里非常实用,否则默认操作很别扭。history-limit 50000 把每个 pane 的历史缓存扩到 5 万行,拉日志再也不会只看到最后几屏。
常用快捷键,我整理了一个速查表:
| 操作 | 快捷键 |
|---|---|
| 新建 window | Ctrl+B 然后 C |
| 切换下一个 window | Ctrl+B 然后 N |
| 横向分屏 | Ctrl+B 然后 % |
| 纵向分屏 | Ctrl+B 然后 " |
| 脱离会话(detach) | Ctrl+B 然后 D |
| 查看所有窗口 | Ctrl+B 然后 W |
| 关闭当前 pane/window | Ctrl+D 或 exit |
还有一点容易踩坑:tmux 里的剪贴板和 Windows 系统剪贴板不是互通的,如果你在 tmux 里复制代码,默认只是复制到了 tmux 的缓冲区。配合 mouse on 之后,按住 Shift 再选中文本,才能直接选中并复制到 Windows 剪贴板,这个还好。真正要小心的是 tmux 内滚屏和复制模式,新手很容易卡在里面,多按几次 q 退出复制模式就行。
4.3 轻量替代方案:screen
屏幕复用这个词,老运维肯定熟,说的就是 GNU screen。tmux 没出现之前,screen 是唯一的选择。现在虽然 tmux 功能更强,但有些老旧服务器上未必装了 tmux,而 screen 几乎是系统标配。
列几个最基础的命令:
bash复制screen -S work # 新建一个名为 work 的会话
screen -d # 脱离当前会话
screen -R work # 重新接入 work 会话
screen -ls # 列出所有会话
基本思路和 tmux 一样,会话在后台由 screen 维护,SSH 断不断不影响它。如果你同时装了 tmux 和 screen,我更推荐 tmux,因为它分屏、窗口管理、配置更现代化,screen 的分屏体验比较老旧。但如果目标是"在已有系统上赶紧把持久化做起来",screen 也能胜任。
4.4 组合拳:重连脚本自动挂载 tmux 会话
到了这一步,我们可以把前面所有东西串起来,形成一个真正省心的方案:SSH 重连成功后,自动 attach 到指定的 tmux 会话,如果没有该会话就自动新建一个。核心命令是:
bash复制ssh myserver -t 'tmux attach -t work 2>/dev/null || tmux new -s work'
-t 参数给远程分配一个伪终端,这在执行 tmux 这种交互式命令时是必须的。命令的逻辑是:先尝试 attach 到 work 会话,如果会话不存在(报错被重定向到 /dev/null),就新建一个。这样每次重连,你都能回到同一套终端现场。
把这条命令集成到前文的 PowerShell 脚本里,可以改造一下脚本,让它接受一个"远程命令"参数:
powershell复制param(
[string]$SshHost = "myserver",
[string]$SshUser = "root",
[string]$RemoteCmd = "tmux attach -t work 2>/dev/null || tmux new -s work",
[int]$RetryDelay = 5
)
while ($true) {
Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 尝试连接 ${SshUser}@${SshHost} ..."
ssh "$SshUser@$SshHost" -t $RemoteCmd
$exitCode = $LASTEXITCODE
if ($exitCode -eq 0) {
Write-Host "SSH 会话正常退出,脚本结束。"
break
}
Write-Host "连接中断,退出码: $exitCode,等待 $RetryDelay 秒..."
Start-Sleep -Seconds $RetryDelay
}
这样你在 Windows 上执行这脚本,它会持续保持一个远程终端,且始终挂载在服务器的 work 会话上。无论网络怎么闪断,最多几十秒后就能自动回到原任务现场。长时间跑任务的时候,我基本就是开一个这样的终端窗口,然后该干嘛干嘛,完全不用盯着。
5. 实际战斗中的进阶技巧与踩坑记录
5.1 密钥认证、agent 转发与重连的坑
自动重连有个前提:连接本身能免密快速建立。如果你每次重连都要输入密码,那自动重连就没意义了。所以在 Windows 上配置 SSH 密钥是第一优先级。网上教程很多,我只捡重点说。
执行 ssh-keygen -t ed25519 -C "your_email",然后 ssh-copy-id user@host。Windows 上没有 ssh-copy-id 这个命令,但你可以用这个等效操作:
bash复制type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@host "cat >> ~/.ssh/authorized_keys"
密钥搞定之后有个坑:如果你在 ~/.ssh/config 里开启了 agent forwarding(ForwardAgent yes),断线重连时 agent socket 会失效,导致某些依赖 agent 认证的跳板登录失败。我遇到的情况是,本地把 SSH agent 配置成了多级跳转,结果笔记本休眠再唤醒之后,agent 里的密钥服务可能已经被系统杀掉了,重新连跳板机时直接认证失败。
排查方法很简单,重连失败时先跑一下:
bash复制ssh-add -l
如果提示 The agent has no identities.,说明 agent 里没有加载密钥,或者 agent 根本没启动。Windows 上的 OpenSSH Agent 服务需要手动启动:
powershell复制Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
ssh-add C:\Users\你的用户名\.ssh\id_ed25519
这一步做完,agent 在开机后会自动启动并加载密钥,自动重连脚本才能真正顺畅跑起来。如果还不行,就去 services.msc 里确认 OpenSSH Authentication Agent 服务正在运行。
5.2 网络切换、休眠唤醒后的"假死"连接
前面提过,Windows 笔记本休眠唤醒或切换网络后,SSH 终端经常处于"假死"状态,你输入任何命令都没反应,但终端也没退出。这其实是 TCP 层还在傻等,不知道底层连接已经没了。
配置了 ServerAlive 之后,假死状态最长持续 45 秒(15 乘 3),之后 SSH 客户端会主动断开。如果你用的是我前面写的重连脚本,断开后 5 秒就会自动重连,整个体验会好很多。但如果你是裸 SSH 接入,没有心跳也没有重连脚本,假死之后就一个招:按 Ctrl+C 或 Ctrl+] 进入 SSH 转义命令行,然后输入 ~. 强制退出。~. 这个组合是 OpenSSH 的隐藏技能,很多老手都不知道,但确实是在假死状态下最快速的退出方式。
另外提醒一点:Windows 的休眠策略有时候很坑。如果你长时间不操作,系统会进入睡眠,网卡直接断电,等恢复时一切连接作废。我有一次跑一个 12 小时的模型训练,忘了把电源计划改成"从不睡眠",睡了一觉醒来发现训练在 3 小时前就断了。后来我养成了习惯,凡是长任务挂机,先把 Windows 电源计划改成"高性能"或至少让插电状态下永不休眠,再用 tmux 兜底,双保险。
5.3 常见问题速查表
| 症状 | 常见原因 | 处理方法 |
|---|---|---|
| 连接几分钟后自动断开 | 服务器 ClientAlive 或中间防火墙空闲超时 | 客户端配置 ServerAliveInterval 15,必要时调低服务器超时参数 |
| 长时间没操作,回来后终端卡死 | 空闲连接被回收,TCP 假死 | 配置 keepalive,断线后用重连脚本恢复 |
| 重连后之前的任务找不到了 | 没有使用 tmux/screen | 养成在 tmux 里跑长任务的习惯 |
| 重连提示认证失败 | ssh-agent 服务未启动或密钥未加载 | 启动 ssh-agent 服务并 ssh-add 加载密钥 |
| 睡眠唤醒后连不上 | 网卡连接已失效 | 关闭休眠或使用含自动重连的脚本;避免被坑 |
| 手动 exit 后脚本还一直重连 | 没有判断退出码 | 检查 $LASTEXITCODE,为 0 时退出循环 |
| tmux attach 报错 no sessions | 会话不存在或被删了 | tmux ls 查会话,没有就 tmux new -s 新建 |
5.4 Windows 特有的路径与转义问题
Windows 上写脚本,引号和转义是最容易出幺蛾子的地方。PowerShell 调用 ssh 时,如果远程命令包含空格和嵌套引号,很容易被 PowerShell 和 ssh 两层解析搞乱。我的经验是,尽量把复杂的远程命令写成插件脚本放到服务器上,而不是在命令行里硬塞引号。比如你可以在服务器上创建一个 ~/connect.sh,内容就是 tmux 的 attach/new 逻辑,然后 Windows 端脚本只执行 ssh myserver -t ~/connect.sh。这样既避免转义地狱,也方便在服务器端维护。
另外,Windows 的 ssh 客户端可能会读错配置文件路径。如果你发现自己改了 ~/.ssh/config 但不生效,先确认你执行 ssh 时用的用户目录是不是对的,可以用 ssh -G myserver 可以看到实际生效的配置参数。Git for Windows 自带的 ssh 和系统 ssh 可能版本不同,行为也有细微差异,建议统一使用 C:\Windows\System32\OpenSSH\ssh.exe 这个系统自带的版本,避免各种兼容问题。
5.5 会话安全的兜底建议
最后补充一点和建议。tmux 会话有个特性:如果服务器重启,tmux 进程也没了,会话自然消失。对于特别关键的长任务,最好在 tmux 里配合日志重定向,把输出实时写到文件。比如:
bash复制tmux new -s train -d 'python train.py 2>&1 | tee /tmp/train.log'
这样即使 tmux 会话丢失,你也能从日志文件里看到任务跑到哪一步。我个人还会配合计划任务做定时心跳巡检,发现 tmux 会话没了就自动重启任务,不过这就是另外一套体系了,这里不展开。
回到 Windows 本身的配置:建议把 Windows Terminal 的默认终端设为 PowerShell 7,并在 $PROFILE 里加载好前面说的重连函数。这样每次打开终端,输入一个简短命令就能连上远程服务器并自动进入 tmux 现场。我目前的操作习惯是:上班打开电脑,启动一个 Windows Terminal 标签页,执行 sshre,然后这个标签页就挂在远程的 work 会话上,一整天都不会丢。中间就算网络切了、笔记本睡了,开会回来再瞄一眼,它已经自己重连好了。
这套从客户端保活、到自动重连、再到服务器端 tmux 持久化的组合拳,确实解决了我在 Windows 上远程操作最大的痛点。虽然不是那种"断网犹如没断"的魔法,但做到"断了也能自动回来、回来还能接上现场",已经是 Windows 环境下最舒服的体验了。
