Skip to content
FlynnWanPublic

About

Native macOS SSH port forwarding app with SSH config and rule groups.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

SSHT

原生 macOS SSH 端口转发工具,使用 SwiftUI 和系统 /usr/bin/ssh,无需第三方依赖。要求 macOS 14 或更新版本。

下载

在 GitHub Releases 下载 Apple Silicon(ARM64)安装包,解压后将 SSHT.app 放入「应用程序」。Release 安装包由 GitHub Actions 构建和上传。

运行

双击 dist/SSHT.app,或在项目目录执行:

open dist/SSHT.app

重新构建(需要 Xcode Command Line Tools):

./scripts/build.sh

使用

  1. 点击「添加规则」,填写规则名称、转发方式、监听地址和端口、目标地址和端口。
  2. 添加规则中的「SSH 连接」始终从 SSH config 读取 Host 别名,默认读取 ~/.ssh/config。可以选择其他 config 文件或点击刷新。选中主机后,用户名、端口、密钥和跳板机直接使用文件中的配置,不复制旧连接的覆盖值。每次打开弹窗及提交时都会重新读取。
  3. 添加后规则处于已停止状态。在列表点击「启动」,或在右侧详情点击「启动转发」。每条规则独立运行,可单独停止;工具栏「全部开启」启动所有未运行的规则(不受搜索和筛选影响),跳过已运行或正在连接的规则;「全部停止」停止应用启动的所有转发。菜单栏也提供这两个操作。
  4. 选中规则,在右侧编辑名称、转发方式、监听和目标设置。修改会自动保存,运行中的规则会锁定这些字段,点击「停止并编辑」后即可修改。
  5. 右侧「SSH 连接」打开共享连接设置,可更改主机、用户名和私钥,并填写本次连接密码或密钥口令。密码不会保存;留空时使用 SSH Agent / 默认密钥,需要认证时显示系统输入框。

同一 SSH 连接下可以有多条规则。修改该连接的主机、用户名等设置前,需要停止关联规则。旧版本的连接和规则文件会自动兼容。

搜索支持规则名、SSH 主机、监听端口及目标地址;可按运行状态筛选、按名称或端口排序。底部状态栏显示实际运行数量,日志入口快捷键为 ⌘L,添加规则为 ⌘N,设置为 ⌘,。

本地转发示例

服务器上的 MySQL 监听 127.0.0.1:3306:

字段 值
转发方式 本地转发
监听地址 127.0.0.1
监听端口 13306
目标主机 127.0.0.1
目标端口 3306

启动后,数据库客户端连接本机 127.0.0.1:13306。目标地址是从 SSH 服务器所在网络访问的地址。

远程转发把服务器的监听端口转到本机侧目标。服务器需要允许 TCP 转发;远程监听范围取决于服务器 GatewayPorts 设置。SOCKS 模式支持 SOCKS4 / SOCKS5,目标由使用代理的应用决定。

OpenSSH 不支持 UDP 转发,因此设计中的 UDP 选项仅提示不可用,不会创建无法工作的 UDP 规则。

设置

  • 登录时启动:通过 macOS SMAppService 注册当前应用,系统要求批准时,可打开登录项设置。此项只在用户手动启用时注册;临时签名或应用位置可能影响注册,失败时会显示错误。
  • 启动后恢复转发:恢复上次退出时仍在运行的规则,默认关闭。
  • 关闭窗口后在菜单栏运行:始终开启。关闭窗口会保留应用和转发,菜单栏图标一直显示;可从图标菜单重新打开窗口、启停规则或退出应用。只有选择「退出端口转发」或使用 ⌘Q 才退出并停止转发。旧版已保存的关闭此选项的设置不再生效。
  • 应用外观:支持跟随系统、浅色和深色。
  • 连接日志:默认记录状态与错误,可关闭文件记录;历史日志保留 1 / 7 / 30 天。设置和启动时清理过期日志。
  • 每条规则自动启动:在规则详情单独启用。只对下次应用启动生效,添加时不会立即连接。

