电脑带不动了,我把开发搬到了另一台机器上

我的 MacBook 跑不动了。
不是坏了,是不够用 —— 同时开几个 AI agent 干活的时候,系统先扛不住开始卡顿,是内存不足。手边正好还有一台配置更好的机器闲着,问题就变成了:怎么让我在这台电脑上写代码,实际跑在那台上。
答案是 SSH。下面是我从完全不懂到配顺手的过程,文末附了我自己在用的那份流程。
SSH 是什么
一句话:让你在自己电脑的终端里,操作另一台电脑。
打个比方,远程桌面是把那台电脑的屏幕整个搬过来,你看到完整的图形界面,鼠标点点点。SSH 不搬屏幕,它只传文字 —— 你敲的命令传过去,那边的输出传回来。
代价是没有图形界面,好处是极省带宽、响应快,而且服务器本来就是这么用的(很多服务器根本没装图形界面)。写代码这件事大部分时间也就是在跟文字打交道,所以够用。
最简单的形态就一行:
ssh 用户名@那台机器的IP
回车,输密码,你的终端提示符就变成那台机器的了。之后敲的每一条命令都在那边执行。
连上之后,第一件烦人的事
上面那行命令,我一天要敲几十次。
每次都是:想不起来 IP,翻记录;敲 ssh xxx@192.168.x.x;等它问密码;输密码(还看不见自己输了几个字符);输错重来。开三个终端窗口就是三遍,合上电脑再打开,又是三遍。
真正难受的是它打断你。你本来想的是「我要去那台机器上看个日志」,中间却插进来一段跟这个目的毫无关系的操作。
所以我去查了怎么把这两步都省掉:不用记 IP,也不用输密码。

免密登录,配的其实是一把钥匙
「免密」这个词有点误导。它不是不验证了,是换了一种更安全的验证方式。
用锁和钥匙来理解最快:
- 你在自己电脑上生成一对东西:私钥和公钥;
- 公钥像一把锁,你把它装到那台机器上。锁可以随便给人看,贴在门上都行;
- 私钥是钥匙,永远待在你自己电脑里。
登录的时候,那台机器发一段随机数据过来,你的电脑用私钥签个名发回去,它用门上那把锁验一下,对得上就放你进来。
整个过程私钥从来没有离开过你的电脑。 这点我第一次听的时候愣了一下:所以那台服务器就算被人黑了,对方也拿不到你的钥匙,顶多把你的锁撬掉。这比每次把密码原样发过去安全得多。

