树莓派 SSH 连接排错实录:从 IP 网段到主机密钥变更,再到 VNC 自启动

一、问题背景

最近在调试树莓派时,遇到了一个典型的 SSH 连接失败问题:

  • 树莓派 IP:172.27.xxx.xxx(企业级内网段)

  • 主机 IP:172.27.xxx.xxx(与树莓派同网段)

  • SSH 配置信息如下:

bash 复制代码
Host raspberrypi
    HostName 172.27.xxx.xxx
    User pi
    Port 22

但在执行 ssh pi@172.27.xxx.xxx 时,始终无法连接。

本文记录了完整的排查思路与解决方案,并附带了 VNC 开机自启动的配置方法,供有类似需求的读者参考。

目录

一、问题背景

二、初步排查:网络连通性

[1. 检查 IP 地址段是否一致](#1. 检查 IP 地址段是否一致)

[2. 测试 ICMP 连通性](#2. 测试 ICMP 连通性)

[三、深入诊断 SSH 服务状态](#三、深入诊断 SSH 服务状态)

[1. 尝试直接 SSH 连接](#1. 尝试直接 SSH 连接)

[2. 清理旧的主机密钥](#2. 清理旧的主机密钥)

[3. 重新连接并接受新密钥](#3. 重新连接并接受新密钥)

[四、若 SSH 服务本身未启动怎么办?](#四、若 SSH 服务本身未启动怎么办?)

[1. 启用 SSH 服务(适用于全新系统)](#1. 启用 SSH 服务(适用于全新系统))

[2. 启动并设置开机自启](#2. 启动并设置开机自启)

[3. 检查 SSH 端口监听状态](#3. 检查 SSH 端口监听状态)

[五、补充:VNC 开机自启动配置](#五、补充:VNC 开机自启动配置)

[1. 使用 raspi-config(最简单)](#1. 使用 raspi-config(最简单))

[2. 使用 systemctl 管理(推荐)](#2. 使用 systemctl 管理(推荐))

[3. 手动创建 systemd 服务(自定义分辨率)](#3. 手动创建 systemd 服务(自定义分辨率))

[4. 常用 VNC 管理命令](#4. 常用 VNC 管理命令)

六、总结与经验


论文投稿:
第二届航空航天工程与材料技术国际会议(AEMT 2026)

大会官网:https://ais.cn/u/aQ7ruy

大会时间:2026年4月10-12日

大会地点:中国-西安


二、初步排查:网络连通性

1. 检查 IP 地址段是否一致

执行 ipconfig(Windows)或 ifconfig(Linux/Mac)查看本机 IP:

  • 本机 IP:172.27.xxx.100

  • 树莓派 IP:172.27.xxx.129

结论 :两台设备位于同一 /24 网段,网络基础连通性正常。

2. 测试 ICMP 连通性

bash 复制代码
ping 172.27.xxx.129

返回正常响应,说明网络物理链路无问题,故障锁定在 SSH 服务层


三、深入诊断 SSH 服务状态

1. 尝试直接 SSH 连接

bash 复制代码
ssh pi@172.27.xxx.129

此时出现经典警告:

bash 复制代码
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
...
Offending ED25519 key in C:\\Users\\xxx/.ssh/known_hosts:26
Host key verification failed.

含义

SSH 客户端检测到目标主机的公钥与本地 known_hosts 中记录的不一致,可能原因包括:

  • 树莓派系统重装(SSH 密钥重新生成)

  • 同一 IP 被其他设备占用

  • 手动重置了 SSH 服务密钥

2. 清理旧的主机密钥

执行以下命令删除对应 IP 的旧密钥记录:

bash 复制代码
ssh-keygen -R 172.27.xxx.129

或手动编辑 C:\Users\用户名\.ssh\known_hosts,删除包含该 IP 的行。

3. 重新连接并接受新密钥

再次执行 SSH 连接:

bash 复制代码
ssh pi@172.27.xxx.129

系统会提示是否接受新的主机密钥,输入 yes 即可。


四、若 SSH 服务本身未启动怎么办?

如果 ping 通但 SSH 无响应(或端口未监听),需在树莓派本地(接显示器/键盘)执行以下操作:

1. 启用 SSH 服务(适用于全新系统)

  • 方法一:SD 卡法

    将 SD 卡插入电脑,在 boot 分区新建空文件 ssh(无扩展名),重新上电即可自动启用 SSH。

  • 方法二:raspi-config

    bash 复制代码
    sudo raspi-config
    # 选择 Interface Options → SSH → Yes

2. 启动并设置开机自启

bash 复制代码
sudo systemctl enable ssh
sudo systemctl start ssh

3. 检查 SSH 端口监听状态

bash 复制代码
sudo netstat -tlnp | grep :22

五、补充:VNC 开机自启动配置

为了远程桌面管理,VNC 也是常用工具。以下是几种设置开机自启的方式。

1. 使用 raspi-config(最简单)

bash 复制代码
sudo raspi-config
# Interface Options → VNC → Yes

2. 使用 systemctl 管理(推荐)

安装 RealVNC:

bash 复制代码
sudo apt update
sudo apt install realvnc-vnc-server realvnc-vnc-viewer

启用服务:

bash 复制代码
sudo systemctl enable vncserver-x11-serviced
sudo systemctl start vncserver-x11-serviced

3. 手动创建 systemd 服务(自定义分辨率)

创建启动脚本 /usr/local/bin/startvnc.sh

bash 复制代码
#!/bin/bash
vncserver :1 -geometry 1920x1080 -depth 24

赋予执行权限:

bash 复制代码
sudo chmod +x /usr/local/bin/startvnc.sh

创建服务文件 /etc/systemd/system/vnc.service

bash 复制代码
[Unit]
Description=VNC Server
After=graphical.target

[Service]
Type=simple
ExecStart=/usr/local/bin/startvnc.sh
User=pi
Restart=on-failure

[Install]
WantedBy=multi-user.target

启用并启动:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable vnc.service
sudo systemctl start vnc.service

4. 常用 VNC 管理命令

  • 查看会话:vncserver -list

  • 停止会话:vncserver -kill :1

  • 修改密码:vncpasswd


六、总结与经验

现象 可能原因 解决方法
无法 ping 通 网络不通、IP 改变 检查网络配置,扫描网段
ping 通但 SSH 连接失败 SSH 服务未启动、防火墙拦截 启用 SSH,检查防火墙规则
主机密钥警告 系统重装或 IP 冲突 ssh-keygen -R 清理旧密钥
同一网络但不同 IP 段 虚拟机/容器网络隔离 确保处于同一广播域

本次排错的核心在于:

  • 分层排查:从网络层 → 传输层 → 应用层逐步缩小范围

  • 关注安全警告:主机密钥变更不是错误,而是保护机制

  • 善用工具pingssh -vnetstatsystemctl 是基本排错法宝

希望这篇文章能帮助遇到类似问题的同学快速定位并解决 SSH 连接故障,也欢迎在评论区交流更多树莓派实践心得。

相关推荐
阿kun要赚马内2 小时前
Python中函数的进阶用法
开发语言·python
Spliceㅤ2 小时前
项目:基于qwen的点餐系统
开发语言·人工智能·python·机器学习·自然语言处理
ZHOUPUYU2 小时前
PHP与WebSocket实时通信的原理到生产级应用
开发语言·html·php
宝耶2 小时前
Java面试2:final、finally、finalize 的区别?
java·开发语言·面试
码云数智-大飞2 小时前
生死时速:高并发秒杀系统的架构设计与防超卖实战
开发语言
DREW_Smile2 小时前
数据在内存中的存储
c语言·开发语言
吴声子夜歌2 小时前
JavaScript——对象
开发语言·javascript·ecmascript
比昨天多敲两行3 小时前
C++ 继承
开发语言·c++·面试
不会写DN3 小时前
Js常用的字符串处理
开发语言·前端·javascript
dreamxian3 小时前
苍穹外卖day10
java·开发语言·spring boot