第二章:远程访问
连不上的服务器等于废铁
你有一台 GPU 服务器。也许它在大学实验室里,也许是个云实例,也许是你导师三年前买的、塞在某张桌子底下的机器。它有 GPU,能跑训练。
但你只有坐在工位上、从笔记本通过校园网 SSH 进去时,才能用它。
你的服务器每天有 16 个小时是闲置的。不是因为它关了——是因为 你连不上。
这一切到此为止。
这一章结束时,你将能从手机上 SSH 进你的服务器,随时随地。咖啡店、机场、半夜被通知训练崩了时躺在床上。打开一个 App,点一下你的服务器,就连上了。
这是后面所有内容的基础。没有远程访问,就没有自主化科研。先把这一步搞定。
SSH 密钥:别再输密码了
每次输密码登录服务器,你就在做错事。密码慢、不安全(被偷看、键盘记录器、密码复用),而且让自动化变得不可能——Claude Code 没法替你输密码。
SSH 密钥解决所有这些问题。你生成一对密钥:私钥(留在本地,绝不外传)和公钥(放到服务器上)。连接时,数学校验通过,你就进去了。不会再弹密码框。永远不会。
生成密钥对
在你的本地机器(笔记本/台式机)上:
ssh-keygen -t ed25519 -C "[email protected]"询问保存路径时,按 Enter 接受默认值(~/.ssh/id_ed25519)。询问 passphrase 时,按 Enter 留空。对,不设 passphrase。后面自动化需要无人值守的 SSH 连接——带 passphrase 的密钥会阻断每一个自动连接。
这会创建两个文件:
~/.ssh/id_ed25519— 你的私钥。拿命来护。不要拷到服务器上,不要通过邮件发送,不要提交到 git。~/.ssh/id_ed25519.pub— 你的公钥。这个要放到服务器上。
把公钥拷贝到服务器
ssh-copy-id your-username@your-server这是你最后一次输密码。ssh-copy-id 会把你的公钥追加到服务器的 ~/.ssh/authorized_keys 文件里。从此以后,服务器认你的密钥,不再要密码。
测试一下
ssh your-username@your-server没有密码提示,直接进去了。如果还在要密码,说明哪里出了问题——检查服务器上 ~/.ssh/authorized_keys 的权限是否是 chmod 600,~/.ssh 目录是否是 chmod 700。
SSH Config:告别冗长的命令
你刚才用 ssh your-username@your-server 登录了。比输密码好多了。但你的服务器可能用了非标准端口、一长串域名、还有个你老记不住的用户名。类似这样:
ssh [email protected] -p 2222 -i ~/.ssh/id_ed25519你不会每次都打这一串。你不需要记住它。你只需要写一次,然后永远忘掉它。
创建 SSH config
打开 ~/.ssh/config(没有就新建):
nano ~/.ssh/config添加你的服务器:
Host lab-server
HostName your.server.ip
User your-username
Port 22
IdentityFile ~/.ssh/id_ed25519保存退出。测试:
ssh lab-server搞定。两个词。ssh lab-server。在你剩余的科研生涯里,你都只需要打这个。主机名、用户名、端口、密钥文件,全由 config 处理。
每一行的含义
- Host — 你要用的别名。起个短的。
lab、gpu1、cluster——怎么顺手怎么来。 - HostName — 服务器的真实 IP 地址或域名。
- User — 你在服务器上的用户名。
- Port — SSH 端口。默认 22,你的服务器可能不同(共享集群常见)。
- IdentityFile — 用哪个私钥。如果你只有一个密钥,SSH 会自动找到,但写明避免后续混淆。
多台服务器
如果你有多台服务器,每台加一个配置块:
Host lab-server
HostName your.server.ip
User your-username
Port 22
IdentityFile ~/.ssh/id_ed25519
Host cloud-gpu
HostName another.server.ip
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519现在 ssh lab-server 和 ssh cloud-gpu 都能用。不会搞混,不会打错,不会忘端口号。
Tailscale:从任何地方访问你的服务器
SSH 密钥和 config 很好用——但前提是你能连上服务器的 IP。如果你的服务器在校园防火墙、NAT 或 VPN 后面,离开校园网就连不上了。又回到被绑在工位上的状态。
Tailscale 解决这个问题。它是一个 mesh VPN——你可以把它想象成一个私有网络,把你所有的设备连在一起,不管它们实际在哪。你家里的笔记本、实验室的服务器、咖啡店里的手机——它们彼此可见,就像在同一个局域网上。
关键点:Tailscale 给每台设备一个固定 IP,这个 IP 从全球任何网络都能访问。 你的服务器会得到一个 Tailscale IP(类似 100.x.y.z),你从世界上任何一个地方都能连上它。不需要端口转发,不需要防火墙规则,不需要每 30 分钟就掉线的 VPN 客户端。
在本地机器上安装 Tailscale
根据你的操作系统,参照 https://tailscale.com/download 上的说明。Ubuntu 上:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up它会打开浏览器进行认证。用你的 Google/GitHub/Microsoft 账号登录。完成。
在服务器上安装 Tailscale
SSH 进你的服务器,运行同样的命令:
ssh lab-server
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up注意:这需要服务器上的 sudo 权限。如果你在一个没有 root 权限的共享大学集群上,就没法在服务器端装 Tailscale。跳到下面的 Termius 部分——你仍然可以通过本地机器从手机 SSH 到服务器。但如果你有一台专用服务器或云实例,装上 Tailscale,绝对值得。
Tailscale 个人使用免费(最多 100 台设备),不需要付费计划。
验证连接
在你的本地机器上:
tailscale status你应该能看到你的本地机器和服务器都列出来了,各有一个 Tailscale IP。测试连接:
ssh [email protected]把 100.x.y.z 替换成 status 输出中你服务器的 Tailscale IP。
更新 SSH config
把 Tailscale IP 作为另一个 Host 条目添加(或替换现有的):
Host lab-tailscale
HostName 100.x.y.z
User your-username
Port 22
IdentityFile ~/.ssh/id_ed25519现在你有两种方式连接服务器:ssh lab-server(直连,在同一网络时用)和 ssh lab-tailscale(通过 Tailscale,在任何地方都能用)。
对手机的意义
再看一下 README 里的架构图。看到最下面那条线了吗——从手机直接到 GPU 服务器,标注着 "Tailscale mesh" 的那条?
那就是你刚才搭建的东西。你的手机也能装 Tailscale。也就是说,你的手机可以直接 SSH 到服务器,完全不经过本地机器。不需要笔记本开着,不需要中继。手机到服务器,直连。
在手机上安装 Tailscale App(iOS App Store / Google Play Store),用同一个账号登录。你的手机现在跟你的服务器在同一个 mesh 网络上了。
这在后面会很关键——当 Claude Code 在你的本地机器上运行时,你可以独立地通过手机查看服务器状态。
Termius:把服务器装进口袋
现在你从任何地方都能连上服务器了。但你不可能每次想看看训练情况都打开笔记本。你需要手机上的 SSH。
Termius 是一个手机端 SSH 客户端。干净、快速,能正确处理 SSH 密钥。安装它:
- iOS: App Store
- Android: Google Play
免费版 vs Pro
免费版可以处理基本的 SSH 连接。跟完这个教程足够了。
如果你是学生:GitHub Education 免费送你 Termius Premium。包含 SFTP、端口转发和跨设备密钥同步。用你的大学邮箱申请——验证需要几天,但绝对值得。现在就申请,等待期间用免费版。
在 Termius 中配置你的服务器
- 打开 Termius。点 Hosts → +(添加新主机)。
- Alias 填一个好记的名字:
lab-server。 - Hostname 填你服务器的 Tailscale IP(
100.x.y.z)。如果没装 Tailscale,填服务器的直连 IP(只能在同一网络下用)。 - Username 填你的服务器用户名。
- 在 Keys 下,点 + 创建或导入密钥:
- 方案 A(推荐):在 Termius 中生成新密钥对,把公钥复制到服务器的
~/.ssh/authorized_keys。 - 方案 B:如果你有 Termius Premium,可以跨设备同步密钥。
- 方案 A(推荐):在 Termius 中生成新密钥对,把公钥复制到服务器的
- 保存主机。
连接
点一下你的服务器。连上了。
你在看着一个终端。在你的手机上。连着你的 GPU 服务器。跑个命令:
nvidia-smi你的 GPU 就在那里。在你的手机上。
见证时刻
这一章开始时,你只能坐在工位上才能连上服务器。现在你从地球上任何一个角落都能连上它。
来证明一下。把笔记本合上,拿起手机。
- 打开 Termius。
- 点你的服务器。
- 等待连接建立。
- 输入
nvidia-smi,按回车。
你应该看到类似这样的输出:
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.xx.xx Driver Version: 550.xx.xx CUDA Version: 12.x |
|---------------------------------------+------------------------+------------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
|=======================================+========================+========================|
| 0 NVIDIA GeForce RTX ... On | 00000000:01:00.0 Off | N/A |
| 30% 35C P8 20W / 350W | 0MiB / 24564MiB | 0% Default |
+---------------------------------------+------------------------+------------------------+那些是你的 GPU。显示在你的手机上。不管你现在在哪。
Checkpoint
打开手机上的 Termius。SSH 连接到你的服务器。运行
nvidia-smi。如果你能看到 GPU 列表,说明你已经解锁了远程访问。你现在可以从世界上任何地方连接你的服务器。
这是基础中的基础。之后的每一章都假设你能从手机连上服务器。下一章,你将确保你的训练会话在断开连接后依然存活——因为手机的 SSH 连接不会永远保持,而且它也不需要。