至于记 IP,SSH 自带解决方案:在 ~/.ssh/config 这个文件里,可以给每台机器自定义一个别名,顺便把用户名一起存进去。配好之后 ssh 外号 就等于 ssh 用户名@192.0.2.10,具体写法在文末。
两件事配完,登录就是敲三个字母加回车。
我把它整理成了一套 SOP
上面这些我自己从头走了一遍,中间该踩的坑一个没少踩:钥匙生成在了奇怪的位置、权限没设对被拒之门外、配置写完了却没生效。折腾通之后,我把整个过程整理成了一份 SOP —— 一份文本说明,从「先看看你有没有钥匙」开始,到最后怎么确认真的配好,每一步都写清楚了。
有一点要特别说明:这份 SOP 是专门写给 AI 看的,不是传统意义上给人照着敲的教程。
你不用自己一行行去执行。把这份 SOP 直接发给你在用的 AI,跟它说「按这个流程帮我配好」,它会顺着流程往下走,该问你的地方停下来问你,该验证的地方拿结果给你看。
我做成这个形式,是因为现在这个时候,能交给 AI 的手动操作,实在没必要自己再做一遍。我踩坑攒下来的这点东西,与其写成一篇让你照着敲二十条命令的教程,不如做成一份 AI 读完就能直接干活的说明。
这份 SOP 我无偿分享,需要的话私信我,我发给你。
照着做
下面这版是给人看的,想自己动手的可以照着走一遍(交给 AI 跑的是上面那份 SOP,两者做的是同一件事)。示例里的 192.0.2.10 是文档专用地址,换成你自己的。
1. 先看看你有没有钥匙
ls -la ~/.ssh/
如果已经有 id_ed25519 和 id_ed25519.pub,跳过第 2 步直接用它。重新生成会覆盖旧私钥且不可恢复,你在其他机器上配好的免密会全部失效。
2. 生成一对钥匙
ssh-keygen -t ed25519 -C "$(whoami)@$(hostname -s)"
- 一路回车用默认路径
~/.ssh/id_ed25519。放在默认路径上 SSH 会自动找到,配置里就不用再指定。 -C那段注释会出现在那台机器的记录里,写成「用户@设备名」方便以后认出是哪台电脑。- 中间会问你要不要设 passphrase(给钥匙再加一道密码)。留空 = 以后零输入,但私钥在磁盘上是明文;设了 = 更安全,配合第 6 步的钥匙串也只用输一次。输入不回显是正常的。
记一下公钥指纹,第 5 步要对:
ssh-keygen -lf ~/.ssh/id_ed25519.pub
3. 把锁装到那台机器上
ssh-copy-id 用户名@192.0.2.10
输一次密码,它会自动把公钥追加过去,并把权限设对。这一步得你自己在终端敲 —— 它要弹密码框,交给脚本或 AI 会直接卡死。
ssh-copy-id 不是所有 macOS 都预装,先 command -v ssh-copy-id 看一眼。没有的话手动等价写法:
cat ~/.ssh/id_ed25519.pub | ssh 用户名@192.0.2.10 \
'umask 077; mkdir -p ~/.ssh && { [ -z "$(tail -1c ~/.ssh/authorized_keys 2>/dev/null)" ] || echo >> ~/.ssh/authorized_keys; } && cat >> ~/.ssh/authorized_keys'
两个细节:umask 077 保证文件一创建就是安全权限,比事后 chmod 少一个窗口;tail -1c 那段是防止你的公钥被拼到上一行的尾巴上 —— 真发生了会让两把钥匙同时失效。
这里只能追加,不能覆盖。 永远用 >>,不要用 >,那个文件里通常还有你别的设备的公钥。
如果那台机器已经关掉密码登录了,这条路走不通,得借一台已经能进去的机器把公钥写进去。另外,一台设备配一对钥匙,别把私钥拷到第二台电脑上 —— 共用之后你就分不清日志里是谁登的,想吊销一台就得给所有设备换钥匙。
4. 自定义一个别名
编辑 ~/.ssh/config(没有就新建):
Host 外号 192.0.2.10
HostName 192.0.2.10
User 用户名
Host 后面可以写多个名字,空格分开,都指向下面这套设置。我习惯把别名和 IP 都写上,这样两种敲法都能用。以后:
ssh 外号
5. 试一下
ssh 外号
不问密码直接进去就成了。
想再确认一下确实是钥匙在起作用,可以让它把过程打出来:
ssh -v -o BatchMode=yes 外号 true 2>&1 | grep 'Authenticated to'
看到 using "publickey" 就没问题。
进不去的话,八成是那台机器上的权限太松,先看这个:
ssh 外号 'ls -ld ~/.ssh; ls -l ~/.ssh/authorized_keys'
~/.ssh 要是 700,authorized_keys 要是 600。
6. 设了 passphrase 的话,接一下钥匙串
在 ~/.ssh/config 末尾加:
Host *
AddKeysToAgent yes
UseKeychain yes
然后执行一次,以后重启也不用再输:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
ssh-add -l
注意 Host * 是兜底块,要放在文件最后 —— 每个参数只认第一次匹配到的值,专用配置放在它前面才能覆盖它。

两个文件别搞反
刚开始我一直分不清这两个:
| 文件 | 在哪 | 装的是谁的公钥 | 干什么 |
|---|---|---|---|
authorized_keys | 那台机器上 | 你的 | 它用来验证你 |
known_hosts | 你电脑上 | 它的 | 你用来验证它,防止连到冒牌货 |

下一篇:我在那台机器上写代码,然后卡住了
登录这关过了,我就开始在那台机器上跑 Codex,通过 SSH 连过去指挥它干活。
结果卡在一件完全没想到的事上:我在 Mac 上截了个图,想贴给它看,贴不进去。
文字能粘贴,图片不行。这条链路比我以为的深,一共五层,断在哪一层的现象都一模一样。下一篇写这个:远程开发很爽,直到我想贴一张截图。
聊两句
你有没有把哪件反复要做的操作,整理成过自己的一份流程?评论区说说,我很想知道大家都在哪儿偷懒。
分享与订阅

读者交流
评论
按需加载评论,不影响正文阅读。