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. 法律红线

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

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

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

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

相关推荐
^yi10 分钟前
【Linux系统编程】对操作系统的理解
linux·运维·服务器·操作系统·系统调用·os
Kina_C26 分钟前
LVS-NAT 负载均衡实验从环境搭建到规则持久化
linux·运维·服务器·负载均衡·lvs
小肝一下39 分钟前
7. 库制作与原理
linux·c语言·操作系统·bash·shell·动静态库
Android洋芋1 小时前
PrintFriendly网页文章转PDF插件工具及技术分析
运维·服务器·pdf·网页转pdf
Elastic 中国社区官方博客1 小时前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索
RoboWizard1 小时前
金士顿高速闪存盘 单双接口适配多元存储需求
大数据·运维·人工智能·智能手机·云计算
hkj88081 小时前
Ubuntu 20.04 安装 OpenJDK 17
linux·运维·ubuntu
huainingning1 小时前
防火墙重启后ssl登录提示证书过期临时解决方法
linux·服务器·ssl
sulikey1 小时前
服务器安装Docker教程。如何在云服务器安装Docker容器?
运维·服务器·ubuntu·docker·安装教程·云服务器
许彰午1 小时前
17-22-运维与高级主题
运维·网络