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

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

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

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

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

相关推荐
kebidaixu4 小时前
BCU 平台 RS485 驱动适配:从 THVD1406 到 ISO3082
linux
杨浦老苏5 小时前
家庭实验室监控仪表盘HomeLab-Monitor
运维·docker·监控·群晖
回忆2012初秋5 小时前
【Nginx】原理、配置与运维实战(2)
运维·nginx·策略模式
Urbano6 小时前
工装外套全制作流程、工序痛点及自动化设备升级方案
运维·自动化
映翰通朱工6 小时前
工业4G网关无公网IP远程运维实战(内网终端异地访问方案)
运维·服务器·网络·安全·智能路由器
洪晓露7 小时前
将 rke2 集群证书延长至 10 年
运维·服务器·数据库
谢平康7 小时前
解决用 rm 报bash: /usr/bin/rm: Argument list too long错
linux·运维·运维开发
IP老炮不瞎唠7 小时前
Python 价格监控如何实现?思路与实用方法分享
运维·服务器·网络
GIS数据转换器7 小时前
城市排水生命线安全运行监测平台深度解析
java·运维·人工智能·python·安全·数据挖掘·无人机
Tokai_Teio_18 小时前
第四届黄河流域 misc
运维·服务器