命令行客户端安装与运行
wssocks-ustb 是将 wssocks 命令行入口与 USTB VPN 插件注册连接起来的可执行程序。本页说明已在仓库中得到验证的安装方式、启动入口与命令解析行为;具体的 VPN 参数与代理子命令语法应以程序的 --help 为准。
目的与范围
面向希望通过终端使用客户端的用户和需要排查 CLI 启动过程的开发者。覆盖发行版获取、仓库文档给出的 Go 安装命令、入口程序初始化及错误处理。GUI 客户端和 macOS 原生客户端属于其他客户端主题;VPN 认证方式与代理协议实现不在本页展开。项目 README.md 将三者分别列为 cli、client-ui 和 swiftui-client。
概述
项目用途是在无法直接接入 USTB 校园内网时,通过基于 WebSocket 的 SOCKS5 代理应用 wssocks 与 USTB 插件访问内网;这是项目对整体能力的描述,并不意味着启动可执行文件就已经完成认证或建立代理。仓库说明 CLI 和 GUI 客户端均包含 wssocks 与本插件,并列出 CLI 的 Windows x64、macOS x64/arm64、Linux x64/arm64 平台支持范围。参见 README.md。
架构
Source: main.go
入口使用空白导入载入 wssocks 的 client/server 命令包及本项目的 version 命令包;init 创建 VPN 插件并向 wssocks 的 client 包注册 option、request 和 version 扩展,随后 main 指定程序名并将参数交给 cmds.Parse。图只表示入口文件中能直接核实的导入、创建、注册与调用关系;子命令内部如何建连不在已读取的实现范围内。main.go
安装与首次检查
README.md 给出两种获取 CLI 的路径:按文档所列的 Go 命令获取并运行帮助,或从项目 releases 页面下载名为 wssocks-ustb-$OS-$ARCH 的平台构建产物。这里的 $OS、$ARCH 表示发行包命名中的系统及架构部分,不是传给程序的标志。README 没有给出下载后的解压、放入 PATH 或认证的具体步骤,故不应把这些操作视作仓库保证的安装流程。
基本用法:Go 路径及帮助
以下命令直接摘自仓库的安装说明;第一行是该说明记录的安装命令,第二行用于确认可执行程序能够提供帮助信息。实际安装行为也受使用者本机 Go 环境影响。
go get -u github.com/genshen/wssocks-plugin-ustb/wssocks-ustb
wssocks-ustb --helpSource: README.md
使用发行版
发行版下载链接和文件名模式由 README.md 给出。README 另列有夜间构建的 OSDN 下载入口;夜间构建适合希望尝试新功能的使用者,不能据此推定与正式版本具有相同稳定性。安装 GUI 应参阅独立的 client-ui 说明,不要误将 client-ui-$OS-$ARCH 当作本页的 CLI 产物。
启动与命令解析
启动入口有明确的先后顺序:加载所导入包,运行入口的 init 完成插件注册,再执行 main 设置程序名、解析命令;cmds.Parse() 返回的错误按错误类别处理。该顺序解释了为何 CLI 可以同时包含上游 wssocks 的命令入口与本项目的 USTB 插件,而不是将 VPN 逻辑写进 main 的参数解析中。main.go
Source: main.go
图中的 AddPluginVersion 接收的是另行创建的 ver.PluginVersionNeg 的指针,并非 VPN 对象;SetProgramName("wssocks-ustb") 在 cmds.Parse() 之前调用。空白导入相关包的具体注册副作用需查看对应包实现;本页仅确认这些导入存在,不推断其命令名称或选项。main.go
开发者用法示例
下列代码是实际入口文件的原文片段,说明新增 CLI 层集成时应检查的注册位置;它不是要求用户自行编写的调用脚本。
VPN 与版本插件注册
1func init() {
2 vpn := vpn.NewUstbVpnCli()
3 ver := ver.PluginVersionNeg{}
4 client.AddPluginOption(vpn)
5 client.AddPluginRequest(vpn)
6 client.AddPluginVersion(&ver)
7}Source: main.go
同一个 vpn 被注册到 option 与 request 两个扩展入口;版本协商使用独立的 ver 值。因而如果正在排查“程序可以运行但 VPN 功能不出现”,入口层首先要核对的是上述注册流程;插件内部的参数、认证细节不能仅根据这些调用判断。main.go
命令解析及错误筛选
1func main() {
2 cmds.SetProgramName("wssocks-ustb")
3 if err := cmds.Parse(); err != nil {
4 if !errors.Is(err, flag.ErrHelp) && !errors.Is(err, &cmds.SubCommandParseError{}) {
5 log.Fatal(err)
6 }
7 }
8}Source: main.go
入口不把 flag.ErrHelp 与 cmds.SubCommandParseError 交给 log.Fatal;其他非空解析错误调用 log.Fatal(err)。这只描述入口筛选结果,不保证上游解析器对任一具体参数会返回何种错误。main.go
API 与配置边界
| 入口符号 | 参数/返回(以入口调用为依据) | 在本页中的作用 |
|---|---|---|
vpn.NewUstbVpnCli() | 入口无传参;返回值赋给 vpn | 构建待注册 VPN 插件;返回类型和内部初始化细节未在已读取代码中确认。 |
client.AddPluginOption(vpn)、client.AddPluginRequest(vpn) | 均传入同一 vpn | 将插件接到客户端扩展入口;精确 API 签名及返回值需以依赖实现为准。 |
client.AddPluginVersion(&ver) | 传入 *ver.PluginVersionNeg | 注册版本扩展。 |
cmds.SetProgramName("wssocks-ustb") | 入口传入程序名 | 在解析命令前设置名称。 |
cmds.Parse() | 入口无传参;返回错误值供判断 | 解析命令;仅可确认入口对错误的处理。 |
以上调用及使用方式见 main.go;这些依赖的完整函数声明与异常约定未在本页已读取源材料中出现,因此这里不杜撰其正式签名。
| 可见设置/选择 | 类型 | 已知默认值 | 作用与证据 |
|---|---|---|---|
| CLI 程序名 | 字符串 | 入口固定设置为 wssocks-ustb | 在调用解析器前由 SetProgramName 指定,见 main.go。 |
帮助调用 --help | CLI 参数 | 未见配置默认值 | README 给出的首次检查命令,见 README.md。 |
VPN 子命令选项、认证参数及其默认值未在读取到的入口与安装说明中定义;运行 wssocks-ustb --help 查看当前安装版本实际提供的命令帮助,不应照搬未经核实的参数。README.md
故障边界与运维提示
- 安装后无法调用命令:README 的 Go 命令紧接着运行
wssocks-ustb --help,但没有说明 Go 环境的可执行文件搜索路径或安装后的二进制位置;需要先在本机验证这一步,不能从仓库代码断言所有环境均能直接找到命令。README.md - 帮助与解析异常:入口明确排除
flag.ErrHelp和cmds.SubCommandParseError,其余解析错误以log.Fatal报告。若排查进程退出,应先区分是哪一类错误,再检查实际命令帮助;入口没有提供重试逻辑。main.go - 平台包的区分:README 所列 CLI 文件模式为
wssocks-ustb-$OS-$ARCH,GUI 为client-ui-$OS-$ARCH。选择对应系统/架构及客户端类型,避免将 GUI 包用于 CLI 调试。README.md - 性能与并发:已读取的入口只执行插件注册与一次
cmds.Parse,没有显示连接超时、重连、缓存、并发控制或持久化机制;这些行为的实现细节未在本页所核查源代码中找到,不能从此入口推断。main.go
扩展与排查位置
入口为 CLI 扩展提供三个明确的接线点:VPN 的 option/request 注册以及版本插件注册。开发者修改注册关系时应维持 init 在 main 解析前完成的既有结构;若需改变认证或具体 VPN 行为,应进一步检查插件实现,不能把入口当成完整功能实现。main.go 本页可用的源材料没有提供相关测试覆盖或更细的插件配置契约,因此不声称安装、参数、网络连接已有自动化测试保证。