配置 SSH 免密登录 —— 目的只有一个:让这本地Windows 不用每次输密码就能登录服务器
第 1 条:生成一对密钥
powershell
ssh-keygen -t ed25519 -f $env:USERPROFILE\.ssh\id_ed25519
拆开看:
| 部分 | 含义 |
|---|---|
ssh-keygen | SSH 自带的密钥生成工具 |
-t ed25519 | 密钥类型。ed25519 比老的 RSA 更短更快更安全,现在推荐用它 |
-f <路径> | 密钥存到哪、叫什么。$env:USERPROFILE 就是 C:\Users\Sxry,所以最终是 C:\Users\Sxry\.ssh\id_ed25519 |
跑完会生成两个文件(这是理解整件事的关键):
id_ed25519—— 私钥。相当于你家钥匙,绝不能给别人、不能进 Git、不能进备份包id_ed25519.pub—— 公钥。相当于挂在门上的锁,可以随便公开发布
生成过程中它会问两件事:保存路径(你已经用 -f 指定了,直接回车)、passphrase(口令,可以留空直接回车;留空=登录时不问口令,配自动化脚本更方便)。
注意:如果
C:\Users\Sxry\.ssh目录不存在,直接跑可能报错。先手动建一下:powershell
New-Item -ItemType Directory -Path $env:USERPROFILE\.ssh -Force
-f指定的是路径,不带.pub,.pub是它自动加的后缀。
第 2 条:把公钥装到服务器上
powershell
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@sxry.net "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys"
这条命令干了三件事,从右往左看:
① 远程执行的命令(引号里的部分,在服务器上跑):
| 片段 | 作用 |
|---|---|
mkdir -p ~/.ssh | 确保服务器上有 ~/.ssh 目录(-p = 已存在也不报错)。~ 是 root 的家目录 /root |
chmod 700 ~/.ssh | 把这个目录权限设成”只有我自己能读写进入”。SSH 强制要求,权限太开放会拒绝用密钥登录 |
cat >> ~/.ssh/authorized_keys | 把标准输入追加到 authorized_keys 文件末尾 |
authorized_keys 就是服务器的准入名单:里面每一行是一把被允许进门的公钥。用 >>(追加)而不是 >(覆盖)很重要——覆盖会把服务器上已有的其他公钥全删掉,导致别的机器也登不上了。
② 管道 |:把左边命令的输出(公钥内容)喂给右边的 ssh,作为远程那条 cat 的标准输入。
③ type <文件>:Windows 上就是 cat,把公钥文件内容打印出来。
整条命令读作:“把本机公钥的内容,通过 SSH 发到服务器上,追加进它的准入名单”。
之后发生了什么(原理)
以后你 ssh root@sxry.net 时,服务器会发一个随机挑战:
- 服务器说”证明你有对应私钥”
- 你的 ssh 客户端用本地私钥签名,把签名发回去
- 服务器用
authorized_keys里那把公钥验证签名 - 通过 → 放行,全程私钥从不离开你的电脑
这就是为什么可以公开公钥、却必须保护私钥。