当前位置: 首页 > article >正文

【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决

前言

在日常开发和运维中,为了提高服务器登录的安全性,我们通常会选择使用 SSH 密钥认证 来替代传统的密码登录。然而,在配置 SSH 公钥登录的过程中,可能会遇到各种坑和 Bug。本文将从零开始,手把手教你如何在 Ubuntu 服务器上配置 SSH 公钥登录,并分享实际操作中遇到的问题及其解决方法。


环境说明

  • 本地设备:Windows 10
  • 远程服务器:Ubuntu
  • 操作目标:通过 SSH 公钥认证登录 Ubuntu 服务器

一、SSH 公钥登录的配置步骤

1. 在本地生成 SSH 密钥对

首先,我们需要在本地生成一对 SSH 密钥(公钥和私钥)。在 Windows 上可以使用终端工具(如 PowerShell、Git Bash 或 WSL)运行以下命令:

ssh-keygen -t rsa -b 2048
  • 系统会提示保存密钥文件的位置,默认路径为 C:\Users\<你的用户名>\.ssh\id_rsa
  • 按照提示操作,回车即可完成。如果需要为密钥设置密码,可以自行输入(可选)。

最终会生成以下两个文件:

  • id_rsa:私钥,保存在本地,用于身份认证。请妥善保管,切勿泄露。
  • id_rsa.pub:公钥,上传到服务器,用于验证身份。

2. 将公钥上传到服务器

在 Windows 上没有 ssh-copy-id 工具,因此我们需要手动上传公钥到服务器。

方法 1:手动复制公钥
  1. 查看本地公钥内容:

    type C:\Users\<你的用户名>\.ssh\id_rsa.pub
    

    复制输出内容。

  2. 登录到服务器:

    ssh username@server_ip
    

    替换 usernameserver_ip 为你的服务器用户名和 IP 地址。

  3. 在服务器上创建 .ssh 文件夹并设置权限:

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
  4. 编辑或创建 authorized_keys 文件,将公钥内容粘贴进去:

    nano ~/.ssh/authorized_keys
    

    粘贴后保存并退出。

  5. 设置文件权限:

    chmod 600 ~/.ssh/authorized_keys
    

3. 测试 SSH 公钥登录

完成上述步骤后,退出服务器并尝试使用 SSH 密钥登录:

ssh -i C:\Users\<你的用户名>\.ssh\id_rsa username@server_ip

如果配置正确,你应该可以直接登录而无需输入密码。


二、遇到的 Bug 和解决过程

问题描述

在本地配置好公钥后,仍然无法通过 SSH 密钥登录服务器,客户端一直提示需要输入密码。查看服务器日志后发现以下错误:

Failed password for hw from 192.168.0.100 port 54545 ssh2

排查与解决过程

  1. 检查 SSH 服务配置
    编辑服务器上的 /etc/ssh/sshd_config 文件,确保以下配置项正确:

    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
    PasswordAuthentication yes    # 用于调试时保留
    

    修改完成后,重启 SSH 服务:

    sudo systemctl restart ssh
    
  2. 检查 authorized_keys 文件权限
    确保 ~/.ssh 文件夹和 authorized_keys 文件的权限正确:

    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    
  3. 检查文件所有者
    问题的根本原因是:authorized_keys 文件的所有者不正确。通过以下命令发现文件归属不是登录的用户:

    ls -l ~/.ssh/authorized_keys
    

    修复所有权问题:

    chown username:username ~/.ssh/authorized_keys
    

    再次尝试登录,问题解决。


三、从其他设备登录服务器

1. 如何避免安全警告

当你从另一台设备首次连接到服务器时,客户端会提示以下信息:

The authenticity of host '192.168.0.22' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

这属于正常现象,因为这是 SSH 的安全机制,用于防止中间人攻击。如果确定服务器可信,可以输入 yes 接受。

客户端会将服务器的主机密钥保存到本地 ~/.ssh/known_hosts 文件中,之后不再提示。


2. 多设备登录是否会互相影响?

SSH 支持多个设备同时连接到同一个服务器账户,不会因为从一台设备登录而「顶掉」另一台设备的会话。你可以通过以下命令查看所有当前活动的 SSH 会话:

who

或者:

w

例如,输出如下:

username pts/0 192.168.0.100 17:40 (bash)
username pts/1 192.168.0.101 17:50 (bash)

这里表示同一个用户通过两台设备分别从 IP 192.168.0.100192.168.0.101 登录。



http://www.kler.cn/a/408292.html

相关文章:

  • 【AI日记】24.11.24 学习谷歌数据分析初级课程-第5课
  • Exploring Prompt Engineering: A Systematic Review with SWOT Analysis
  • wordpress调用文章上一篇 下一篇的标题和链接
  • STL——string类常用接口说明
  • 鸿蒙NEXT开发案例:随机数生成
  • 【Isaac Sim】相关问题汇总
  • 分布式数据库中间件可以用在哪些场景呢
  • 【Y20030006】基于php+mysql的课程学习网站的设计与实现(附源码 配置 文档)
  • w055基于web的服装生产管理的设计与实现
  • 【设计模式】如何用C++实现适配器模式
  • Odoo :免费且开源的农牧行业ERP管理系统
  • 什么是 C++ 中的类型别名和 using 声明?如何使用类型别名和 using 声明?
  • Ultiverse 和web3新玩法?AI和GameFi的结合是怎样
  • RT-DETR融合[ECCV 2018]RCAN中的RCAB模块及相关改进思路
  • 《C++智能合约与区块链底层交互全解析:构建坚实的去中心化应用桥梁》
  • 微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)
  • Leetcode 每日一题 15.三数之和
  • Spring Boot OA:构建企业级办公自动化平台
  • 深入解析 EasyExcel 组件原理与应用
  • 基于RFSOC实现LFMCW雷达测距测速
  • IP-Adapter 开源项目介绍
  • 小程序-基于java+SpringBoot+Vue的流浪动物救助小程序设计与实现
  • 开发工具 - VSCode 快捷键
  • [产品管理-105]:制造业 VS 创造业, 1->N VS 0->1, 一致性 VS 创新性
  • Python内置数据结构:列表篇:【】,list函数创建。列表创建常见遇到问题,索引,列表增删改查,常用函数,while,for进行列表遍历,列表推导式
  • 单片机学习笔记 11. 外部中断