Sshwifty:在浏览器里 SSH 连接服务器,不需要装任何客户端

前言

有一次在外面,服务器出了点问题需要紧急 SSH 上去看看。结果身边只有一台 iPad—— 没装任何 SSH 客户端,App Store 下载还得等。

如果有一个浏览器就能用的 SSH 客户端,这种事就不会那么狼狈。

Sshwifty 就是干这个的。一个 Web SSH / Telnet 客户端,Go 写的后端 + Web 前端,Docker 一条命令部署。部署之后,在任何有浏览器的设备上打开网页,就能连服务器。

5 分钟部署

Docker 一条命令:

Terminal window
docker run -d \
--restart unless-stopped \
--publish 127.0.0.1:8182:8182 \
--name sshwifty \
niruix/sshwifty:latest

Nginx 反代配置:

server {
listen 443 ssl;
server_name ssh.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8182;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

注意 WebSocket 的 Upgrade 头 ——SSH 是长连接,WebSocket 是 Sshwifty 前端和后端之间的通信方式,必须支持协议升级。

打开 https://ssh.yourdomain.com,在页面里填服务器 IP、端口、用户名和密码(或密钥),点 Connect。一个浏览器内的 SSH 终端就出来了。

使用场景

应急运维

主力电脑不在身边,但需要紧急登录服务器排查问题。手机、iPad、甚至借用别人的电脑 —— 只要能打开浏览器,就能连。

跳板机 / 堡垒机

把 Sshwifty 部署在内网的跳板机上,配合 Cloudflare Access 做身份验证。这样全公司的运维人员通过一个统一入口连接服务器,所有操作日志在跳板机上集中审计。

临时分享终端

让同事临时看一眼服务器上的某个日志,不用给他账号密码。你把 Sshwifty 打开,屏幕共享给他就行。

安全建议

Sshwifty 本身不存储任何 SSH 凭据 —— 密码和密钥只在浏览器内存里,页面关闭就没了。但为了安全:

  1. 必须套 HTTPS:不要裸奔 HTTP,SSH 凭据在 HTTP 下是明文的
  2. 加一层认证:Cloudflare Access 或者 HTTP Basic Auth,确保只有你能打开页面
  3. 限制 IP:如果只自己用,Nginx 里只允许自己的 IP 访问
  4. 别暴露在公网裸端口上:一定走反代

项目现状

Sshwifty 目前处于维护模式。作者明确表示只修 bug 和安全问题,不接受 PR 也不开发新功能。但这其实不是坏事 ——SSH 客户端的功能已经很成熟了,不乱加功能反而更稳定。

如果你需要更多功能(文件传输、多标签、会话管理),可以考虑 Apache Guacamole 或 ttyd,但那两个更重。Sshwifty 的优势就是轻 —— 一个 Go 二进制,不到 20MB。

总结

Sshwifty 解决了一个很具体的场景:没有 SSH 客户端的时候,怎么连服务器?

答案是浏览器。Docker 一条命令部署,反代套上 HTTPS,以后任何设备上输入域名就能连。对于偶尔需要应急运维的人来说,这是一个「搭了就不需要再操心」的工具。

而且它极轻 ——Go 单二进制、内存占用低、部署完就不需要维护。这种工具就该这样:装完忘记它存在,直到某天需要的时候打开就能用。