SSH 隧道管理器
Tauri 2 · Rust · React 19v1.0.2

给 ssh -L
一个能看见的界面

在 Windows 与 macOS 上管理到 Linux 服务器的本地端口转发:新建、观察、关闭。参数不用背,失败原因不用猜,关掉窗口也不会留下一堆没人管的进程。

Windows 10/11 · macOS 12+ · MIT License

Topologyssh -L
  1. 本机 · 你的工具
    127.0.0.1:4096
    TCP 监听中 · 每 150ms 探测
  2. ssh -N -L
  3. 本机 · ssh 客户端
    已认证的加密通道
    进程名必须是 ssh
  4. TCP over SSH
  5. 服务器 · dev
    localhost:5432
    从服务器视角解析
ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:4096:localhost:5432 dev

界面

列表、状态与操作,一屏之内

表格只放你会看的东西:ID、Host、本地与远程地址、PID、创建时间、状态。运行中的行可以关闭,已停止的行可以启动、修改或删除。

SSH 隧道管理器主窗口:隧道列表显示五条记录,状态均为已停止SSH 隧道管理器主窗口:隧道列表显示五条记录,状态均为已停止
主窗口 · 五条记录

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 注入子进程环境。

下载

安装包发布在 GitHub Releases

全部发行版

Windows 10 / 11 · x64

…_1.0.2_x64-setup.exe(NSIS) · …_1.0.2_x64_en-US.msi(WiX)

前往下载 →

macOS 12+ · Apple Silicon

…_1.0.2_aarch64.dmg

前往下载 →

安装包未做代码签名:Windows 可能弹出 SmartScreen 提示,macOS 首次打开需要右键 →「打开」。从源码构建见开发与发布。

开始

第一次用?五步就能跑通一条转发。

快速开始