跳到主要内容
🔍
0.2.2已发布beginner · 约 3 课时 · P0

Linux:虚拟机 Ubuntu + SSH

装好 Ubuntu 虚拟机并支持 SSH 免密登录,为 Linux 学习提供主力环境

  • 来源
  • 更新

标记说明:【来源】来自上传资料 · 【补充】课程新编 · 【纠错】按勘误表修正 · 【更新】过时内容已现代化 · 【待确认】无法可靠还原

本章含平台相关内容(platform_scope: distribution-specific

以下【平台示例】仅为演示载体,不构成本课程依赖;不同架构/SoC/板卡/发行版的区别见【平台差异】标注,换平台时请完成文末「迁移训练」。

完成标准(本章)

  • 📖 已阅读:滚动 ≥ 80% 且有效阅读 ≥ 150
  • ✏️ 已练习:小练习正确率 ≥ 60%
  • 📝 已通过测验:分数 ≥ 60
  • 🛠️ 已掌握还需完成实践任务
学习状态:未开始

0.2.2 Linux:虚拟机 Ubuntu + SSH

本章来源:VMware 网络与 SSH 流程来自《Linux IO》PAGE 1-10【来源】;系统版本要求已【更新】(不再锁 Ubuntu 18.04/VS Code 1.83,见勘误 err-7.2-1);练习与任务为新编【补充】。 平台适用性:distribution-specific(以 Ubuntu 当前 LTS 为示例;其他发行版差异见迁移训练)。

① 学习目标

  1. 安装 Ubuntu 当前 LTS 虚拟机并完成 NAT 联网;
  2. 安装并启动 SSH 服务(systemctl enable --now);
  3. 完成 Windows→Ubuntu 的 SSH 免密登录;
  4. 理解桥接与 NAT 两种网络模式的区别;
  5. 输出可复现的环境搭建笔记(实践任务)。

② 前置知识

  • 必修:0.2.1 Windows 环境(本章在宿主机上操作 VMware 与 ssh 客户端)。

③ 核心概念【来源】

概念说明
NAT 模式虚拟机经宿主机共享出口上网;宿主机可访问虚拟机
桥接模式虚拟机直接接入局域网,获得独立 IP
openssh-serverUbuntu 的 SSH 服务端;systemctl enable --now ssh 自启+立即启动
公钥互信客户端持私钥、服务器 authorized_keys 存公钥;登录时挑战-应答验签
当前 LTS使用当前长期支持版 Ubuntu(【更新】:不锁 18.04 等历史版本)

④ 通俗解释【补充】

把虚拟机想成你家里新添的一台"备用电脑":

  • NAT 模式:这台备用电脑借用你家的宽带上网(共享出口),你在家里能直接找它说话(宿主机→虚拟机),但邻居不能直接敲它家门;
  • 桥接模式:它直接接入小区局域网,和所有邻居平级,人人都能访问它;
  • SSH 免密:给它配一把"认脸"的门锁——你持有唯一的私钥(人脸),门锁里存着你的"人脸模板"(公钥)。每次进门,门锁出题(挑战),你用私钥作答,验证通过就开门,全程不用输密码。

⑤ 示例代码

代码示例与验证记录

  • examples/ssh-setup.txtUbuntu SSH 服务与免密登录命令清单✓ 文档核对(非执行)· Ubuntu LTS systemd + OpenSSH, 2026-08-15
    编译:按文件内顺序在 Ubuntu 终端与 Windows 终端分别执行
    适用环境:Linux
    展开文档核对记录
    sshd 状态: active (running)
    ssh 登录: 成功进入 Ubuntu shell(无需输入密码)
    

    差异说明:主机名/IP 按实际环境替换;命令已按当前 LTS 核对

    完整源码见 /code 代码示例页

⑥ 编译与运行方法

本章命令为系统配置命令,按清单顺序执行并核对预期输出;无需编译。第一条 C 程序的编译在 0.2.4。

⑦ 常见错误

症状原因解决
连不上 SSHsshd 未启动/未安装sudo systemctl status ssh 确认 active
免密仍要输密码公钥未放对/权限过宽authorized_keys 权限 600、~/.ssh 目录 700
虚拟机无法上网NAT 网段配置错误核对虚拟网卡网段与虚拟机 IP/网关
【纠错】连接不上就换旧版本系统历史规避手段,现已过时用当前 LTS + 最新稳定工具,见 err-7.2-1

⑧ 小练习

小练习

学习自测:提交后才显示答案与解析(前端判分,不作为正式考试)
  • ex-0-2-2-1.VMware 中,虚拟机通过宿主机共享 IP 访问外网的模式是?(单选)

    ◌ 未作答
  • ex-0-2-2-2.Ubuntu 上安装并立即启动 SSH 服务的命令是?(单选)

    ◌ 未作答
  • ex-0-2-2-3.判断:SSH 免密登录依赖公钥在客户端、私钥在服务器的配对关系。(判断)

    ◌ 未作答

⑨ 章节测验

章节测验

5 题题库 · 随机抽 5 题 · 及格线 60 分 · 前端判分(学习自测)
开始测验 →

⑩ 实战任务

实践任务

完成 Ubuntu 虚拟机 + SSH 免密登录并留档

独立完成 Ubuntu 虚拟机安装、NAT 联网、SSH 服务配置与 Windows→Ubuntu 免密登录, 输出一份可复现的环境搭建笔记。

输入与输出

无程序输入输出。交付物:搭建笔记(步骤+命令+验证输出)与最终"ssh 用户名@IP"免密成功的凭证。

功能要求

  • 安装 Ubuntu 当前 LTS(虚拟机)
  • 配置 NAT 网络并确认能访问外网(ping 通)
  • 安装并启动 openssh-server(systemctl enable --now)
  • 完成 ssh-keygen 与公钥互信,实现免密登录

限制条件

  • 使用当前 LTS 与最新稳定工具,不锁旧版本(见勘误 err-7.2-10)
  • 笔记自己写,命令需实测可复现

验收步骤(自检清单 0/4

验收标准

  • ping 外网成功(验收步骤 1)
  • systemctl status ssh 显示 active(验收步骤 2)
  • 免密 ssh 登录成功(验收步骤 4)

常见失败原因

  • NAT 网段算错导致 IP 不在同一网段
  • 装了 openssh-server 却忘了启动
  • authorized_keys 权限过宽被 sshd 拒绝(应为 600)

可选扩展

  • 配置 ~/.ssh/config 给虚拟机起别名(4.3.1 预告)
  • 在 Ubuntu 里执行 ex1 命令清单验证 gcc(下一章 0.2.4 用)

完成必要清单后才能计入"已完成实践"(学习状态自动推导,不提供一键完成)

⑪ 面试问题

面试问题

  • 说一下 SSH 免密登录的原理。高频Linux 系统编程 · medium

    要点:客户端持私钥,服务器 authorized_keys 存公钥;连接时服务器用公钥挑战,客户端用私钥签名应答。

    ssh-keygen 生成公私钥对:私钥留客户端(保密),公钥放进服务器的 ~/.ssh/authorized_keys。 登录时服务器生成随机挑战,客户端用私钥签名,服务器用公钥验签——全程不传输私钥。 排查要点:authorized_keys 权限 600、目录权限 700,否则 sshd 会拒绝。

    追问:
    • 追问:为什么 authorized_keys 权限太宽会失效?
    评分要点:
    • 公私钥分工
    • 挑战-应答机制
    • 权限细节加分
  • systemctl enable 和 start 有什么区别?Linux 系统编程 · easy

    要点:enable 设置开机自启,start 立即启动;enable --now 两者一次完成。

    systemctl start 只对本次运行生效(重启后失效);systemctl enable 写入开机自启链接 (重启后自动启动),但不影响当前状态;enable --now = enable + start。 对应排查场景:服务"重启后没了"→ 忘了 enable。

    追问:
    • 追问:怎么查看服务是否开机自启?(systemctl is-enabled)
    评分要点:
    • 立即启动 vs 开机自启
    • enable --now 用法
  • 虚拟机的桥接和 NAT 模式有什么区别?Linux 系统编程 · easy

    要点:桥接=虚拟机直接接入局域网(独立 IP);NAT=经宿主机共享出口,宿主机可访问虚拟机。

    桥接(bridged):虚拟机像一台独立电脑接入路由器,获得局域网 IP,局域网内其他设备可直接访问; NAT:虚拟机经宿主机做网络地址转换上网,宿主机能访问虚拟机,但局域网其他设备默认不能。 选型:需要外部设备直接访问虚拟机(如板卡 tftp 烧录)选桥接;日常学习与 SSH 用 NAT 即可。

    追问:
    • 追问:NAT 模式下怎么让局域网访问虚拟机?(端口转发)
    评分要点:
    • 两种模式网络位置
    • 应用场景

⑫ 延伸阅读

  • Ubuntu 官方文档:OpenSSH Server 配置(Ubuntu Server Guide - OpenSSH);
  • man 手册:man sshd_config(服务端配置项);
  • VMware 官方文档:NAT 网络配置;
  • 下一章预告:0.2.3 VS Code 远程开发——在 Windows 上写 Linux 代码。

迁移训练(migration training)

把本章流程迁移到 其他发行版(Debian/CentOS 系)WSL2: 不变的:SSH 原理、公钥互信、systemd 服务管理(Debian/Ubuntu 系); 要改的:包管理器(apt ↔ dnf/yum)、个别包名;WSL2 无需虚拟机与网络配置,直接安装 sshd 即可复用本章命令。

内容来源映射

内容部分资料位置标记说明
VMware 网络模式、NAT 配置、SSH 免密流程Linux IO(1)PAGE 1-10来源正文重新组织表述;命令已按当前环境核对
系统版本要求Linux IO(1)PAGE 7-8更新原文要求"Ubuntu 18.04 + VS Code 1.83"并锁版本;已更新为 Ubuntu 当前 LTS + 最新 VS Code,不再锁旧版本
练习/测验/任务/面试题补充全部新编

本章勘误与更新记录(【纠错】/【更新】)

  • err-7.2-1 · 过时更新 · 出处 PAGE 7-8

    原文:连接不上就换成 Ubuntu 18.04 + VS Code 1.83,并关闭自动更新

    正确:使用 Ubuntu 当前 LTS 与最新稳定版 VS Code 即可正常远程开发;无需锁旧版本、无需关闭自动更新。若确实遇到兼容问题,先检查 Remote-SSH 插件版本与 sshd 状态,再按官方文档升级。

    原因:锁旧版本属于 2020 年代初的临时规避手段,当前版本已无此问题;第一步报告 7.2 第 1 条过时项。