【Linux进阶篇】SSH密钥认证保姆级实操:告别密码登录,远程连接更安全高效


🍃 予枫个人主页
📚 个人专栏 : 《Java 从入门到起飞》《读研码农的干货日常

💻 Debug 这个世界,Return 更好的自己!


引言

做Linux运维或后端开发,远程连接服务器是日常操作。密码登录不仅要反复输入密码,还存在被暴力破解的风险;而SSH密钥认证,既能实现免密登录提升效率,又能通过加密机制保障连接安全。今天就从原理到实操,拆解SSH对称与非对称加密,手把手教你用ssh-keygen生成密钥对、ssh-copy-id配置免密,再对比scp与rsync的远程传输用法,新手也能快速上手。

文章目录

一、SSH远程与密钥认证核心原理

SSH(Secure Shell)是一种加密的网络传输协议,核心作用是实现客户端与服务器之间的安全远程连接,替代了明文传输的Telnet协议,避免了数据被监听、篡改的风险。其加密机制主要分为两种,对应不同的使用场景:

1.1 对称加密

对称加密又称单密钥加密,核心特点是「加密和解密使用同一个密钥」。

  • 原理:客户端与服务器协商好一个共同的密钥,客户端发送数据时用该密钥加密,服务器接收后用同一个密钥解密;反之亦然。
  • 优势:加密、解密速度极快,适合大量数据传输场景。
  • 不足:密钥的传输的过程存在安全隐患------如果密钥在传输中被截取,攻击者就能破解所有加密数据。

小贴士:SSH不会单独使用对称加密,通常会结合非对称加密,解决密钥传输的安全问题。

1.2 非对称加密

非对称加密又称双密钥加密,核心特点是「加密和解密使用不同的密钥」,分为公钥(Public Key)和私钥(Private Key):

  • 私钥:仅保存在客户端本地,是核心密钥,绝对不能泄露(相当于你的"身份证",只有你自己拥有)。
  • 公钥:可以公开传输,甚至可以分享给任意服务器(相当于你的"名片",别人可以持有,但无法用它冒充你)。
  • 原理:用公钥加密的数据,只能用对应的私钥解密;用私钥加密的数据,只能用对应的公钥解密。SSH密钥认证,就是基于这个原理实现的。

1.3 SSH密钥认证的完整流程(必懂)

  1. 客户端通过ssh-keygen生成一对密钥(公钥+私钥);
  2. 客户端将自己的公钥,通过ssh-copy-id或手动方式上传到目标服务器;
  3. 客户端发起SSH连接请求时,服务器会生成一个随机字符串,并用客户端上传的公钥加密,发送给客户端;
  4. 客户端接收后,用自己的私钥解密该字符串,再将解密后的结果发送回服务器;
  5. 服务器验证客户端返回的结果,与自己生成的随机字符串一致,就允许客户端免密登录。

重点:整个过程中,私钥始终保存在客户端,从未传输过,因此即使公钥被截取,也无法破解连接,安全性拉满 ✅

二、免密登录配置(ssh-keygen+ssh-copy-id实操)

实操环境:客户端(Linux/Mac)、服务器(Linux,CentOS/Ubuntu均可),全程命令行操作,步骤简单,跟着敲就行,建议收藏备用!

2.1 第一步:客户端生成密钥对(ssh-keygen)

打开客户端终端,输入以下命令,无需修改默认参数,全程回车即可:

bash 复制代码
ssh-keygen -t rsa
  • 命令解析:
    • ssh-keygen:生成SSH密钥对的核心命令;
    • -t rsa:指定加密算法为RSA(最常用、兼容性最好,也可选择ed25519,安全性更高)。

执行结果说明:

  1. 会提示你"指定密钥保存路径",默认路径是 ~/.ssh/id_rsa(私钥)和 ~/.ssh/id_rsa.pub(公钥),直接回车即可;
  2. 会提示"设置密钥密码"(可选),如果设置,每次使用私钥登录时需要输入密码,进一步提升安全性;如果追求极致便捷,直接回车跳过(建议运维场景跳过,开发场景可设置);
  3. 执行完成后,进入 ~/.ssh 目录,即可看到生成的两个密钥文件:
    • id_rsa:私钥,妥善保管,不要删除、不要泄露;
    • id_rsa.pub:公钥,后续需要上传到服务器。

