Tauri 2 · Rust · React 19v1.0.2
给 ssh -L
一个能看见的界面
在 Windows 与 macOS 上管理到 Linux 服务器的本地端口转发:新建、观察、关闭。参数不用背,失败原因不用猜,关掉窗口也不会留下一堆没人管的进程。
Windows 10/11 · macOS 12+ · MIT License
- 本机 · 你的工具127.0.0.1:4096
- ssh -N -L
- 本机 · ssh 客户端已认证的加密通道
- TCP over SSH
- 服务器 · devlocalhost:5432
ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:4096:localhost:5432 dev界面
列表、状态与操作,一屏之内
表格只放你会看的东西:ID、Host、本地与远程地址、PID、创建时间、状态。运行中的行可以关闭,已停止的行可以启动、修改或删除。


01 — 记住参数
-L 的四个字段、-N、ExitOnForwardFailure 每次都要查一遍。这里只有 Host、远程地址、本地地址和绑定地址。
02 — 确认真的通了
认证通过不等于转发可用。应用以本地端口真正进入监听作为成功判据,失败时给出具体原因,而不是一句「启动失败」。
03 — 关得干净
关闭窗口只是隐藏到托盘。隧道记录一直保留,PID 清零;下次点「启动」即可复用,不必重填。
- 启动成功
- 本地 bind:port 真正进入监听才算成功(每 150ms 探测一次)。ssh 只有认证通过后才会绑定 -L,所以慢服务器不会提前报成功。
- 启动失败
- 进程退出时即时解析 stderr 归因:端口占用、认证失败、连接被拒、主机名无法解析…… 或 18 秒内始终没有监听。
- 关闭
- 先优雅终止,最多等 1.8 秒,再强制结束。记录保留、PID 清零,之后随时可以「启动」复用同一份配置。
- 密码
- 只经子进程环境变量交给 ssh,不写 tunnels.json、不进日志;预检失败会在密码框里直接提示,而不是先报成功再失败。
- 进程校验
- 终止前确认目标进程名确实是 ssh,避免 PID 被系统复用后误杀别人的进程。
实际执行
它到底跑了什么
没有内嵌 SSH 库,就是调用系统 ssh。因此 ~/.ssh/config、密钥、ssh-agent、known_hosts 全部照旧生效。
终端 · 单行执行zsh / pwsh
ssh -N \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
-o ConnectTimeout=15 \
-o StrictHostKeyChecking=accept-new \
-o BatchMode=yes \
-L 127.0.0.1:4096:localhost:5432 \
dev上面按行折开只为便于阅读,实际以单行参数数组传给 ssh。使用密码认证时,BatchMode=yes 会换成 NumberOfPasswordPrompts=1,密码经 SSH_ASKPASS 注入子进程环境。
开始
第一次用?五步就能跑通一条转发。