Skip to content

第二章:远程访问

连不上的服务器等于废铁

你有一台 GPU 服务器。也许它在大学实验室里,也许是个云实例,也许是你导师三年前买的、塞在某张桌子底下的机器。它有 GPU,能跑训练。

但你只有坐在工位上、从笔记本通过校园网 SSH 进去时,才能用它。

你的服务器每天有 16 个小时是闲置的。不是因为它关了——是因为 你连不上

这一切到此为止。

这一章结束时,你将能从手机上 SSH 进你的服务器,随时随地。咖啡店、机场、半夜被通知训练崩了时躺在床上。打开一个 App,点一下你的服务器,就连上了。

这是后面所有内容的基础。没有远程访问,就没有自主化科研。先把这一步搞定。


SSH 密钥:别再输密码了

每次输密码登录服务器,你就在做错事。密码慢、不安全(被偷看、键盘记录器、密码复用),而且让自动化变得不可能——Claude Code 没法替你输密码。

SSH 密钥解决所有这些问题。你生成一对密钥:私钥(留在本地,绝不外传)和公钥(放到服务器上)。连接时,数学校验通过,你就进去了。不会再弹密码框。永远不会。

生成密钥对

在你的本地机器(笔记本/台式机)上:

bash
ssh-keygen -t ed25519 -C "[email protected]"

询问保存路径时,按 Enter 接受默认值(~/.ssh/id_ed25519)。询问 passphrase 时,按 Enter 留空。对,不设 passphrase。后面自动化需要无人值守的 SSH 连接——带 passphrase 的密钥会阻断每一个自动连接。

这会创建两个文件:

  • ~/.ssh/id_ed25519 — 你的私钥。拿命来护。不要拷到服务器上,不要通过邮件发送,不要提交到 git。
  • ~/.ssh/id_ed25519.pub — 你的公钥。这个要放到服务器上。

把公钥拷贝到服务器

bash
ssh-copy-id your-username@your-server

这是你最后一次输密码。ssh-copy-id 会把你的公钥追加到服务器的 ~/.ssh/authorized_keys 文件里。从此以后,服务器认你的密钥,不再要密码。

测试一下

bash
ssh your-username@your-server

没有密码提示,直接进去了。如果还在要密码,说明哪里出了问题——检查服务器上 ~/.ssh/authorized_keys 的权限是否是 chmod 600~/.ssh 目录是否是 chmod 700


SSH Config:告别冗长的命令

你刚才用 ssh your-username@your-server 登录了。比输密码好多了。但你的服务器可能用了非标准端口、一长串域名、还有个你老记不住的用户名。类似这样:

bash
ssh [email protected] -p 2222 -i ~/.ssh/id_ed25519

你不会每次都打这一串。你不需要记住它。你只需要写一次,然后永远忘掉它。

创建 SSH config

打开 ~/.ssh/config(没有就新建):

bash
nano ~/.ssh/config

添加你的服务器:

Host lab-server
    HostName your.server.ip
    User your-username
    Port 22
    IdentityFile ~/.ssh/id_ed25519

保存退出。测试:

bash
ssh lab-server

搞定。两个词。ssh lab-server。在你剩余的科研生涯里,你都只需要打这个。主机名、用户名、端口、密钥文件,全由 config 处理。

每一行的含义

  • Host — 你要用的别名。起个短的。labgpu1cluster——怎么顺手怎么来。
  • 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-serverssh 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 上:

bash
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

它会打开浏览器进行认证。用你的 Google/GitHub/Microsoft 账号登录。完成。

在服务器上安装 Tailscale

SSH 进你的服务器,运行同样的命令:

bash
ssh lab-server
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

注意:这需要服务器上的 sudo 权限。如果你在一个没有 root 权限的共享大学集群上,就没法在服务器端装 Tailscale。跳到下面的 Termius 部分——你仍然可以通过本地机器从手机 SSH 到服务器。但如果你有一台专用服务器或云实例,装上 Tailscale,绝对值得。

Tailscale 个人使用免费(最多 100 台设备),不需要付费计划。

验证连接

在你的本地机器上:

bash
tailscale status

你应该能看到你的本地机器和服务器都列出来了,各有一个 Tailscale IP。测试连接:

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 密钥。安装它:

免费版 vs Pro

免费版可以处理基本的 SSH 连接。跟完这个教程足够了。

如果你是学生GitHub Education 免费送你 Termius Premium。包含 SFTP、端口转发和跨设备密钥同步。用你的大学邮箱申请——验证需要几天,但绝对值得。现在就申请,等待期间用免费版。

在 Termius 中配置你的服务器

  1. 打开 Termius。点 Hosts+(添加新主机)。
  2. Alias 填一个好记的名字:lab-server
  3. Hostname 填你服务器的 Tailscale IP(100.x.y.z)。如果没装 Tailscale,填服务器的直连 IP(只能在同一网络下用)。
  4. Username 填你的服务器用户名。
  5. Keys 下,点 + 创建或导入密钥:
    • 方案 A(推荐):在 Termius 中生成新密钥对,把公钥复制到服务器的 ~/.ssh/authorized_keys
    • 方案 B:如果你有 Termius Premium,可以跨设备同步密钥。
  6. 保存主机。

连接

点一下你的服务器。连上了。

你在看着一个终端。在你的手机上。连着你的 GPU 服务器。跑个命令:

bash
nvidia-smi

你的 GPU 就在那里。在你的手机上。


见证时刻

这一章开始时,你只能坐在工位上才能连上服务器。现在你从地球上任何一个角落都能连上它。

来证明一下。把笔记本合上,拿起手机。

  1. 打开 Termius。
  2. 点你的服务器。
  3. 等待连接建立。
  4. 输入 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 连接不会永远保持,而且它也不需要。

Released under the MIT License.