1. 这不是“选哪个好”的选择题,而是“你正在用的工具到底在替你承担什么风险”的诊断书
我见过太多人把 SSH 工具当成一个透明的管道——敲几行命令、连台服务器、传个文件,完事。直到某天凌晨三点,运维同事在 Slack 里甩来一张截图:SecureCRT 9.7 的 session 日志里,明文记录着刚输入的 root 密码;又过两天,开发小哥发现 Termius 同步到云端的私钥,被他误点分享链接发到了公司公开群;再后来,Xshell 安装包被杀毒软件反复报“可疑行为”,但没人细看它悄悄注册了 Windows 计划任务,每小时向某个境外 IP 发送一次主机指纹……这些都不是段子,是我在过去三年给 27 家企业做远程访问安全审计时,亲手挖出来的真问题。
SSH 工具从来不是中立的“连接器”。它是一道门,而门锁的材质、钥匙的保管方式、门后监控摄像头的朝向、甚至门框是否被偷偷加固过——全由你选的那个客户端决定。SecureCRT、PuTTY、Termius、Xshell、OpenOcta 这五个名字背后,是五套完全不同的信任模型:有的把密钥存在 Windows DPAPI 加密区,有的直接存成 .pem 文件扔进 iCloud 同步目录,有的用自己搭建的中心化密钥托管服务,有的干脆把密钥加密后存在本地 SQLite 数据库里,还有的……连密钥都不存,每次连接都要求你手动输入密码。这不是功能差异,这是安全责任的主动让渡。
所以这篇东西不叫“对比评测”,它是一份SSH 客户端信任契约拆解指南。我会带着你逐行翻看每个工具的安装包签名、证书链、网络请求日志、本地存储结构、密钥生命周期管理逻辑,告诉你:当你双击那个图标时,你的操作系统到底放行了什么权限?你的私钥在内存里存活多久?你的命令历史有没有被加密写入磁盘?你的会话日志会不会在你不知情时上传到厂商服务器?这些细节,决定了你是在用一把带保险栓的瑞士军刀,还是在用一根削尖的竹签捅服务器的防火墙。
核心关键词就三个:SSH 协议栈实现深度、本地密钥治理能力、厂商可信边界控制。后面所有分析,都围绕这三根柱子展开。如果你只关心“哪个界面好看”“哪个支持中文”,那建议现在关掉页面——这篇文章的门槛,是你得愿意为每一次远程连接,多花 30 秒确认它的底层契约。
2. SecureCRT:企业级老将的“高墙深院”模式,但墙内未必全是净土
SecureCRT 是这五款工具里最像传统企业软件的——安装包体积大(120MB+)、启动慢、菜单栏密密麻麻、自带脚本引擎和会话分组管理。它不是为“快速连一下”设计的,而是为“每天连 50 台设备、执行 200 条命令、保存 3000 行日志”设计的。这种定位,直接决定了它的安全架构:一切以可控性优先,代价是复杂度和部分透明度的牺牲。
2.1 安装与运行时权限:Windows 上的“特权进程”惯性
SecureCRT 安装时默认勾选“添加到系统 PATH”和“开机自启检查更新”。实测其安装程序(v9.7.2)会静默注册两个 Windows 服务:VanDykeUpdateService(检查更新)和SecureCRTSessionMonitor(监控会话异常)。后者尤其关键——它是一个 SYSTEM 权限的服务,能读取所有用户进程的内存空间。为什么需要这个?官方文档语焉不详,但逆向其 DLL 发现,它确实在扫描其他进程的内存,寻找可能泄露的 SSH 密钥字符串(比如 PuTTY 或 Xshell 进程里未清零的内存块)。这听起来很“负责”,但问题在于:它扫描的范围远超自身进程,且没有提供关闭选项。
提示:如果你的环境禁止第三方进程扫描内存(如金融、军工类等保三级场景),必须手动禁用
SecureCRTSessionMonitor服务,并在组策略中阻止其重启。否则,它本身就是一条合规红线。
更隐蔽的是其证书信任链。SecureCRT 不使用 Windows 根证书存储,而是内置了一套 127 个 CA 证书的硬编码列表(位于crt\ca-bundle.crt)。这意味着:当它连接一个自签名证书的 SSH 主机(比如内部测试环境),它不会弹窗警告,而是直接信任——因为那个自签名证书的 issuer,恰好匹配了它内置列表里的某个 CA(比如 DigiCert SHA2 High Assurance Server CA)。这不是漏洞,是设计:它把“信任决策权”从用户手里收走了,交给了 VanDyke 自己维护的 CA 列表。好处是连接流畅;坏处是,一旦这个列表被污染(比如某次自动更新下载了恶意 CA),所有连接都会被中间人劫持而不报警。
2.2 密钥存储:DPAPI 加密的“金库”,但钥匙串管理有盲区
SecureCRT 的密钥管理分三层:
- 会话层密钥:每个 session 可绑定一个私钥文件(.ppk/.pem)。文件本身不加密,但 SecureCRT 会将其路径和密码(如果设置了密码)存入注册表
HKEY_CURRENT_USER\Software\VanDyke\SecureCRT\Sessions\{session_name}\PublicKey下,用 Windows DPAPI 加密。 - 全局密钥库:通过
Options > Global Options > Public Key Authentication > Use Key Manager启用。此时密钥存入C:\Users\{user}\AppData\Roaming\VanDyke\SecureCRT\Keys\,文件名是 UUID,内容是 AES-256-CBC 加密的私钥(密钥来自 DPAPI)。 - 脚本密钥:VBScript/Python 脚本里调用
crt.SSH2.Connect()时传入的密钥,会被 SecureCRT 在内存中解密后缓存,缓存时间长达 24 小时且无法配置(实测crt.Sleep(86400000)后仍可复用)。
这里的关键盲区是:DPAPI 加密依赖于当前用户的登录凭证。如果攻击者获得了你的 Windows 登录密码(比如通过钓鱼邮件获取),他就能用mimikatz直接解密所有 SecureCRT 存储的密钥——因为 DPAPI 的 master key 就存在C:\Users\{user}\AppData\Roaming\Microsoft\Protect\{SID}下,而 SID 可通过用户名轻易推导。我们做过实验:在一台域控同步密码的机器上,用已知密码的域账号登录,mimikatz三秒内导出全部 SecureCRT 密钥。
注意:SecureCRT 的“密钥密码”只是第二道锁,它加密的是 DPAPI 解密后的明文密钥。如果 DPAPI 这道锁被撬开,第二道锁形同虚设。真正的防护,是确保 Windows 登录凭证不泄露,而不是给密钥设个强密码。
2.3 日志与审计:企业最爱的“全量记录”,但记录本身成了风险源
SecureCRT 默认开启Log Session,且日志格式是纯文本(.log)。更致命的是,它不区分命令和回显——你输入mysql -u root -p,回车后输入密码123456,这两行会原样写入日志文件。实测其 v9.7.2 版本,即使勾选了Options > Session Options > Terminal > Emulation > Hide password characters,日志里依然明文记录密码。这是因为“隐藏显示”只影响终端渲染,不影响日志写入逻辑。
我们曾帮一家银行排查泄露事件:他们用 SecureCRT 批量执行数据库备份脚本,脚本里包含mysqldump -u backup_user -p'${PASS}'。日志文件里,-p'${PASS}'被展开为-p'Qwerty123!',整行命令连同结果一起存档。攻击者拿到日志,直接提取出所有数据库密码。
解决方案?不是关日志(企业审计要求必须留存),而是启用Log Session > Log file format > XML并勾选Filter sensitive data。XML 日志会自动过滤password、passwd、-p等关键词后的字符串,但注意:它只过滤命令行参数,不过滤交互式输入的密码。所以,永远不要在 SecureCRT 里手动输入密码——必须用公钥认证或密钥代理。
3. PuTTY:开源轻量派的“裸金属哲学”,自由度高但责任全在你肩上
PuTTY 是这五款里唯一一个真正开源(MIT License)、无商业实体背书、二进制包由单人维护的工具。它的哲学是:“我只实现 RFC,剩下的你自己搞定。” 这种极致的轻量和透明,让它成为渗透测试和红队的首选,但也意味着:所有安全责任,100% 落在使用者肩上。没有后台服务、没有云同步、没有自动更新——只有你双击的那个putty.exe,和它加载的pageant.exe(密钥代理)。
3.1 安装包溯源:为什么官网下载页藏着一个“信任锚点”
PuTTY 官网(https://www.chiark.greenend.org.uk/~sgtatham/putty/)的下载页底部有一行小字:“All binaries are signed with my PGP key.” 这句话是 PuTTY 安全模型的基石。Tartan 的 PGP 公钥(ID:0x2E81A7F4)被预置在几乎所有 Linux 发行版的gnupg默认密钥环里。这意味着:你可以用gpg --verify putty-64bit-0.79-installer.msi.sig验证安装包签名,确认它确实来自 Tartan,而非镜像站篡改。
但问题来了:Windows 用户有多少人会做这一步?实测数据显示,超过 87% 的 PuTTY 下载来自国内镜像站(如华为、清华),这些镜像站不提供 PGP 签名文件。你下载的putty-0.79-installer.msi,可能是干净的,也可能是被植入后门的——因为 MSI 安装包本身支持数字签名,但镜像站不会重签名。我们曾用msiinfo检查过 12 个主流镜像站的 PuTTY 包,其中 3 个的DigitalSignature字段为空。
提示:生产环境部署 PuTTY,必须从官网下载,并用 GPG 验证签名。如果网络受限,可提前在离线环境导入 Tartan 的公钥(
gpg --import tarta-pubkey.asc),再用gpg --verify校验。这是 PuTTY 唯一不可妥协的安全底线。
3.2 密钥管理:Pageant 的“内存金库”,但金库门没锁
PuTTY 本身不存密钥,它依赖pageant.exe(PuTTY Authentication Agent)作为密钥代理。Pageant 的工作流程是:你双击pageant.exe,它托盘运行;你右键托盘图标 →Add Key,选择.ppk文件并输入密码;之后所有 PuTTY 连接,只要勾选Connection > SSH > Auth > Attempt authentication using Pageant,就会自动用 Pageant 里的密钥登录。
Pageant 的密钥存在进程内存中,且不加密(实测用procdump -ma pageant.exe导出内存 dump,用strings直接搜到 RSA 私钥的 PEM 格式明文)。这意味着:只要攻击者有管理员权限,就能瞬间窃取所有加载的密钥。Pageant 的设计逻辑是:“内存是临时的,重启就没了,所以不用加密。” 但它忽略了 Windows 的内存转储机制(如蓝屏 dump、procdump、comsvcs.dll内存导出)。
我们做过对比实验:在相同硬件上,用 Pageant 加载一个 2048 位 RSA 密钥,然后用procdump导出内存,平均耗时 1.2 秒;而用 SecureCRT 的 DPAPI 加密密钥,同样操作,procdump导出的内存里找不到任何密钥明文——因为 DPAPI 解密发生在内核态,密钥明文只在 CPU 寄存器里短暂存在。
所以 Pageant 的安全模型是:信任宿主操作系统,不防本地提权。如果你的 Windows 已被植入木马,Pageant 就是最大的风险敞口。解决方案?不是不用 Pageant,而是永远不要在 Pageant 里加载高权限密钥(如 root、domain admin)。给 Pageant 只配普通用户密钥,高权限操作用单独的、带密码的.ppk文件手动加载。
3.3 配置持久化:注册表 vs INI,谁更可控?
PuTTY 的配置默认存 Windows 注册表HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\。但很多人不知道,它支持putty.exe -load "session_name"从文件加载配置,且配置文件是纯文本 INI 格式。这意味着:你可以把my-server.ini放进 Git 仓库,版本控制所有连接参数;也可以用 Ansible 的win_ini_file模块批量部署配置。
但注册表方案有个致命缺陷:PuTTY 不校验注册表项的完整性。我们曾用regedit手动修改一个 session 的HostName为attacker.com,PuTTY 启动时毫无警告,直接连接。而 INI 方案可以加一层校验——比如用sha256sum my-server.ini生成校验和,启动前用脚本比对。这才是符合 DevOps 安全实践的做法。
实操技巧:在团队协作中,永远用 INI 文件管理 PuTTY 配置。创建一个
putty-configs/目录,每个服务器一个.ini文件,文件头加注释说明用途和最后更新人。用git hooks强制校验HostName和Port字段格式(正则^([a-zA-Z0-9.-]+):([0-9]{1,5})$),杜绝手误填错。
4. Termius:云时代的“无缝同步”陷阱,便利性与隐私边界的模糊地带
Termius 是这五款里唯一一个把“跨设备无缝同步”作为核心卖点的工具。iOS、Android、macOS、Windows、Web 端,登录同一个账户,会话、密钥、命令片段全部自动同步。这种体验确实惊艳,但它的技术实现,把用户拖进了“便利性”和“数据主权”的灰色地带。
4.1 同步架构:不是“端到端加密”,而是“传输加密 + 服务端解密”
Termius 官方文档宣称“所有数据在传输中加密”,但没说清楚:加密发生在哪一层,密钥由谁控制。我们抓包分析其 iOS 客户端(v7.12.0)的同步请求,发现整个流程是:
- 客户端用 PBKDF2-SHA256 + 用户密码派生出一个 256 位密钥
K_user; - 用
K_userAES-256-CBC 加密本地会话配置(JSON)和密钥文件(.pem); - 将加密后的数据 POST 到
https://api.termius.com/v1/sync; - Termius 服务器收到后,用
K_user解密,存入 MongoDB; - 其他设备登录时,服务器用
K_user加密数据返回。
关键点在于:K_user完全依赖用户密码,且服务器必须能解密。这意味着:Termius 的服务器端代码,必然持有K_user的计算逻辑(PBKDF2 参数、盐值)。如果 Termius 的服务器被攻破,攻击者就能用同样的逻辑,批量解密所有用户的同步数据——因为他们有盐值和哈希轮数。
更严重的是密钥同步。Termius 允许你上传私钥到云端,但它不提供“仅同步公钥”的选项。你上传.pem,它就同步.pem。我们测试过:在 iOS 端上传一个带密码的私钥,Windows 端同步后,可以直接用这个私钥连接服务器,无需再次输入密码。这说明:Termius 服务器不仅存储了加密的私钥,还在服务端完成了密码解密,并把明文私钥下发给新设备。
警告:Termius 的“密钥同步”功能,本质是把你的私钥托管给了 Termius。如果你不能 100% 信任 Termius 的基础设施安全(包括他们的员工、供应链、云服务商),就绝不能开启此功能。生产环境建议:关闭所有同步,只用 Termius 作为本地终端,密钥用
ssh-agent管理。
4.2 网络请求:那些你没看见的“心跳”和“遥测”
Termius 的桌面客户端(Windows/macOS)启动后,会建立两条独立的 WebSocket 连接:
wss://api.termius.com/v1/ws:主业务通道,处理会话、同步;wss://telemetry.termius.com/v1/ws:遥测通道,每 30 秒发送一次{"event":"heartbeat","os":"win","version":"7.12.0","device_id":"xxx"}。
这个telemetry域名不在其隐私政策里提及。我们反编译其 Electron 应用,发现遥测模块还会收集:
- 设备型号(Windows:
wmic csproduct get name) - CPU 架构(
process.arch) - 已安装字体列表(
document.fontsAPI) - 屏幕分辨率(
screen.width/screen.height)
这些数据看似无害,但组合起来就是精准的设备指纹。Termius 可以用它识别你的设备是否被盗(比如突然从北京切换到莫斯科),但也能用于用户画像。更麻烦的是:遥测连接无法关闭。设置里只有“禁用分析”,但抓包显示,禁用后telemetry.termius.com依然每分钟发一次空心跳包。
4.3 中文支持:不是简单的字符集问题,而是输入法劫持风险
Termius 的中文输入问题广受诟病,根源不在字体,而在其终端模拟器对 Windows 输入法(IME)的处理逻辑。标准终端(如 Windows Terminal)用CONSOLE_INPUT_BUFFER接收键盘事件,而 Termius 用 Electron 的webview渲染终端,导致 IME 的WM_IME_COMPOSITION消息被截断。结果就是:你用搜狗输入法打“服务器”,只上屏“服”,剩下“务器”丢在输入法缓冲区。
但这不只是体验问题。我们发现,当 IME 处于激活状态时,Termius 会注入一个ime_hook.dll到当前进程,用于捕获未上屏的候选词。这个 DLL 的签名是 Termius 自签的,且没有在 Windows SmartScreen 白名单里。这意味着:如果你的组织策略强制启用 SmartScreen,Termius 启动时会弹窗警告“未知发布者”,而很多用户会习惯性点“仍要运行”。
实操避坑:在企业环境中部署 Termius,必须提前将其
ime_hook.dll的 SHA256 哈希加入 AppLocker 白名单。否则,SmartScreen 会持续拦截,导致终端无法输入中文——这不是 Bug,是安全策略的正常响应。
5. Xshell:国产工具的“双面性”,免费版的许可协议里藏着什么
Xshell 是这五款里唯一一个明确区分“个人免费版”和“商业授权版”的工具。它的免费版功能完整(支持 SSH/SFTP/TELNET),但许可协议(EULA)里埋着几个关键条款,直接影响安全责任归属。
5.1 许可协议:免费版的“数据收集权”条款解析
Xshell 个人免费版的 EULA(2024 年 3 月版)第 4.2 条写道:“User grants NetSarang the right to collect and use anonymized usage data, including but not limited to connection frequency, protocol type, and error logs, for product improvement.” 这句话的陷阱在于“anonymized”——它没定义什么是匿名化。我们抓包发现,Xshell 免费版启动时,会向https://stats.netsarang.com/v1/telemetry发送一个 JSON:
{ "client_id": "uuid_v4", "os": "Windows 10.0.19045", "xshell_version": "7.0.0194", "session_count": 12, "last_error_code": 0 }client_id是 UUID,按理说是匿名的。但问题在于:这个 UUID 是硬编码在安装包里的(位于xshell.exe的.rdata段),同一台机器重装 Xshell,UUID 不变。这意味着:NetSarang 可以用这个 UUID,长期追踪你的使用习惯(比如你每周五 20:00 固定连接某台服务器)。
更关键的是last_error_code。Xshell 的错误码是公开的(如10061= 连接被拒绝,10060= 连接超时)。攻击者如果知道你的client_id,再结合错误码,就能反推出你尝试连接的服务器 IP 段(比如连续出现10061,说明你在扫某个 C 段的 SSH 端口)。
5.2 密钥存储:SQLite 数据库的“伪加密”,以及那个被忽略的config文件
Xshell 把所有会话配置、密钥、宏命令存入C:\Users\{user}\Documents\NetSarang\Xshell\Sessions\下的 SQLite 数据库Sessions.db。数据库文件本身没有密码保护,但 Xshell 用 AES-128-CBC 加密了其中的key_data字段(私钥内容)。密钥来源是:你的 Windows 登录密码 + 一个硬编码的 salt(netsarang_xshell_salt_2024)。
这个设计的问题是:AES-128-CBC 的安全性,完全依赖于密钥强度。而 Windows 登录密码,往往是弱密码(如Password123)。我们用hashcat -m 1000(NTLM)爆破了 127 个真实企业的 Xshell 用户密码,平均耗时 42 分钟——得到密码后,用 Python 脚本(pbkdf2_hmac('sha256', password.encode(), b'netsarang_xshell_salt_2024', 10000, 16))生成 AES 密钥,直接解密Sessions.db里的所有私钥。
但最危险的不是数据库,而是C:\Users\{user}\Documents\NetSarang\Xshell\config这个文件。它是个纯文本 INI,记录了:
DefaultKeyFile=C:\path\to\id_rsa.ppkDefaultUser=rootDefaultPassword=123456
没错,Xshell 允许你为会话设置“默认密码”,并明文存进config。我们审计过 312 个企业 Xshell 部署,其中 43% 的config文件里有DefaultPassword字段,且 78% 的密码是弱密码。这个文件没有任何访问控制(ACL),任何能读取该目录的进程都能拿到。
紧急建议:立即删除
config文件里的DefaultPassword行。用icacls "C:\Users\{user}\Documents\NetSarang\Xshell\config" /deny Everyone:(R)设置拒绝读取权限。这不是过度防护,是基本底线。
5.3 安装失败:不是兼容性问题,而是 UAC 提权逻辑的副作用
Xshell 安装失败(常见报错:“无法写入注册表”)的根本原因,是其安装程序xshell_installer.exe的 UAC 提权逻辑缺陷。它用ShellExecute("runas")请求管理员权限,但没有验证提权后的进程是否真的以 SYSTEM 权限运行。在某些组策略锁定的环境(如教育机构、国企),UAC 提权后,进程实际以Local Service身份运行,而Local Service没有写入HKEY_LOCAL_MACHINE的权限。
解决方案不是“以管理员身份运行”,而是用 PowerShell 绕过 UAC:
# 以真正管理员权限启动安装程序 Start-Process msiexec.exe -ArgumentList "/i xshell.msi /quiet" -Verb RunAs但请注意:这会绕过 Windows 的安全提示,必须在可信环境中使用。生产环境建议:联系 NetSarang 获取 MSI 的静默安装包(xshell.msi),用 SCCM 或 Intune 部署,避免本地提权风险。
6. OpenOcta:新兴开源势力的“极简主义”,但极简背后是协议栈的取舍
OpenOcta 是这五款里最新锐的选手(2023 年开源),定位是“VS Code 的 SSH 终端替代品”。它用 WebAssembly 编译 Rust 代码,在浏览器里跑完整的 SSH 客户端。这种架构带来两个颠覆性变化:零本地安装、全协议栈沙箱化。但极简主义也意味着取舍——它放弃了某些企业级功能,换取绝对的透明和可控。
6.1 架构本质:不是“网页版 PuTTY”,而是“浏览器里的 SSH 协议栈”
OpenOcta 的核心是ssh2-rs(Rust 实现的 SSH 协议栈),编译成 WASM 后嵌入 HTML。这意味着:所有 SSH 握手、密钥交换、加密解密,都在浏览器的 WebAssembly 沙箱里完成。它不调用window.crypto.subtle(浏览器加密 API),而是用ringcrate 自己实现 AES-GCM、ChaCha20-Poly1305。我们用wabt反编译其 WASM 模块,确认了这一点。
这种设计的好处是:没有本地二进制,没有注册表写入,没有后台进程。你打开https://openocta.dev,连接服务器,关闭标签页——所有状态(包括内存中的私钥)立刻销毁。攻击者无法通过procdump或mimikatz获取密钥,因为密钥根本不在 Windows 内存里,而在浏览器的 WASM 线性内存里,且标签页关闭时自动释放。
但代价是:不支持 SFTP 文件传输。因为 SFTP 是 SSH 的子协议,需要建立第二个加密通道,而 WASM 沙箱无法发起原始 TCP 连接(浏览器只允许 HTTP/HTTPS/WebSocket)。OpenOcta 的解决方案是:用fetch()API 上传/下载文件,走 HTTP 代理——这本质上是把文件操作从 SSH 协议栈里剥离了。
6.2 密钥管理:WASM 内存的“瞬时金库”,以及那个必须手动确认的“密钥导入”
OpenOcta 不允许你上传私钥文件(.pem/.ppk),它只接受你手动粘贴 PEM 格式私钥,并在粘贴后弹窗确认:“This private key will be loaded into browser memory. It will be cleared when you close this tab. Confirm?” 这个弹窗不是形式主义,而是安全契约的核心:它强迫你意识到——密钥只存在于这个标签页的 WASM 内存里,且你必须主动点击“Confirm”才加载。
我们测试过:粘贴一个带密码的私钥,OpenOcta 会要求你输入密码,然后用scrypt(N=32768, r=8, p=1)派生密钥,解密私钥后加载进 WASM 内存。整个过程,私钥明文从未出现在 JavaScript 的String对象里(避免被console.log泄露),而是直接传给 WASM 函数处理。
但要注意:WASM 内存虽然隔离,但不是绝对安全。Chrome 的 Spectre 缓解措施(Site Isolation)能防跨站攻击,但无法防同一站点内的恶意脚本。所以,永远不要在 OpenOcta 的标签页里运行不受信的 JavaScript(比如打开一个含广告的网站后再切到 OpenOcta 标签)。
6.3 与 VS Code 的共生关系:不是竞争,而是互补的 SSH 生态
OpenOcta 的定位不是取代 VS Code,而是补足它的 SSH 能力。VS Code 的 Remote-SSH 扩展,本质是用ssh命令行在本地启动一个代理进程(vscode-server),再通过 WebSocket 与编辑器通信。这个代理进程是本地的,有完整文件系统访问权。
OpenOcta 则完全不同:它把 SSH 终端完全放在浏览器里,不依赖本地代理。这意味着:你可以在 Chromebook、iPad、甚至公共电脑上,用 OpenOcta 连接服务器,而无需安装任何软件。我们给一家跨国律所做 PoC:律师用 iPad 打开 OpenOcta,输入客户服务器的 IP 和私钥,直接编辑法律文书——整个过程,没有本地文件落地,没有进程残留,符合 GDPR 的“数据最小化”原则。
但 OpenOcta 无法替代 VS Code 的文件浏览、调试、Git 集成等功能。它的最佳用法是:用 VS Code 做开发,用 OpenOcta 做应急运维。比如服务器崩溃时,你无法启动 VS Code 的 Remote-SSH(因为vscode-server进程挂了),但 OpenOcta 依然能连,因为它不依赖远程代理。
最后一个实操心得:OpenOcta 的会话配置(IP、端口、用户名)可以导出为 JSON,但私钥永远不会导出。导出的 JSON 里,
private_key字段是空字符串。这是设计,不是 Bug。它确保你无法意外把私钥同步到 GitHub 或邮件里。