SSH 免密登录教程:从原理到实战,一次配置永久生效

4月 16, 2026 · 4 分钟阅读时长
blog
注意

适用场景:Windows 本地 → Linux 远程服务器(HPC 集群、实验室工作站等)。 配置一次,永久免密。全文约 5 分钟。

一、为什么要配置免密登录?

每次 ssh 都要手动输入密码,不仅操作繁琐,还存在安全隐患——密码在网络传输中可能被截获。

SSH 密钥认证使用非对称加密替代密码登录,同时解决了这两个问题:

  • 🔒 更安全 — 私钥从不离开本机,无法被中间人截获
  • ⚡ 更方便 — 连接时自动完成身份验证,无需交互

二、原理图解

SSH 密钥是成对出现的两个文件:

文件存放位置作用能否公开
🔑 私钥 id_rsa你的电脑 ~/.ssh/签名,证明"我是我"❌ 绝不泄露
🔓 公钥 id_rsa.pub服务器 ~/.ssh/authorized_keys验证签名✅ 可以公开

四步握手流程

    你的电脑 (客户端)                      远程服务器
        │                                     │
   ①   │──── "我是 <用户名>" ───────────────→│
        │                                     │
   ②   │←─── 找到公钥,发送随机挑战 ─────────│
        │                                     │
   ③   │──── 用私钥签名挑战 ────────────────→│
        │                                     │
   ④   │←─── 用公钥验证签名 → ✅ 免密登录! ──│
提示

直觉理解:把公钥当作一把"锁"装在服务器门上,私钥是唯一配套的"钥匙"。能开锁 = 证明身份 = 不用密码。


三、操作步骤

3.1 🔍 检查是否已有密钥

打开 PowerShell 或 cmd:

type $env:USERPROFILE\.ssh\id_rsa.pub
输出结果说明操作
显示 ssh-rsa AAAAB3...✅ 已有密钥直接跳到 3.3
报错"找不到文件"❌ 尚未生成继续 3.2

3.2 🔧 生成密钥对(仅首次)

ssh-keygen -t rsa -b 4096

连按 三次回车(全部使用默认值,不设密码短语):

Generating public/private rsa key pair.
Enter file in which to save the key (.../.ssh/id_rsa):     ← 回车
Enter passphrase (empty for no passphrase):                ← 回车
Enter same passphrase again:                               ← 回车

生成完毕后,C:\Users\你的用户名\.ssh\ 目录下会出现两个文件:

  • id_rsa — 私钥 ⚠️ 绝对不要发给任何人
  • id_rsa.pub — 公钥(需复制到服务器)

3.3 📤 一键推送公钥到服务器

type $env:USERPROFILE\.ssh\id_rsa.pub | ssh -p 端口号 用户名@服务器地址 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

实际例子(中科算联云 · 西北 1 集群):

type $env:USERPROFILE\.ssh\id_rsa.pub | ssh -p 50888 <用户名>@c1.hpcmaster.com "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
警告

首次连接会提示 Are you sure you want to continue connecting?,输入 yes。随后需要输入一次密码——这是你最后一次输入密码。

📋 命令逐段拆解(点击展开)
部分作用
type ...id_rsa.pub读取本地公钥内容
|通过管道传输给远程 SSH
mkdir -p ~/.ssh在服务器上创建 .ssh 目录
chmod 700 ~/.ssh设置目录权限(仅本人可访问)
cat >> ~/.ssh/authorized_keys将公钥追加到授权列表
chmod 600 ~/.ssh/authorized_keys设置文件权限(仅本人可读写)

3.4 ✅ 验证免密登录

ssh -p 50888 <用户名>@c1.hpcmaster.com "hostname"

如果直接返回主机名而没有要求密码 → 🎉 配置成功!


四、进阶:配置 SSH 别名

每次输 ssh -p 50888 <用户名>@c1.hpcmaster.com 太长了?配个别名,一劳永逸。

编辑 C:\Users\你的用户名\.ssh\config 文件,添加:

# ═══ 中科算联云 ═══
Host hpc-west1
    HostName c1.hpcmaster.com
    Port 50888
    User <用户名>

Host hpc-west
    HostName c2.hpcmaster.com
    Port 50888
    User <用户名>

# ═══ 矿大内网服务器 ═══
Host cumt-server
    HostName <内网服务器IP>
    Port 5911
    User wrf4

配置后的效果:

ssh hpc-west1       # 等价于 ssh -p 50888 <用户名>@c1.hpcmaster.com
ssh hpc-west        # 等价于 ssh -p 50888 <用户名>@c2.hpcmaster.com
ssh cumt-server     # 等价于 ssh -p 5911  wrf4@<内网服务器IP>
提示

scp 也支持别名,文件传输同样变简洁:

scp 本地文件 hpc-west1:/data/user/<用户名>/目标路径/

五、常见问题排查

❓ 推送公钥后还是要密码?

依次检查以下三项:

① 权限问题(最常见)——SSH 对文件权限要求极严格:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

② 公钥是否正确追加:

cat ~/.ssh/authorized_keys
# 应看到 ssh-rsa AAAAB3... 开头的完整一行

③ 服务器是否开启密钥认证:

grep PubkeyAuthentication /etc/ssh/sshd_config
# 应为 PubkeyAuthentication yes,若为 no 需联系管理员

❓ 能给多台服务器配免密吗?

可以。同一把公钥可以推送到任意多台服务器——重复执行 3.3 步骤,替换服务器地址即可。

❓ 换了电脑怎么办?

两种方案:

  1. 迁移密钥:把旧电脑的 ~/.ssh/id_rsa + id_rsa.pub 复制到新电脑同一位置
  2. 重新生成:在新电脑执行 3.2 → 3.3,重新推送新公钥

❓ 私钥泄露了怎么办?

小心

私钥泄露属于严重安全事件,请立即执行:

  1. 登录每台已配置的服务器,编辑 ~/.ssh/authorized_keys,删除旧公钥对应的行
  2. 在本地重新 ssh-keygen 生成新密钥对
  3. 重新推送新公钥到所有服务器

❓ Warning: remote port forwarding failed for listen port 7890?

这是代理软件(如 Clash)的端口转发配置导致的,不影响 SSH 连接,可以安全忽略。 如需消除警告,检查 SSH config 中是否有 RemoteForward 相关行并移除。


六、安全建议速查

🛡️ 做法📌 建议
私钥文件永远不要发给他人、上传 GitHub、或复制到不信任的设备
密码短语对高安全需求场景,建议在 ssh-keygen 时设置 passphrase
定期轮换每 1–2 年更换一次密钥对
清理旧钥定期检查 authorized_keys,删除不再使用的旧公钥
Townsend
Authors
2025级博士研究生
我是中国矿业大学2025级在读博士生,研究方向为大气甲烷反演与量化。 当前依托碳排放与空气质量遥感团队开展研究,聚焦“遥感反演-排放量化-影响归因”技术链条。