前情提要
小梅找我说导师给他批下来一张5090,跑什么CV管线。很显然我并不知道什么CV管线什么多面体是啥,但是他要连接实验室的服务器————这下听懂了:用SSH啊。
SSH简介
SSH(Secure Shell,安全外壳协议)是一套加密的远程登录协议:它让客户端通过网络登录到一台远程主机,像坐在那台机器前面一样执行命令、传文件、跑程序。相比老旧的明文协议(telnet、ftp),SSH 的所有通信都是加密的——即使流量被截获,也看不到密码和内容。
关于SSH你需要了解的基础知识:
- 默认端口 22:服务端进程叫
sshd,客户端命令就是ssh; - C/S 架构:客户端发起连接,服务端监听端口等待连接;
- 加密分两层:用非对称加密(RSA / Ed25519)完成身份认证和密钥交换,再用对称加密加密后续所有数据;
- 一次认证之后通常可以免密:把客户端的公钥放进服务端的
authorized_keys,以后登录不再输密码。
SSH配置方法
下面以「Windows 本机(客户端) → 机房 Ubuntu(服务端)」为例。
服务端
# 1. 安装并启动 sshd sudo apt update sudo apt install -y openssh-server sudo systemctl enable --now ssh # 开机自启 + 立即启动 # 2. 查看自己的地址,记下来(wlan0/enp* 下的 192.168.x.x) ip a服务端几乎全部行为都由
/etc/ssh/sshd_config控制,常用项:配置项 建议 说明 Port 22保持默认 改端口能少挨扫描,但不是安全手段 PermitRootLogin no推荐 禁止 root 直接登录 PubkeyAuthentication yes推荐 允许公钥免密登录 PasswordAuthentication yes调试期 yes,配好密钥后改 no 关掉后只能靠密钥登录,更安全 X11Forwarding yes图形转发必需 下文「图形化窗口?」依赖它 X11UseLocalhost yes默认即可 转发只绑定本机回环 改完配置后:
sudo sshd -t # 语法自检,有错误会直接报出来 sudo systemctl restart ssh sudo ufw allow 22/tcp # 如果开了 ufw 防火墙才需要Windows主机也可以做服务端,但
- Windows系统不如Debian等Linux发行版稳定
- Windows系统的内存优化较Linux相比保守,长时间运行容易产生内存碎片
- 如果要跑图形程序,Linux端的体验较好
客户端
Windows 10/11 自带 OpenSSH 客户端,也可在可选安装里查看。验证:
ssh -V # 输出 OpenSSH_for_Windows_9.x ... 就说明可用如果提示找不到 ssh,有可能是装好了但
C:\Windows\System32\OpenSSH没进 PATH。
SSH连接
登录:
ssh 用户名@主机IP或域名 # 首次连接会询问是否信任对方主机指纹,输 yes
配置免密登录(一劳永逸,后续图形转发也用它):
# 1. 生成密钥对(Windows 与 Linux 通用命令)
ssh-keygen -t ed25519
# 2. 把公钥装到服务端。Windows 没有 ssh-copy-id,手动追加:
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh 用户名@192.168.x.x "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
图形窗口?Wayland?
ssh 本身不开图形窗口,它是纯命令行工具。 想让远程的程序窗口出现在本地屏幕上,靠的是 X11 转发:ssh 把「画窗口的图形指令流」加密传回本地,而本地必须有一个 X 服务器负责把它画出来。
关键差异就在这里:
- Linux 桌面自带 X 服务 →
ssh -X敲gedit直接弹窗,体验和本地终端一样; - Windows 没有内置 X 服务器 → 缺的不是 ssh,是本地「画窗口」的那一环。
所以在 Windows 上要补一个 X 服务器,推荐 VcXsrv:
winget install --id marha.VcXsrv --accept-source-agreements --accept-package-agreements
启动 XLaunch 时的关键选项:
- Display settings → Multiple windows,Display number = 0
- Client startup → Start no client
- 最后一步勾选 Disable access control(否则 ssh 转发上来的连接会被本地 X 服务器拒绝)
然后连上服务端跑程序:
ssh -X lab # 或 ssh -X 用户名@192.168.x.x
xeyes # 最简单的验证:出现两只跟着鼠标走的眼睛
gedit # 或 firefox / gnome-text-editor
窗口会出现在 Windows 屏幕上,体验与本地一致。
Wayland 说明:机房 Pop!_OS 默认是 Wayland 会话,但这不影响 ssh 转发——ssh 登录会话里没有 WAYLAND_DISPLAY,程序会自动退回 X11 后端走转发通道。个别 Qt 程序不老实,手动指定一下即可:
export QT_QPA_PLATFORM=xcb
常见报错对照:
| 现象 | 原因 | 解决 |
|---|---|---|
X11 forwarding request failed on channel 0 |
服务端缺 xauth 或没开转发 | sudo apt install xauth,确认 X11Forwarding yes |
Connection refused |
sshd 没起来 | sudo systemctl enable --now ssh |
cannot open display |
忘了 -X,或 VcXsrv 没开 / 没勾 Disable access control |
重连 ssh -X,检查 XLaunch 设置 |
| 窗口黑屏 / 一闪而过 | Qt 程序在 Wayland 下闹别扭 | export QT_QPA_PLATFORM=xcb 后重跑 |
校园网?VPN?
通用流程(校外 → 机房):
- 按学校信息化页面指引下载并登录 VPN 客户端(一般用校园网账号);
- 确认已进校园网:
ping 机房IP,或看虚拟网卡是否拿到内网地址; - 再执行 ssh 并转发图形:
ssh -X 用户名@机房内网IP
顺序很重要:先连 VPN,再 ssh。反过来隧道会指向一个不可达地址。
以西南大学为例,官方入口是
vpn.swu.edu.cn(系统简介);若只是想在校外查文献下论文,还可以走图书馆的 CARSI 直连 或 VPN/代理 途径,不一定需要能跑 ssh 的 VPN。
没有合适客户端 VPN 时的替代思路: 反向隧道 / 内网穿透:只要能偶尔进一次机房,让机器主动向外连一条隧道到你控制的公网机器(ssh -R、frp、Tailscale、ZeroTier),之后在外面直连即可,绕开校园 VPN 对任意流量的限制;