ARTICLE · 1280479
用密钥让AI控制云服务器
用密钥让 AI 控制云服务器
SSH 免密 · 五步落地 · 安全收尾
密钥登录解决的正是这件事——一个文件证明身份,一条命令完成登录,全程不需要人工干预。本文从原理讲到落地,再补齐安全收尾和高频排错。
先看速查:整件事就五步
核心矛盾只有一句话:怎么在不暴露密码的前提下,让一个非人类操作者反复登录服务器。下面五步按执行顺序排列,全程只在本地机器上操作,服务器端只需要一次密码。
▸ 产出:id_ed25519(私钥)+ id_ed25519.pub(公钥) |
▸ 关键点:用 >> 追加,不能用 > 覆盖 |
▸ 判断标准:直接进命令行 = 成功 |
▸ 好处:换服务器只改一行,AI 侧脚本不动 |
▸ 顺序很重要:先验证,再收紧 |
| 动手前的约定 |
一、先搞清楚原理:密钥对到底在做什么
不理解原理直接复制命令,一旦失败就只能靠猜。花两分钟把这一节看完,后面每一步你都知道自己在干什么。
▎两个文件的角色分工
▸ 类比:印章,握在手里,只在纸上盖一下 |
▸ 类比:印鉴样本,公开在册,用于比对 |
▎握手过程其实就三句话
整个过程中,私钥既没有出现在网络上,也没有交给服务器。服务器只验证了「对方持有对应私钥」这一件事。
▎和密码登录的差别,不止是省了敲键盘
| 一条不能破的红线 |
二、先把代号对齐,再看命令
后面的命令里会反复出现这几个占位符。先把它们记住,读命令时就不会被字母绕晕。
| 建议给 AI 单独开一个账号 |
三、第一步:在本地生成密钥对
在 B 上打开 Windows PowerShell,执行:
▎三个参数分别管什么
▎为什么选 ed25519 而不是 RSA
只有一种情况该退回 RSA:目标服务器系统极老(CentOS 6 时代的 OpenSSH 5.x),不认 ed25519。那时用 ssh-keygen -t rsa -b 4096。
▎passphrase 留空,是一个有代价的选择
| 留空可以,但必须用别的办法补回来 |
▎生成后得到两个文件
四、第二步:把公钥装到服务器上
这一步在本地 PowerShell 里完成,是全流程唯一需要输入密码的环节。下面是一条命令,因排版折行。
执行后提示 A_USER@A_IP's password,此时输入服务器登录密码,输入时屏幕不显示字符属正常。
若提示 type 不是可识别的命令,换成等价写法:
▎命令拆开看,每一段都不能省
| 最容易犯的错:把 >> 写成 > |
▎装完可以核一下
输出里应该能看到你的注释(例如 ai-controller-for-A)以及 ssh-ed25519 开头的整行。若只看到一个空行或报错,说明管道没生效,重来一次。
五、第三步:验证免密是否生效
进入后输入 exit 退回本地。这一步必须成功才能继续——在没确认免密可用的前提下直接去关密码登录,等于把自己锁在门外。
六、第四步:配置别名,把长命令变短
到这一步免密已经能用了,别名是锦上添花,但对 AI 场景很关键:它把「IP + 用户名 + 密钥路径 + 端口」四个变量收敛成一个词,以后换服务器只改配置文件,AI 侧的调用方式一个字都不用动。
$entry = @" Host server-a HostName A_IP User A_USER IdentityFile ~/.ssh/id_ed25519 Port 22 "@ New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.ssh" | Out-Null if (Test-Path $configPath) { Add-Content -Path $configPath -Value $entry -Encoding ascii } else { Set-Content -Path $configPath -Value $entry.TrimStart() -Encoding ascii } Get-Content $configPath |
▎五个字段的含义
▎这段脚本做了三件安全的事
| 不覆盖已有配置 | |
| 强制 ASCII 编码 | |
| 末尾打印结果 |
| 两个容易忽略的细节 重复执行会重复追加同名 Host 段落,SSH 取第一个匹配项,此时需要手动打开文件删掉多余的段。 |
七、第五步:验证别名,然后交给 AI
不提示密码、直接进命令行即配置成功。加个 -v 可以看到详细的握手过程,卡在哪一步一目了然,排错时非常有用。
▎AI 侧要满足什么条件
三个条件都满足后,AI 只需要执行一条命令就能控制服务器:
ssh server-a "df -h" ssh server-a "systemctl status nginx" |
八、安全收尾:这一步省了,前面全白做
免密打通的那一刻,服务器的访问门槛就从「知道密码」变成了「持有文件」。门槛变低的同时,责任也转移到了文件管理上。
▎私钥的三不原则
▎Windows 下收紧私钥权限
如果 SSH 报 UNPROTECTED PRIVATE KEY FILE 或警告权限过宽,在管理员 PowerShell 中执行:
icacls "$env:USERPROFILE\.ssh\id_ed25519" /grant:r "${env:USERNAME}:R" |
▎一对密钥,一个用途
不要拿日常登录用的私钥给 AI 用。专钥专用的价值在于撤销干净:哪天不想让 AI 再碰这台机器,只需在服务器上删掉对应那一行公钥,其他访问一律不受影响。这也是密钥登录相较共享密码最实际的好处。
| # 服务器上查看并按注释定位要删的行 # 确认无误后编辑删除 vi ~/.ssh/authorized_keys |
▎关闭密码登录的正确顺序
密码登录开着,暴力破解就一直有人在试。但关它有严格顺序,顺序错了就是把自己锁在门外。
| 改配置前先备份,改完先测试语法 sshd -t sshd -t 通过再 reload。配置有语法错误时 reload 会让 sshd 拒绝加载,运气不好就直接失去所有远程入口,只能去云控制台开 VNC。 |
▎进阶:给这把公钥本身加上限制
authorized_keys 的每一行不只是公钥,行首还可以带选项。把限制写在这里,比在服务器全局做限制更精细——只约束这把密钥,不影响别人。
| # 一行完整的授权记录示例 |
| 加限制之前先想清楚一件事 |
九、排错清单:六种高频失败
免密配置失败,九成以上是下面六种情况。按「现象 → 原因 → 处理」对号入座即可。
| 原因 处理:先 cat ~/.ssh/authorized_keys 确认内容;再查 grep PubkeyAuthentication /etc/ssh/sshd_config 是否为 yes;最后看家目录权限是否不超过 755。 |
| 原因 处理:用 ssh -v 看日志里实际尝试的是哪把密钥、期望哪个用户;确认 authorized_keys 写在目标用户的家目录下。 |
| 原因 处理:确认文件名就是 config 无后缀;用 ssh -G server-a 打印最终解析结果,能看清实际生效的参数。 |
| 原因 处理:在服务器上执行 sed -i 's/\r$//' ~/.ssh/authorized_keys 清理一遍。 |
| 原因 处理:先用 telnet 或 Test-NetConnection A_IP -Port 22 确认端口可达,再去云控制台检查安全组规则。 |
| 原因 处理:按第八节的两条 icacls 命令收紧权限即可。 |
十、总结:三条容易做反的原则
| 最后一句 |
架构师学习笔记 · SSH 密钥与自动化运维















































