2.2 第二步:将公钥上传到服务器(ssh-copy-id)

客户端终端输入以下命令,将公钥一键上传到目标服务器,无需手动复制粘贴:

bash 复制代码
ssh-copy-id 用户名@服务器IP
  • 示例:ssh-copy-id root@192.168.1.100(root是服务器用户名,192.168.1.100是服务器IP);
  • 首次执行时,会提示"确认连接服务器",输入 yes 回车,再输入服务器的登录密码(仅这一次需要输密码,后续免密);
  • 执行成功后,会提示"number of key(s) added",表示公钥已成功上传到服务器。

手动上传备用方案(如果ssh-copy-id不可用):

如果服务器禁止ssh-copy-id命令,可手动复制公钥内容到服务器,步骤如下:

  1. 客户端查看公钥内容:cat ~/.ssh/id_rsa.pub,复制输出的全部内容;

  2. 登录服务器,进入 ~/.ssh 目录(如果没有该目录,执行 mkdir ~/.ssh 创建);

  3. 编辑authorized_keys文件(如果没有,执行 touch ~/.ssh/authorized_keys 创建):vim ~/.ssh/authorized_keys

  4. 将复制的公钥内容粘贴到文件中,保存退出(vim操作:按i编辑,粘贴后按Esc,输入:wq保存退出);

  5. 设置文件权限(关键,否则密钥认证无效):

    bash 复制代码
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys

2.3 第三步:验证免密登录

客户端终端输入SSH连接命令,无需输入密码,即可直接登录服务器:

bash 复制代码
ssh 用户名@服务器IP
  • 示例:ssh root@192.168.1.100
  • 如果能直接进入服务器终端,说明免密登录配置成功!🎉
  • 温馨提示:配置完成后,建议点赞收藏,后续远程连接直接复制命令,省去输密码的麻烦。

三、scp与rsync远程文件传输同步详解

配置好SSH免密登录后,除了远程登录,我们还经常需要在客户端与服务器之间传输文件,scp和rsync是最常用的两个命令,各有优势,按需选择即可。

3.1 scp命令(简单直接,适合少量文件传输)

scp(Secure Copy)是基于SSH协议的文件传输命令,核心特点是「简单、稳定」,适合少量文件、单个文件的快速传输,用法和cp命令类似。

核心用法(3种常用场景)

  1. 客户端 → 服务器(上传文件):

    bash 复制代码
    scp 本地文件路径 用户名@服务器IP:服务器目标路径
    • 示例:scp ~/test.txt root@192.168.1.100:/root/(将本地家目录的test.txt,上传到服务器root目录下);
  2. 服务器 → 客户端(下载文件):

    bash 复制代码
    scp 用户名@服务器IP:服务器文件路径 本地目标路径
    • 示例:scp root@192.168.1.100:/root/data.zip ~/Downloads/(将服务器root目录的data.zip,下载到本地Downloads目录);
  3. 传输目录(加-r参数):

    bash 复制代码
    # 客户端上传目录到服务器
    scp -r 本地目录路径 用户名@服务器IP:服务器目标路径
    # 示例:scp -r ~/project root@192.168.1.100:/root/

scp优势与不足

  • 优势:命令简单,无需额外安装(Linux/Mac默认自带),传输过程加密,安全性高;
  • 不足:不支持断点续传,如果传输大文件时中断,需要重新传输,效率较低。

3.2 rsync命令(高效灵活,适合大量文件/同步场景)

rsync(Remote Sync)也是基于SSH协议的工具,核心特点是「增量同步」,适合大量文件、大文件传输,以及定期同步场景,效率比scp更高。

核心用法(常用场景)

  1. 安装rsync(如果未安装):

    • CentOS:yum install rsync -y
    • Ubuntu:apt install rsync -y
    • 客户端和服务器都需要安装(部分系统默认已安装)。
  2. 客户端 → 服务器(上传/同步目录):

    bash 复制代码
    rsync -avz 本地目录路径 用户名@服务器IP:服务器目标路径
    • 示例:rsync -avz ~/project root@192.168.1.100:/root/
    • 命令解析:
      • -a:归档模式,保留文件的权限、所有者、时间戳等属性,等同于 -rlptgoD
      • -v:显示传输过程( verbose),可以看到哪些文件正在传输;
      • -z:传输时压缩文件,减少网络带宽占用,提升传输速度。
  3. 服务器 → 客户端(下载/同步目录):

    bash 复制代码
    rsync -avz 用户名@服务器IP:服务器目录路径 本地目标路径
    • 示例:rsync -avz root@192.168.1.100:/root/logs ~/(将服务器logs目录,同步到本地家目录)。

