Linux SSH免密登录:从“刷卡进门”到“刷脸通行”的完整指南

适用环境:OpenSSH 9.x + Linux (Ubuntu 22.04 / Rocky Linux 9 验证)

难度系数:⭐⭐☆☆☆(只要你会敲命令就能懂)

阅读收益:告别 password:输入焦虑,实现自动化运维第一步


一、为什么我们要搞「免密」?------ 先讲个故事

想象一下:

  • 普通 SSH:每次进门都要掏钥匙 ➜ 输密码 ➜ 手抖输错 ➜ 再输一遍 😩

  • 免密 SSH:第一次录入指纹,之后直接刷脸进门 ➜ 丝滑顺畅 🚀

真实痛点场景:

  • 你有 10 台服务器,每天要登 20 次

  • 写了自动化脚本,却卡在密码输入这一步

  • CI/CD 流水线需要无交互登录

👉 结论:不会免密,不算真·运维


二、核心原理(不讲废话版)

SSH 免密 ≠ 没有认证

而是把 "密码认证" ​ 换成了 "密钥认证"

方式 安全性 自动化友好度
密码登录 ⭐⭐
密钥登录 ⭐⭐⭐⭐⭐

本质流程:

复制代码
本机(私钥 id_rsa)  ------→  服务器(公钥 id_rsa.pub)

👉 私钥 = 你家钥匙

👉 公钥 = 门锁里存的指纹

只有钥匙匹配,门才会开。


三、实战开始:一步步来,绝不跳步 🛠️

1️⃣ 环境假设(照着改就行)

角色 IP / 主机名
客户端 client.local
服务端 server.local
用户 ops

2️⃣ 生成密钥对(推荐 ed25519)

bash 复制代码
ssh-keygen -t ed25519 -C "ops@client"

📌 为什么要 ed25519?

  • 比 RSA 更快

  • 更安全

  • OpenSSH 官方推荐 ✅

交互过程示例:

复制代码
Enter file in which to save the key (/home/ops/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

建议:

  • 回车默认路径

  • 生产环境建议设置 passphrase(相当于给钥匙再加一把锁)

生成结果:

bash 复制代码
~/.ssh/
├── id_ed25519      # 🔑 私钥(打死不能给别人)
└── id_ed25519.pub  # 📢 公钥(随便发)

3️⃣ 把公钥拷贝到服务器(三种姿势)

✅ 姿势一:ssh-copy-id(最推荐)
bash 复制代码
ssh-copy-id ops@server.local

它会自动:

  • 创建 ~/.ssh

  • 写入 authorized_keys

  • 修正权限(新手福音)


✅ 姿势二:手动(适合批量/脚本)
bash 复制代码
cat ~/.ssh/id_ed25519.pub | ssh ops@server.local \
"mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

✅ 姿势三:Ansible 批量(高阶彩蛋)

yaml

复制代码
- authorized_key:
    user: ops
    state: present
    key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"

4️⃣ 登录测试

bash 复制代码
ssh ops@server.local

🎉 如果直接进系统,恭喜你:免密成功!


四、常见翻车现场 & 排错指南 🚨

90% 的问题都出在这里!

现象 原因 解决方案
Permission denied 目录权限不对 chmod 700 ~/.ssh
Still asking password SSH 配置未开启 见下方
连接慢 DNS 反向解析 UseDNS no

服务端关键配置 /etc/ssh/sshd_config

ini

复制代码
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no   # ✅ 强烈建议最后再关

重启服务:

bash 复制代码
sudo systemctl restart sshd

五、进阶玩法(装 X 用 😎)

🔐 1. SSH Agent(避免反复输 passphrase)

bash 复制代码
eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519

🧱 2. 禁止 root 远程登录

ini

复制代码
PermitRootLogin no

🛡️ 3. 配合 Fail2ban(防暴力破解)

bash 复制代码
sudo dnf install fail2ban -y

六、安全警示(非常重要 ⚠️)

🔴 以下内容请你逐字阅读

  1. 私钥 = 身份

    • 泄露 = 别人可以冒充你登录服务器

    • 绝对不要:

      • 提交到 GitHub

      • 发给同事

      • 放在网盘

  2. 生产环境建议

    • 禁用密码登录

    • 使用非默认端口

    • 定期轮换密钥

  3. 法律红线

    ⚠️ 本文所有操作 仅限合法授权环境

    ❌ 严禁用于未授权服务器访问

    ❌ 严禁绕过公司/平台安全策略

    由此产生的一切法律责任,由操作者自行承担

相关推荐
代码AC不AC6 小时前
【Linux】线程控制
linux·线程·线程控制
认真的薛薛6 小时前
Terraform: AWS VPC+可SSH登录EC2
ssh·aws·terraform
Chirp7 小时前
Windows下借助wsl2读取ext4格式磁盘
linux·windows
taocarts_bidfans7 小时前
反向海淘站点运维优化与常见技术问题排查
大数据·运维·跨境电商·独立站·反向海淘
IMPYLH7 小时前
Linux 的 whoami 命令
linux·运维·服务器·bash
头歌实践平台7 小时前
头歌静态路由与默认静态路由
运维·服务器·网络
NashSKY7 小时前
RK3588 Linux SDK 编译、烧录与 MIPI 屏配置流程
linux·rk3588
宋浮檀s7 小时前
DVWA通关教程2
运维·服务器·前端·javascript
JAVA社区8 小时前
Java进阶全套教程(七)—— Redis超详细实战详解
java·linux·开发语言·redis·面试·职场和发展