Sshwifty 配置参数详解:sshwifty.conf 全项精讲
Sshwifty 0.4.12 配置详解:文件与环境变量双体系加载顺序、SharedKey 实测回显、Servers 超时全表、Presets 预设锁定实测、OnlyAllowPresetRemotes 行为实录与 SS...环境变量对照表。
Sshwifty 配置参数详解:sshwifty.conf 全项精讲
本文是 Sshwifty 专栏第三篇。所有参数行为均基于 0.4.12-beta-release 的官方配置样例与源码,并经本地真实服务实测交叉验证(实测回显在文中以"实测"标注)。两套配置体系(配置文件与环境变量)的全部可调项一次讲清。
一、两套配置体系与加载顺序
Sshwifty 支持两种配置方式,加载优先级为:默认路径配置文件 → 环境变量兜底(来源:官方 README "Configuration" 节,2026-10-30 查询)。
配置文件按以下默认路径顺序查找,命中即停:
- 工作目录
sshwifty.conf.json /etc/sshwifty.conf.json~/.sshwifty.conf.json
实测:将自定义配置文件放置于 /etc/sshwifty.conf.json 后重启服务,启动日志逐行回显:
[INF] Sshwifty: Initializing
[INF] Sshwifty > Configuration > Redundant: Loading configuration from one of the default configuration files ...
[INF] Sshwifty > Configuration > Redundant: Configuration file "/etc/sshwifty.conf.json" has been selected
[INF] Sshwifty > Server (0.0.0.0:8182): Serving
若三个默认路径均未命中,则回退读环境变量;若指定了 SSHWIFTY_CONFIG 环境变量,则只从该文件加载(跳过默认路径)。若日志只出现 "Loading configuration from one of the default configuration files ..." 而 has been selected 指向了别的文件或没有出现,说明你的文件路径或 JSON 语法有问题——这是配置不生效时的第一排查点。
二、全局配置项
HostName
- 类型:字符串,默认
"" - HTTP Host 校验。留空接受任意 Host 头访问;设置后仅允许指定域名访问(可挡住按 IP 直扫)。若前面有反向代理,此值应与对外的 Host 一致。
SharedKey
- 类型:字符串,默认
"" - Web 界面预共享口令。留空表示公网免认证直进(跳过认证页),生产环境必须设置。
- 实测:口令错误时认证页回显:
AUTHENTICATION REQUIRED
Passphrase
Authentication has failed. Wrong passphrase?
Authenticate
- 该口令同时是 WebSocket 通道的准入票据:实测在未认证状态下发起 WebSocket,服务端日志回显:
Request ended with error: "/sshwifty/socket/verify": HTTP Error (403): To use Websocket interface, a valid Auth Key must be provided
DialTimeout
- 类型:整数(秒),默认 5
- 服务端向远程主机发起连接(拨号)的超时。实测样例中设为 10。上限受
Servers[].ReadTimeout约束。 - 实测:目标主机关闭时连接向导报错回显(DialTimeout 内未建立连接即失败):
Connection failed
dial tcp 10.89.60.3:2222: connect: connection refused
Socks5 / Socks5User / Socks5Password
- 类型:字符串
- 出站代理三件套。设置
Socks5后,所有到远程主机的连接改经该代理(如localhost:1080),另两项为代理认证凭据。适用于服务端与目标机之间有网络隔离、需经跳板出网的架构。
Hooks.before_connecting / HookTimeout
- 类型:数组 / 整数(秒),默认 30
- 连接前钩子:每项是一个 JSON 数组形式的命令(元素间映射为空格分隔的命令片段),在服务端按顺序执行;任一钩子非零退出即中止本次连接。钩子进程可读取注入的
SSHWIFTY_HOOK_REMOTE_TYPE(SSH/Telnet)与SSHWIFTY_HOOK_REMOTE_ADDRESS(目标地址)环境变量,并可通过SSHWIFTY_HOOK_DEADLINE(RFC3339 时间串)获知剩余执行时限。 - 钩子的标准输出对用户可见,标准错误进服务端日志。
- 官方两处安全警告(来源:官方配置样例注释,2026-10-30 查询):钩子与服务进程同权限运行,务必防范命令注入;所有传入钩子的输入都应视为未净化的。
- HookTimeout 是单个钩子的最长执行时间,超时即终止并视为失败。
三、Servers[] 监听实例配置
Servers 是数组,同一进程可并行开多个监听。各字段:
| 字段 | 类型/默认 | 说明 |
|---|---|---|
| ListenInterface | 字符串,样例 0.0.0.0 | 监听网卡。0.0.0.0 全部网卡;127.0.0.1 仅本机(配合反向代理) |
| ListenPort | 整数,样例 8182 | 监听端口 |
| InitialTimeout | 整数(秒),默认 10 | HTTP 初始握手必须在此时限内完成 |
| ReadTimeout | 整数(秒),默认 120 | 连接空闲多久后被服务端断开(心跳兜底之外的无活动上限) |
| WriteTimeout | 整数(秒),默认 120 | 服务端等待客户端可接收数据的最长时间,超时断开 |
| HeartbeatTimeout | 整数(秒),默认 15 | 心跳间隔时限,维持长连接活性 |
| ReadDelay | 整数,默认 10 | 读缓冲延迟(毫秒级微调,默认即可) |
| WriteDelay | 整数,默认 10 | 写缓冲延迟 |
| TLSCertificateFile | 字符串 | X.509 证书路径;与下一项同时配置后该监听直接以 HTTPS 服务 |
| TLSCertificateKeyFile | 字符串 | 证书私钥路径 |
| ServerMessage | 字符串 | 页脚公告,展示在 Web 界面底部 |
实测:ServerMessage 设为 "Lab environment. Unauthorized access is prohibited." 后,首页底部原样回显:
Lab environment. Unauthorized access is prohibited.
实测:环境变量方式下 SSHWIFTY_READTIMEOUT=0 等归零值生效时服务正常启动——0 表示使用内部默认值,而不是"无超时"。超时参数建议保持官方默认,仅在长连接被中间设备(代理/防火墙)误切时调大。
四、Presets[] 连接预设
预设是管理员下发给用户的一键连接清单,用户在 "Known remotes" 页签中选择。完整字段:
| 字段 | 说明 |
|---|---|
| Title | 预设显示名(实测回显 "Lab SSH Target") |
| Type | SSH 或 Telnet |
| Host | 目标地址,host:port 格式(如 10.20.30.40:2222) |
| TabColor | 标签页颜色,6 位十六进制(如 001100) |
| Meta.User | 预填登录用户名 |
| Meta.Encoding | 预填字符编码(utf-8、ibm866 等) |
| Meta.Authentication | 预设认证方式:Password、Private Key、或逗号组合 "Private Key,Password,Keyboard Interactive" |
| Meta.Private Key | 预置私钥。官方样例明确警告会以明文下发客户端,禁止在预设存放私钥 |
| Meta.Fingerprint | 预置主机指纹,命中后可跳过人工指纹确认 |
实测一:预设 Meta 中 "Authentication": "Password" 生效后,连接向导的认证复选框呈预设禁用态(用户不可改):
box 0 ["[]Authentication",false,true]
box 1 ["[]Authentication",true,true]
box 2 ["[]Authentication",false,true]
第三个布尔值即 disabled=true——预设锁定了认证方式,用户无需(也不能)再选。
实测二:预设中的 User/Encoding 会直接预填进连接向导对应字段,TabColor 渲染为 "Known remotes" 条目左侧色标。
安全提醒:预设中不要写 Meta."Private Key";Meta.Fingerprint 建议填写,可把"人工核对指纹"升级为"自动校验指纹"。
五、OnlyAllowPresetRemotes
- 类型:布尔,默认
false - 最硬的访问收敛开关。设为
true后,用户只能连接预设清单内的主机。 - 实测:置
true并重启服务后,点击加号的连接器菜单发生质变——New remote、Telnet、SSH手动入口全部消失,仅剩预设清单,并回显提示:
ESTABLISH CONNECTION WITH
New remote
Known remotes 0
PRESETS
SSH
Lab SSH Target
The operator has restricted the outgoing connections. You can only connect to remotes from the pre-defined presets.
一行提示语精确表达了策略:"操作者已限制出站连接,只能连接预定义预设中的远程主机"。做跳板入口、面向多人开放时建议开启,配合反向代理与 SharedKey 构成三层收敛(入口口令 → 出站白名单 → SSH 自身认证)。
六、环境变量对照表
以打包形态运行时,全部配置项均有对应环境变量(来源:官方交付物内置环境变量清单,2026-10-30 实测盘点)。配置文件命中时环境变量不生效;环境变量仅在文件缺失时兜底。
| 环境变量 | 对应配置项 | 实测盘点值 |
|---|---|---|
| SSHWIFTY_CONFIG | 强制指定配置文件路径 | (可选) |
| SSHWIFTY_HOSTNAME | HostName | 空 |
| SSHWIFTY_SHAREDKEY | SharedKey | q1w2e3r4 |
| SSHWIFTY_DIALTIMEOUT | DialTimeout | 10 |
| SSHWIFTY_SOCKS5 / _USER / _PASSWORD | Socks5 三件套 | 空 |
| SSHWIFTY_HOOK_BEFORE_CONNECTING | Hooks.before_connecting | 空 |
| SSHWIFTY_HOOKTIMEOUT | HookTimeout | 30 |
| SSHWIFTY_LISTENINTERFACE | Servers[].ListenInterface | 0.0.0.0 |
| SSHWIFTY_LISTENPORT | Servers[].ListenPort | 8182 |
| SSHWIFTY_INITIALTIMEOUT | Servers[].InitialTimeout | 0(用内部默认) |
| SSHWIFTY_READTIMEOUT | Servers[].ReadTimeout | 0 |
| SSHWIFTY_WRITETIMEOUT | Servers[].WriteTimeout | 0 |
| SSHWIFTY_HEARTBEATTIMEOUT | Servers[].HeartbeatTimeout | 0 |
| SSHWIFTY_READDELAY | Servers[].ReadDelay | 0 |
| SSHWIFTY_WRITEELAY | Servers[].WriteDelay | 0(官方拼写即少一个 R,照用即可) |
| SSHWIFTY_TLSCERTIFICATEFILE / _KEYFILE | TLS 证书与私钥 | 空 |
| SSHWIFTY_DOCKER_TLSCERT / _TLSCERTKEY | 打包形态专用:直接注入证书/私钥 PEM 内容 | 空 |
| SSHWIFTY_PRESETS | Presets(JSON 数组字符串) | 空 |
| SSHWIFTY_SERVERMESSAGE | Servers[].ServerMessage | 空 |
| SSHWIFTY_ONLYALLOWPRESETREMOTES | OnlyAllowPresetRemotes | 空 |
三个实测结论值得单独强调:
- 环境变量是"全有或全无"的兜底:实测一份完整走环境变量的实例,
SSHWIFTY_PRESETS留空时界面 "Known remotes" 显示0,与走文件配置且含预设的实例形成鲜明对比; SSHWIFTY_WRITEELAY官方拼写即缺少字母 R(对照配置文件字段WriteDelay),照官方拼写书写才能生效;SSHWIFTY_DOCKER_TLSCERT/SSHWIFTY_DOCKER_TLSCERTKEY直接接收 PEM 全文,免去挂载证书文件,适合临时证书场景。
七、文件配置与环境变量配置怎么选
| 维度 | 文件配置 | 环境变量配置 |
|---|---|---|
| 表达能力 | 完整(Presets、Hooks 嵌套结构自然表达) | Presets 需压缩为 JSON 字符串,易错 |
| 变更方式 | 改文件后重启服务 | 改环境后重建服务 |
| 可审计性 | 配置文件可入版本库,diff 清晰 | 分散在启动环境中 |
| 推荐度 | 生产首选 | 最小部署/临时验证 |
两套体系不要混用:文件一旦命中,环境变量全部失效(SSHWIFTY_CONFIG 指定的文件同理),混用只会增加排障成本。
八、本篇小结
配置体系的记忆锚点:全局项管"谁能进来"(SharedKey/HostName/Hooks),Servers 管"从哪儿服务"(监听/超时/TLS/公告),Presets 管"能去哪儿"(目标清单与认证预填),OnlyAllowPresetRemotes 管"是不是只能去那儿"。部署动作见 《Sshwifty Docker Compose 部署指南:从零搭建 Web 终端网关》,产品定位见 《Sshwifty 介绍与选型指南:浏览器里的 SSH/Telnet 终端》;日常操作与排障实录见《Sshwifty 使用与运维详解:连接管理、安全加固与排障实录》。
专栏导航:
- 《Sshwifty 介绍与选型指南:浏览器里的 SSH/Telnet 终端》
- 《Sshwifty Docker Compose 部署指南:从零搭建 Web 终端网关》
- 《Sshwifty 配置参数详解:sshwifty.conf 全项精讲》(本篇)
- 《Sshwifty 使用与运维详解:连接管理、安全加固与排障实录》