rsync优势与不足

  • 优势:支持增量同步(只传输修改过的文件/内容),支持断点续传,传输大文件、大量文件时效率远超scp;
  • 不足:命令参数比scp多,入门稍复杂,但掌握 -avz 三个核心参数,就能满足90%的日常需求。

scp与rsync对比总结(建议收藏)

特性 scp rsync
核心功能 简单文件传输 增量文件同步+传输
断点续传 不支持 支持
压缩传输 可选(-C参数) 支持(-z参数)
传输效率 适合少量/单个文件 适合大量/大文件
易用性 高(命令简单) 中(核心参数易掌握)

总结:少量文件用scp,快速便捷;大量文件、定期同步用rsync,高效省带宽 ✅

四、常见问题与避坑技巧(必看)

  1. 配置免密登录后,仍然需要输密码?

    • 排查1:服务器 ~/.ssh 目录权限是否为700,authorized_keys 文件权限是否为600(权限过高/过低都会导致密钥认证失效);
    • 排查2:客户端上传的公钥,是否与服务器 authorized_keys 中的内容一致;
    • 排查3:客户端私钥路径是否正确(默认是 ~/.ssh/id_rsa,若修改过路径,需要用 -i 参数指定:ssh -i 私钥路径 用户名@服务器IP)。
  2. rsync传输时,提示"permission denied"?

    • 原因:服务器目标路径的权限不足,客户端用户没有写入权限;
    • 解决:修改服务器目标路径权限(如 chmod 777 /root/temp),或切换到有写入权限的用户。
  3. 密钥丢失/泄露怎么办?

    • 私钥丢失:客户端重新执行 ssh-keygen 生成新的密钥对,重新上传公钥到服务器即可;
    • 私钥泄露:立即删除服务器 authorized_keys 中对应的公钥,重新生成密钥对并上传,避免攻击者利用泄露的私钥登录服务器。

五、总结

本文从SSH密钥认证的核心原理出发,拆解了对称加密与非对称加密的区别,详解了ssh-keygen生成密钥对、ssh-copy-id配置免密登录的完整实操步骤,再对比了scp与rsync两种远程传输工具的用法和场景,覆盖了Linux运维、后端开发中远程连接的高频需求。

掌握SSH密钥认证,既能告别反复输密码的麻烦,提升工作效率,又能大幅提升远程连接的安全性,避免密码被暴力破解的风险;而scp与rsync的灵活运用,能让远程文件传输、同步更高效。

新手建议先跟着实操步骤配置一遍免密登录,再尝试用scp、rsync传输文件,遇到问题可查看"常见问题"部分,基本都能解决。


✨ 我是予枫,关注我,下期带你解锁更多实用技术技巧!

💬 评论区留言:你在配置SSH免密时遇到过哪些坑?或者有更好的技巧,欢迎一起交流~

👍 觉得本文对你有帮助,记得点赞+收藏,避免下次找不到!

相关推荐
小白同学_C13 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖13 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
不做无法实现的梦~15 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
默|笙17 小时前
【Linux】fd_重定向本质
linux·运维·服务器
陈苏同学17 小时前
[已解决] Solving environment: failed with repodata from current_repodata.json (python其实已经被AutoDL装好了!)
linux·python·conda
“αβ”17 小时前
网络层协议 -- ICMP协议
linux·服务器·网络·网络协议·icmp·traceroute·ping
不爱学习的老登18 小时前
Windows客户端与Linux服务器配置ssh无密码登录
linux·服务器·windows
小王C语言19 小时前
进程状态和进程优先级
linux·运维·服务器
xlp666hub19 小时前
【字符设备驱动】:从基础到实战(下)
linux·面试
Sheffi6620 小时前
Swift 所有权宏 `~Copyable` 深度解析:如何在 Swift 中实现类似 Rust 的内存安全模型?
rust·ssh·swift