配置与 SSH 行为

  • 连接和规则保存在 ~/Library/Application Support/SSHT/profiles.json,偏好设置在同目录的 preferences.json,文件权限为仅当前用户可读写。
  • 历史日志保存在该目录的 Logs/,密码和私钥口令不会写入配置或应用日志。
  • 读取具体 Host 别名,支持 Include 和通配文件路径。通配主机规则、Match、ProxyJump 等由 OpenSSH 自身执行;手动模式不读取个人 config。
  • 每条规则使用独立 SSH 进程,config 内已有的转发设置也会沿用。若这些设置与其他规则占用同一端口,SSH 会报告冲突,需修改 config 或使用独立的连接配置。
  • 首次连接使用 StrictHostKeyChecking=accept-new,已有主机密钥变化将导致连接失败。
  • 默认只监听 127.0.0.1,可以改为其他接口。IPv6 输入不需要方括号。
  • 状态在 OpenSSH 建立控制套接字后显示「运行中」。这表明 SSH 连接已建立;具体目标服务是否可用,需通过相应客户端访问确认。
  • 网络中断由 SSH 保活机制检测,不自动重连。可从日志查看退出原因并手动再次启动。
  • 退出应用会停止应用启动的所有 SSH 进程。
  • 应用采用本机临时签名,尚未进行 Apple 公证。

UI 来源

主界面、添加规则和设置弹窗来自 Figma 设计。布局、色值和图标采用设计原始数据,图标的 SVG 原件及 Retina PNG 位于 Sources/SSHT/Resources/Figma/;应用运行时不请求 Figma 临时资源。

保留 macOS 原生窗口按钮、菜单、文件选择器和切换控件。中文使用系统字体,端口和地址使用系统等宽字体。为原有 SSH 功能补充连接设置入口;深色外观沿用同一布局。

验证

./scripts/test.sh

测试需要 Swift 6 或更新版本(Swift Testing)。覆盖转发参数、IPv6、非法端口、重复监听、主机格式、config Include、旧配置迁移、单条规则进程、停止连接中进程、偏好设置、日志保留与密码不落盘。测试不会连接外部服务器。

SSH 行为参照 ssh 手册 和 ssh_config 手册。

规则支持自定义分组:在添加规则或右侧详情的「分组」栏输入名称即可创建,也可选择已有分组。旧规则默认归入「默认分组」。列表按组展示,可点击「开启分组」「停止分组」操作整组规则;搜索或状态筛选不会缩小操作范围。右键规则可移动到已有分组,运行中的规则也可调整分组。菜单栏提供相同的分组启停操作。

分组默认全部折叠,点击分组标题或左侧箭头展开/折叠。折叠时仍可开启或停止整组转发;展开状态仅在本次应用运行期间保留。

启动本地转发前检查监听端口:若现有 SSH 进程的启动参数(主机、config 路径、用户/端口/密钥及明确的 -L 转发目标)与规则一致,显示「外部转发」,全部开启和分组开启会跳过它;无法确认的一般进程或不同转发显示「端口占用」,日志显示占用程序及 PID,可修改端口或用原启动方式停止旧转发。软件每 3 秒复查已发现的占用,端口释放后回到已停止状态,不自动启动。停止和退出只管理软件创建的 SSH 进程。该识别基于进程启动参数,不验证外部 SSH 的远程服务健康;通过 config 隐式设置或其他方式创建、无法核对明确转发参数的连接会按占用处理。远程转发的端口由远端 SSH 服务处理。

发布

版本号维护在 VERSION。提交修改后推送对应的 vX.Y.Z 标签,即触发 .github/workflows/release.yml:在 macOS ARM64 runner 上测试、编译、验证架构与签名、打包,然后自动发布安装包及 SHA-256 校验文件。工作流要求标签版本与 VERSION 一致;无需上传本地构建产物。

也可以在 Actions 的「Release macOS ARM64」工作流中点击 Run workflow,输入 v0.0.1。手动发布会将当前工作流提交打上对应标签,再由 Actions 上传构建产物。

About

Native macOS SSH port forwarding app with SSH config and rule groups.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages