Jupyter Notebook远程访问安全配置:密码保护与SSL加密实战指南
1. 项目概述为什么你的Jupyter Notebook需要一把“锁”如果你在Linux服务器上跑过Jupyter Notebook大概率经历过这样的场景为了图省事直接用jupyter notebook命令启动然后通过http://服务器IP:8888在本地浏览器访问。看起来一切顺利但你可能没意识到你的整个工作环境——包括所有代码、数据、甚至运行中的内核——都像一间没上锁的房间暴露在公网或内网中。任何一个知道服务器IP和端口的人都能直接走进来查看、修改甚至删除你的工作成果。这绝不是危言耸听我见过太多因为默认配置导致数据泄露、模型被篡改甚至服务器被植入挖矿脚本的案例。今天要聊的就是如何给你的Jupyter Notebook装上最关键的“门锁”和“监控”密码保护与安全的远程访问配置。这不仅仅是加个密码那么简单。它涉及到从配置文件生成、密码哈希计算、SSL加密通信到防火墙策略的一整套组合拳。对于数据科学家、机器学习工程师或者任何在Linux服务器上进行交互式编程的朋友来说这是一项必须掌握的基础安全技能。无论你是用个人云服务器做实验还是在公司内网部署数据分析服务一个配置得当的Jupyter Notebook环境能让你在享受其交互式便利的同时高枕无忧。接下来我会基于多年的运维和开发经验带你一步步拆解每个环节不仅告诉你怎么做更会解释为什么这么做以及踩过哪些坑。2. 安全配置的核心思路与架构设计在动手修改任何配置之前我们必须先理清Jupyter Notebook的安全体系是如何构建的。很多人一上来就找教程改配置文件但如果不理解背后的逻辑很容易配置出错或者留下安全死角。2.1 Jupyter Notebook的安全模型解析Jupyter Notebook本身是一个基于Web的交互式计算环境其安全核心围绕两个层面身份认证和通信加密。身份认证决定了“谁可以进来”。默认情况下Jupyter使用基于Token的认证。每次启动服务终端都会打印一串长长的Token如http://localhost:8888/?tokenabc123...。用户首次访问时需输入此Token之后浏览器Cookie会保存会话。这种方式的问题在于Token可能通过日志泄露且没有用户管理的概念。因此我们的目标是将认证方式升级为密码认证并生成一个强密码的哈希值存入配置避免明文存储。通信加密决定了“路上说的话是否会被偷听”。当你通过HTTP而非HTTPS远程访问时所有数据包括你输入的密码、执行的代码、加载的数据都是以明文形式在网络中传输。这意味着同一网络下的任何设备都可能通过抓包工具窃取信息。因此我们必须为Jupyter配置SSL/TLS证书强制使用HTTPS协议对传输通道进行加密。此外还有一个常被忽略的层面服务暴露范围。默认配置下Jupyter Notebook服务会绑定到localhost127.0.0.1这意味着它只接受来自本机的连接。当我们为了远程访问而将其绑定到0.0.0.0所有网络接口时就等于向整个网络敞开了大门。此时前面两项安全措施密码和SSL就成为了必须的“门锁”。2.2 配置文件一切安全的起点Jupyter的所有行为都由其配置文件控制主要是jupyter_notebook_config.py。这个文件通常不存在于初始安装中需要我们手动生成和定制。理解其中几个关键参数是安全配置的基石c.NotebookApp.ip 服务绑定的IP地址。localhost仅限本机0.0.0.0则监听所有网络接口。安全原则在配置好密码和SSL之前绝对不要将其设置为0.0.0.0。c.NotebookApp.port 服务监听的端口默认8888。可以考虑更改为不常见的端口避免被端口扫描工具轻易发现。c.NotebookApp.password 这里存放的不是你的明文密码而是密码的SHA256哈希值。Jupyter在认证时会将你输入的密码用同样的算法计算哈希再与这里存储的值比对。这意味着即使有人拿到了你的配置文件也无法反向破解出原始密码。c.NotebookApp.certfile与c.NotebookApp.keyfile 分别指向你的SSL证书文件.crt或.pem和私钥文件.key的路径。这是启用HTTPS的关键。c.NotebookApp.open_browser 启动时是否自动打开浏览器。在无图形界面的服务器上务必设置为False。c.NotebookApp.allow_root 是否允许以root用户运行。强烈不建议以root身份运行Jupyter这会导致严重的安全风险。应以普通用户运行。我们的配置策略将遵循“最小权限原则”和“纵深防御原则”先在本机环境生成密码哈希和测试SSL确认认证和加密工作正常后再谨慎地开放远程访问并辅以系统防火墙规则。3. 逐步实操从零构建安全环境理论清晰后我们进入实战环节。假设你已经在Linux服务器如Ubuntu 20.04/22.04或CentOS 7/8上安装好了Jupyter Notebook。我们将以一个名为data_user的普通用户身份进行操作。3.1 步骤一生成Jupyter配置文件首先我们需要生成默认的配置文件模板。Jupyter提供了一个便捷的命令jupyter notebook --generate-config执行后它会在用户家目录下的.jupyter文件夹中创建配置文件~/.jupyter/jupyter_notebook_config.py。注意如果你之前已经生成过此文件上述命令会提示你是否覆盖。如果已有重要配置请先备份。对于首次配置直接生成即可。3.2 步骤二创建并配置访问密码这是最关键的一步。我们将使用Jupyter内置的工具来生成密码哈希。启动Python交互环境在终端输入python或python3取决于你的系统默认版本。导入工具并生成哈希在Python解释器中依次执行以下命令from notebook.auth import passwd password_hash passwd()执行passwd()函数后它会提示你输入并确认密码。请务必设置一个强密码包含大小写字母、数字和特殊字符长度大于12位。复制生成的哈希值输入密码后终端会输出一个长字符串格式类似于argon2:$argon2id$v19$m10240,t10,p8$...。完整地复制这个字符串包括两端的单引号。这就是你的密码哈希。编辑配置文件用文本编辑器如vim、nano打开之前生成的配置文件。nano ~/.jupyter/jupyter_notebook_config.py配置密码哈希在配置文件中找到c.NotebookApp.password这一行大概在110行左右。默认它是被注释掉的以#开头。取消注释并将值设置为你刚才复制的哈希字符串。# 将原本的注释行 # c.NotebookApp.password # 修改为 c.NotebookApp.password argon2:$argon2id$v19$m10240,t10,p8$...你的完整哈希字符串实操心得千万不要在多个地方使用同一个密码。为Jupyter Notebook单独生成一个高强度密码并使用密码管理器保存。生成的哈希值一旦存入配置就不要再在其他地方使用明文密码了。3.3 步骤三生成并使用SSL证书实现HTTPS没有SSL的远程访问等于“裸奔”。我们有三种获取证书的方式自签名证书适合测试/内网、Let‘s Encrypt免费证书适合公网服务、或购买商业证书。对于个人或内部项目自签名证书是最快捷的选择尽管浏览器会提示“不安全”但通信本身是加密的。使用OpenSSL生成自签名证书mkdir -p ~/.jupyter/ssl cd ~/.jupyter/ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem执行命令时会交互式地询问一些信息国家、省份等这些可以按回车键跳过或随意填写。但“Common Name”这一项非常重要应该填写你访问服务器时使用的域名或IP地址。如果使用IP访问就填服务器的公网IP或内网IP。生成后你会在~/.jupyter/ssl/目录下得到两个文件mycert.pem证书和mykey.key私钥。配置Jupyter使用SSL证书 再次编辑jupyter_notebook_config.py文件找到并修改以下两行# 取消注释并修改为你的证书路径 c.NotebookApp.certfile /home/data_user/.jupyter/ssl/mycert.pem c.NotebookApp.keyfile /home/data_user/.jupyter/ssl/mykey.key注意事项私钥文件mykey.key的权限必须严格设置确保只有所有者可读。可以使用命令chmod 600 ~/.jupyter/ssl/mykey.key进行修改防止私钥泄露。3.4 步骤四配置远程访问与基础优化现在我们可以安全地开放远程访问了。绑定IP地址在配置文件中找到c.NotebookApp.ip将其值改为0.0.0.0以监听所有网络接口。c.NotebookApp.ip 0.0.0.0修改默认端口可选但推荐找到c.NotebookApp.port可以将其从默认的8888改为其他未被占用的端口例如9999。这能避免一些针对默认端口的自动化扫描。c.NotebookApp.port 9999禁止自动打开浏览器在无界面的服务器上这个选项必须关闭。c.NotebookApp.open_browser False设置工作目录你可以指定Jupyter启动后的根目录默认是启动命令所在的当前目录。建议设置为你的项目目录。c.NotebookApp.notebook_dir /home/data_user/projects3.5 步骤五配置系统防火墙以UFW为例仅仅配置Jupyter还不够我们还需要在系统层面控制访问。如果你的服务器启用了防火墙如Ubuntu的UFW需要放行我们设定的Jupyter端口。# 允许特定端口例如我们设置的9999 sudo ufw allow 9999/tcp # 启用UFW如果尚未启用 sudo ufw enable # 检查规则 sudo ufw status verbose对于更严格的安全要求可以结合ufw的allow from规则只允许特定IP段访问该端口这在内网环境中非常有效。3.6 步骤六启动与验证服务所有配置完成后保存并退出配置文件。现在你可以启动Jupyter Notebook服务了。# 最简单的方式在前台启动 jupyter notebook # 更好的方式使用nohup或tmux在后台运行避免终端关闭后服务停止 nohup jupyter notebook ~/jupyter.log 21 启动后在另一台机器的浏览器中访问https://你的服务器IP地址:9999。注意这里必须是https://开头而不是http://。浏览器会因为自签名证书而显示“不安全”警告在Chrome中可能是“您的连接不是私密连接”。这是正常现象点击“高级”-“继续前往不安全”即可。随后页面会跳转到密码输入框输入你之前设置的密码即可成功登录。4. 进阶配置与生产环境考量基础的密码SSL配置已经能抵御大部分风险但对于生产环境或团队协作我们还需要考虑更多。4.1 使用Let‘s Encrypt免费SSL证书自签名证书的警告会影响体验。对于拥有域名的公网服务器强烈建议使用Let‘s Encrypt的免费证书。你可以使用Certbot工具自动化获取和续签。# 以Ubuntu为例安装Certbot sudo apt update sudo apt install certbot # 获取证书假设你的域名是 notebook.yourdomain.com sudo certbot certonly --standalone -d notebook.yourdomain.com获取成功后证书和私钥通常存放在/etc/letsencrypt/live/notebook.yourdomain.com/目录下。然后将Jupyter配置中的certfile和keyfile指向对应的fullchain.pem和privkey.pem即可。别忘了设置自动续期。4.2 配置JupyterHub进行多用户管理单个Jupyter Notebook实例只适合个人使用。如果需要为团队提供Jupyter服务JupyterHub是官方推荐的解决方案。它可以管理多个用户每个用户拥有独立的、受保护的工作空间。JupyterHub的配置更为复杂涉及用户认证如PAM、OAuth、资源隔离DockerSpawner、KubeSpawner等是构建企业级数据科学平台的基础。4.3 结合反向代理Nginx/Apache直接暴露Jupyter服务到公网并非最佳实践。更优雅的方式是使用Nginx或Apache作为反向代理。这样做的好处很多统一端口可以让Jupyter和其他Web服务共享443HTTPS端口。负载均衡未来扩展多实例时更方便。静态文件服务由更高效的反向代理处理静态资源。附加安全层可以在Nginx层面添加额外的访问控制、限流、WAFWeb应用防火墙规则。一个简单的Nginx配置示例如下server { listen 443 ssl; server_name notebook.yourdomain.com; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location / { proxy_pass http://127.0.0.1:9999; # 指向本地Jupyter服务 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 以下两行对WebSocket连接至关重要 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } }配置后用户只需访问https://notebook.yourdomain.com无需记忆端口号且由Nginx处理SSL卸载Jupyter本身的配置可以简化甚至可以不用配置SSL。5. 常见问题排查与实战技巧即使按照步骤操作你也可能会遇到一些问题。这里汇总了一些高频问题和解决方法。5.1 连接与访问问题排查表问题现象可能原因排查步骤与解决方案浏览器无法连接提示“无法访问此网站”或“连接被拒绝”1. Jupyter服务未启动。2. 防火墙阻止了端口。3. IP绑定错误。1. 在服务器上执行 ps aux访问HTTPS链接浏览器提示“不安全”或证书错误使用了自签名证书。这是预期行为。点击“高级”-“继续前往”即可。若想消除警告需部署受信任的证书如Let‘s Encrypt。能打开登录页但输入密码后无法登录或反复跳回登录页1. 密码哈希配置错误。2. 浏览器Cookie或缓存问题。3. 配置文件未生效。1.最常见原因哈希字符串复制不完整或两端的单引号丢失。重新执行passwd()仔细复制整个字符串包括引号并粘贴到配置文件中。2. 尝试使用浏览器的无痕模式访问。3. 确认修改的是正确的配置文件~/.jupyter/jupyter_notebook_config.py并重启了Jupyter服务。登录后页面空白或无法创建新Notebook1. SSL证书配置错误尤其是密钥不匹配。2. 工作目录权限问题。3. WebSocket代理配置错误如果用了反向代理。1. 检查证书和密钥文件路径是否正确以及私钥文件权限是否为600。2. 检查c.NotebookApp.notebook_dir指向的目录是否存在且当前运行Jupyter的用户对其有读写权限。3. 如果使用了Nginx确保配置中包含了对WebSocket的代理设置见4.3节。服务启动失败报错“Address already in use”默认端口8888已被其他进程占用。1. 使用 netstat -tlnp5.2 性能与稳定性优化技巧后台运行与日志管理不要在前台直接运行jupyter notebook。使用nohup、systemd服务或tmux会话将其放在后台。同时将输出重定向到日志文件便于排查问题。# 使用nohup示例 nohup jupyter notebook --config ~/.jupyter/jupyter_notebook_config.py /var/log/jupyter.log 21 资源限制对于多人使用的服务器需要注意Jupyter可能消耗大量内存和CPU。可以通过Linux的cgroups或容器化技术Docker对单个Notebook进程的资源使用进行限制。定期更新定期更新Jupyter及其相关库如notebook、jupyterhub以获取安全补丁和新功能。使用pip install --upgrade notebook进行更新。备份配置文件将你精心配置好的jupyter_notebook_config.py文件进行备份。在搭建新环境时可以直接复用极大提升效率。5.3 一个关键的“踩坑”提醒关于Token认证的残留即使你配置了密码在首次启动Jupyter时终端可能仍然会打印出一行带有Token的URL。不要将此URL分享给任何人这个Token在密码认证启用后依然有效可以作为备用登录方式。如果你希望完全禁用Token认证只使用密码可以在配置文件中添加c.NotebookApp.token 但这样做之后万一你忘记了密码将无法通过任何方式登录。因此请务必保管好你的密码。配置安全的Jupyter Notebook远程访问就像为你的数字工作室安装防盗门和监控系统。过程并不复杂但每一步都关乎安全底线。从生成密码哈希、配置SSL到设置防火墙和考虑反向代理这套组合拳打下来你的数据科学工作环境才能真正做到既便捷又可靠。在实际操作中最常出问题的就是密码哈希的复制粘贴环节以及SSL证书的路径配置多一分仔细就少一次深夜排查。

相关新闻

LeetCode 105:从前序与中序遍历构造二叉树,Java 递归解法详解

LeetCode 105:从前序与中序遍历构造二叉树,Java 递归解法详解

一、题目描述给定一棵二叉树的前序遍历 preorder 和中序遍历 inorder,请还原这棵二叉树。题目保证数组中没有重复元素。preorder [3, 9, 20, 15, 7] inorder [9, 3, 15, 20, 7]构造结果如下:3/ \9 20/ \15 7关键是从两种遍历序列中确定根节点&am…

2026/10/19 0:33:48 阅读更多 →
罗克韦尔 AB(伟肯)AB33I 风机驱动板卡

罗克韦尔 AB(伟肯)AB33I 风机驱动板卡

一、板卡基础概述1.1 型号溯源与适配机型AB33I 行业俗称,原厂本体为 VACON 伟肯399I(物料号 PC00299H)风机驱动电源板,罗克韦尔收购伟肯之后,大批量搭载在 AB 大功率变频器内部,现场运维习惯性简称为 AB33I…

2026/10/17 5:47:18 阅读更多 →
如何快速提升日本麻将水平?mahjong-helper智能助手为你提供专业指导

如何快速提升日本麻将水平?mahjong-helper智能助手为你提供专业指导

如何快速提升日本麻将水平?mahjong-helper智能助手为你提供专业指导 【免费下载链接】mahjong-helper 日本麻将助手:牌效防守记牌(支持雀魂、天凤) 项目地址: https://gitcode.com/gh_mirrors/ma/mahjong-helper 你是否在雀…

2026/10/16 16:39:06 阅读更多 →

最新新闻

文献翻译网站接入TaoToken:高效精准的学术文献翻译工具,助力跨语言文献阅读与研究

文献翻译网站接入TaoToken:高效精准的学术文献翻译工具,助力跨语言文献阅读与研究

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:34:04 阅读更多 →
Skills技能资产化:从个人经验到可复用技能文件的工程实践

Skills技能资产化:从个人经验到可复用技能文件的工程实践

最近一段时间,"skills"这个词在我关注的开发者社区里出现频率高得有点反常。一开始我以为又是某个新框架的命名,点进去才发现,它背后代表的是一种把"能力"当作工程资产来管理、来迭代的思路。过去我们聊技能,…

2026/10/19 0:34:04 阅读更多 →
第一个 MCP 服务器:从 SDK 到可用的 tools/resources/prompts,TaoToken 统一 Key 通道实践

第一个 MCP 服务器:从 SDK 到可用的 tools/resources/prompts,TaoToken 统一 Key 通道实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:33:04 阅读更多 →
OpenRouter 2026 重磅更新:Agentic Web Tools 统一大模型联网搜索与页面抓取,TaoToken 统一 Key 通道实测

OpenRouter 2026 重磅更新:Agentic Web Tools 统一大模型联网搜索与页面抓取,TaoToken 统一 Key 通道实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:33:04 阅读更多 →
C# 集成 OnnxRuntime 部署 PP-Vehicle 车辆分析全流程

C# 集成 OnnxRuntime 部署 PP-Vehicle 车辆分析全流程

简介:本资源为基于 C# 与 Onnx 的 PP-Vehicle 车辆分析完整源码,面向具备一定 C# 与深度学习部署基础、希望快速落地车辆视觉分析功能的开发者。项目整合车辆检测、车型识别、车辆颜色判别与车牌检测等多项能力,可用于智能交通、停车场管理、…

2026/10/19 0:32:03 阅读更多 →
open-code-review:可审计、可干预的开源代码审查框架

open-code-review:可审计、可干预的开源代码审查框架

1. 这不是又一个“AI代码审查工具”,而是开发者自己掌控审查权的起点“open-code-review”这个项目名乍看平平无奇,甚至有点像某个被遗忘在GitHub角落的冷门仓库——没有炫酷的UI,不提“秒级修复”,也不承诺“零Bug交付”。但如果…

2026/10/19 0:31:03 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →