第 8 章 · SSH 远程登录与密钥
本章目标:理解 SSH 如何安全登录 Linux 云主机;生成 ed25519 密钥对;配置 ssh config 别名;用 scp/rsync 同步 shop-demo;遇到 Permission denied (publickey) 知道逐步排查。
学时建议:4~5 小时(含 2.5 小时跟练)
前置:完成 linux-shell ch07;有一台可 SSH 的 Linux(云主机、VirtualBox 虚拟机、或第二台 WSL 实例均可)。
8.1 场景说明:代码在笔记本,服务在云上
ch14 要在 Linux 服务器部署 api-go-demo。你本地 WSL 里改好了 shop-demo,Leader 说:「把代码弄到测试机,别发微信 zip。」
生产标准做法:
本机 ~/dev-workspace/shop-demo
│ scp / rsync(走 SSH 加密通道)
▼
云主机 ubuntu@203.0.113.10:~/dev-workspace/shop-demo
│ ch14:go build + systemd
▼
curl http://测试机:8080/healthz
SSH = 远程登录 + 传文件的安全隧道;密钥登录 = 不用每次输密码,且比弱密码安全得多。
8.2 学完你能
| 能力 | 验收 |
|---|---|
| 密钥对 | ~/.ssh/id_ed25519 与 .pub 存在,权限正确 |
| 免密登录 | ssh shop-dev 一次成功 |
| config 别名 | 不用记 IP 和 -i 路径 |
| 传项目 | rsync 同步 shop-demo 到远端 |
| 排错 | publickey / timeout / Host key changed 各知怎么处理 |
8.3 两个概念:密码登录 vs 密钥登录
| 方式 | 流程 | 问题 |
|---|---|---|
| 密码 | 每次 ssh user@ip 输入密码 | 易被撞库;自动化脚本难写 |
| 密钥 | 本机私钥 + 服务器公钥 配对 | 私钥泄露=账号失守;需保管好 |
学院约定:
- 私钥永不进 Git、永不发聊天工具
- 生产服务器逐步禁用密码登录(仅密钥),你只须理解概念
- 日常开发用普通用户 +
sudo,不要习惯ssh root@
8.4 跟练:生成 ed25519 密钥对
步骤 1 — 确认没有旧密钥冲突(可选)
ls -la ~/.ssh 2>/dev/null || echo "尚无 .ssh 目录,正常"
步骤 2 — 生成新密钥
ssh-keygen -t ed25519 -C "you@example.com" -f ~/.ssh/id_ed25519
交互时你应该看到:
Enter passphrase:可直接回车(教学机);生产建议设 passphrase + ssh-agent- 生成完毕提示
Your identification has been saved...
步骤 3 — 权限(必须做,否则 SSH 拒绝)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
ls -la ~/.ssh
读懂权限:
| 文件 | 权限 | 原因 |
|---|---|---|
~/.ssh/ | 700 | 仅本人进目录 |
私钥 id_ed25519 | 600 | 泄露则别人能冒充你 |
公钥 .pub | 644 | 本来就要给别人装 |
步骤 4 — 看公钥内容(待会装到服务器)
cat ~/.ssh/id_ed25519.pub
你应该看到一行:ssh-ed25519 AAAA... you@example.com
8.5 跟练:把公钥装到服务器
任选 A / B / C 一种环境练通即可。
方式 A:ssh-copy-id(最省事,需暂时能密码登录)
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@YOUR_SERVER_IP
按提示输入最后一次服务器密码。成功后会写远端 ~/.ssh/authorized_keys。
方式 B:云厂商控制台
阿里云 / 腾讯云 / AWS 等:密钥对 或 实例 → 绑定公钥,粘贴 id_ed25519.pub 全文。
方式 C:手动(理解原理)
# 先密码登录一次
ssh ubuntu@YOUR_SERVER_IP
mkdir -p ~/.ssh && chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys # 粘贴本机 cat id_ed25519.pub 那一行
chmod 600 ~/.ssh/authorized_keys
exit
远端 authorized_keys 一行 = 允许哪把公钥对应的私钥登录。
8.6 跟练:第一次密钥登录
ssh -i ~/.ssh/id_ed25519 ubuntu@YOUR_SERVER_IP
你应该看到:直接进入远端 shell,不再问密码(若仍问密码 → 见 8.10 排错)。
步骤 2 — 验证在远端
whoami
hostname
pwd
exit
8.7 跟练:ssh config 别名(老手必备)
每次记 IP 和 -i 太痛苦。编辑本机:
nano ~/.ssh/config