SSH远程执行command not found的根因与解决方案
1. 问题本质不是脚本写错了是Shell启动方式搞错了“SSH远程执行脚本报错command not found”——这句话在运维、开发、自动化部署场景里出现频率极高几乎每个接触过Linux远程操作的人都在深夜被它惊醒过。我第一次遇到是在给某高校实验室部署一批树莓派集群时本地测试好好的Python数据清洗脚本一用ssh userhost bash /path/to/script.sh就报/bin/bash: line 1: python3: command not found而手动登录后which python3明明返回/usr/bin/python3。当时以为是PATH没配疯狂往.bashrc里加export PATH...结果重启SSH服务、重登十几次问题照旧。后来翻了二十多页Stack Overflow和OpenSSH手册才明白根本不是环境变量没加载而是你压根没让Shell去加载它。这个问题的核心关键词就是“SSH远程执行”和“环境变量”但绝大多数人只盯着“环境变量”三个字猛攻却忽略了前面那个关键定语——“远程执行”。本地终端里敲bash script.shShell是以交互式登录Shelllogin shell启动的它会按顺序读取/etc/profile→~/.bash_profile→~/.bash_login→~/.profile这些文件里通常都设置了PATH、LANG等基础环境而SSH远程执行命令如ssh host cmd默认启动的是非交互式非登录Shellnon-interactive non-login shell它只认/etc/bash.bashrc和~/.bashrc而且仅当$BASH_ENV环境变量被显式设置时才会加载——而OpenSSH默认根本不设这个变量。这就导致一个残酷现实你精心配置在.bashrc里的export PATH/opt/mytools/bin:$PATH在SSH远程执行时根本不会生效更糟的是系统级的/etc/environment或/etc/profile.d/*.sh也统统被跳过。所以“command not found”从来不是命令真的不存在而是Shell根本没去PATH里找它——因为PATH本身就被截断成了最精简的系统默认值通常是/usr/local/bin:/usr/bin:/bin你自定义的工具路径、conda环境、nvm管理的Node版本、甚至某些发行版里默认不进PATH的/snap/bin全都不见了。这不是配置错误是Shell启动模式的认知偏差。解决它不靠死磕PATH而要从启动机制入手要么强制让它走登录Shell流程要么手动注入环境要么改用更可控的执行方式。下面我会把这三条路全部拆开告诉你每条路怎么走、为什么这么走、以及踩过哪些坑。2. 核心思路拆解三种主流方案的底层逻辑与适用边界面对SSH远程执行的环境变量缺失业界有三类主流解法强制登录Shell模式、预加载环境变量、改用Shell包装器。它们不是并列选项而是有明确的优先级和适用场景。我带过的十几个自动化项目里90%的问题用第一种就能闭环剩下10%才需要后两种兜底。下面逐个说透原理避免你花三天时间试遍所有方案最后发现其实第一种就足够。2.1 方案一用-l参数强制登录Shell推荐指数★★★★★这是最直接、最符合直觉的解法既然登录Shell会自动加载所有profile文件那我就告诉bash“请以登录模式启动”。命令变成ssh userhost bash -l -c /path/to/script.sh这里的-l或--login参数是bash内置开关作用是让当前Shell模拟登录过程——它会主动去读/etc/profile和用户家目录下的~/.bash_profile等文件。注意必须配合-c使用因为bash -l单独执行会卡在交互模式而-c指定要执行的命令字符串。实测在Ubuntu 22.04、CentOS 7、Debian 11上全部生效连ARM64架构的树莓派OS都没问题。提示很多教程写成ssh userhost bash -l /path/to/script.sh这是错的。bash -l script.sh会把script.sh当作启动脚本执行此时它走的是“执行脚本”路径而非“加载环境后执行命令”路径环境变量依然不会加载。必须用-c包裹命令字符串。为什么这个方案最推荐因为它零侵入、零配置、零副作用。你不需要改服务器上的任何配置文件不依赖用户家目录是否存在.bash_profile也不用担心~/.bashrc里有没有[ -z $PS1 ] return这种提前退出逻辑很多.bashrc开头就有这行防止非交互式Shell加载。它纯粹靠Shell自身机制稳定得像物理定律。2.2 方案二手动导出关键环境变量推荐指数★★★★☆当登录Shell方案失效时比如目标服务器禁用了~/.bash_profile或你没有权限修改用户shell就得手动补环境。核心思路是在SSH命令里把本地已知的有效环境变量原样传递过去。例如你知道python3在/usr/local/bin/python3那就直接写死路径ssh userhost /usr/local/bin/python3 /path/to/script.py但这治标不治本。更通用的做法是在执行前先source一次环境配置文件ssh userhost source ~/.bashrc; /path/to/script.sh或者如果.bashrc里有保护逻辑就绕过它直接设置PATHssh userhost export PATH/usr/local/bin:/opt/myapp/bin:$PATH; /path/to/script.sh注意source ~/.bashrc在非交互式Shell里可能失败因为.bashrc常包含[ -z $PS1 ] return。此时可临时注释掉这行或改用set -o allexport; source ~/.bashrc; set o allexport强制导出所有变量。这个方案的优势是灵活能精准控制每个变量。但缺点也很明显环境变量是静态快照无法动态响应PATH中命令的真实位置。比如你写了export PATH/opt/node-v18/bin:$PATH但服务器上实际装的是v20脚本还是报错。所以它适合环境高度可控的封闭系统如Docker容器、CI/CD runner不适合多版本共存的生产服务器。2.3 方案三用Shell包装器统一入口推荐指数★★★☆☆这是企业级项目的常用解法尤其当你需要批量管理上百台服务器时。思路是不在每次SSH命令里拼环境而是在服务器上预置一个标准化的执行入口脚本。比如在/usr/local/bin/run-with-env里写#!/bin/bash # 此脚本确保每次执行都加载完整环境 source /etc/profile source ~/.bash_profile 2/dev/null exec $然后SSH调用就变成ssh userhost run-with-env /path/to/script.sh这个方案把环境加载逻辑从客户端移到服务端彻底解耦。你还可以在里面加入日志记录、超时控制、权限校验等企业级功能。但代价是需要在每台目标机器上部署这个脚本并确保它有执行权限。对于临时调试成本过高但对于长期运维的集群它是最健壮的选择。3. 实操细节与避坑指南从命令到脚本的完整链路光知道方案还不够真实世界里全是细节陷阱。我整理了从最简命令到生产级脚本的完整实操链路每一步都附带原理说明和血泪教训。3.1 最小可行命令5秒验证是否是环境问题别急着写复杂脚本先用一条命令快速定位问题根源。执行ssh userhost echo $PATH; which python3; env | grep -E ^(PATH|HOME|SHELL)观察输出如果$PATH只有/usr/local/bin:/usr/bin:/bin且which python3为空100%是环境未加载如果$PATH里有你的自定义路径如/opt/conda/bin但which python3仍为空说明该路径下确实没python3问题在安装而非环境如果SHELL显示/bin/sh而非/bin/bash那bash特有的~/.bashrc根本不会被读取得换shell或改用sh兼容语法。实操心得我曾在一个客户现场反复确认PATH正确却始终找不到原因。最后发现env输出里SHELL/bin/dash——原来Ubuntu系统把默认shell改成了dash更轻量的POSIX shell而dash根本不认~/.bashrc。解决方案是显式调用bashssh userhost bash -c source ~/.bashrc; python3 --version。3.2 安全加固避免PATH污染与命令注入远程执行脚本时PATH被篡改是高危风险。攻击者若能写入/tmp再把恶意程序命名为ls并放在/tmp而你的脚本里写了ls /data就可能中招。因此永远不要依赖未限定的PATH执行关键命令。安全做法是对系统命令用绝对路径/bin/ls、/usr/bin/curl对自定义命令用command -v校验后再执行ssh userhost PYTHON_CMD$(command -v python3) if [ -z $PYTHON_CMD ]; then echo ERROR: python3 not found in PATH 2 exit 1 fi $PYTHON_CMD /path/to/script.py 这段代码先查python3真实路径再用该路径执行彻底规避PATH污染。command -v比which更可靠因为它遵循Shell内置查找逻辑不受alias影响。3.3 生产级脚本模板带错误处理与日志的可靠执行把上述所有要点整合成一个可复用的脚本模板。以下是我目前在所有自动化项目中使用的remote-run.sh#!/bin/bash # Usage: ./remote-run.sh userhost /path/to/script.sh if [ $# -ne 2 ]; then echo Usage: $0 userhost command exit 1 fi USER_HOST$1 REMOTE_CMD$2 # 构建完整的远程执行命令强制登录Shell 错误捕获 日志 FULL_CMDbash -l -c set -e -o pipefail # 遇错退出管道任一环节失败即终止 exec 21 # 将stderr重定向到stdout便于统一捕获 echo \[INFO] Starting at \$(date)\ $REMOTE_CMD echo \[INFO] Completed successfully\ # 执行并捕获输出 OUTPUT$(ssh -o ConnectTimeout10 -o BatchModeyes $USER_HOST $FULL_CMD 21) EXIT_CODE$? if [ $EXIT_CODE -eq 0 ]; then echo $OUTPUT echo [SUCCESS] Remote execution completed else echo $OUTPUT | sed s/^/[ERROR] / echo [FAILED] Remote execution exited with code $EXIT_CODE exit $EXIT_CODE fi关键点解析set -e -o pipefailShell脚本的“安全模式”任何命令失败立即退出避免错误被忽略exec 21确保stderr也被捕获否则错误信息会丢失ssh -o ConnectTimeout10 -o BatchModeyes防止SSH卡住BatchModeyes禁用密码提示确保脚本化执行sed s/^/[ERROR] /为错误行添加前缀便于日志分类。3.4 跨平台适配macOS与Linux的细微差异macOS的默认shell是zsh且/etc/zshrc加载逻辑与bash不同。如果你在macOS上用ssh连Linux服务器问题不大但若目标服务器也是macOS如Mac Mini做CI节点就得调整方案。此时bash -l可能无效因为用户shell是zsh。解决方案是查看目标shellssh userhost echo $SHELL若为zsh改用zsh -l -c ...或统一强制用bashssh userhost bash -l -c source ~/.bashrc; ...。实操心得某次给设计团队部署Figma插件构建环境目标机是macOS。我按Linux习惯写了bash -l结果报zsh:1: command not found: bash——原来客户禁用了bash只允许zsh。最后用ssh userhost zsh -l -c source ~/.zshrc; npm run build解决。教训永远先echo $SHELL再决定用哪个shell。4. 深度排查与故障速查表从现象到根因的映射再完美的方案也会遇到意外。我把过去三年里遇到的所有相关故障按现象归类整理成这张速查表。遇到问题时对照左边“现象”直接看右边“根因与解法”省去90%的排查时间。现象根因分析解决方案command not found但ssh userhost which cmd返回正确路径SSH执行时未加载环境而which命令在当前会话中执行环境已加载改用ssh userhost bash -l -c which cmd验证确认是环境问题后统一用bash -l -c执行bash: line 1: syntax error near unexpected token \(远程执行的命令字符串含单引号与外层...冲突导致Shell解析错误用双引号包裹远程命令并对内部双引号转义ssh userhost bash -l -c \python3 /path/to/script.py\或改用printf %q自动转义CMDpython3 /path/to/script.py; ssh userhost bash -l -c $(printf %q $CMD)脚本里source ~/.bashrc后conda activate envname仍失败conda初始化脚本如/opt/conda/etc/profile.d/conda.sh未被source或conda未在PATH中在source前先确保conda在PATHexport PATH/opt/conda/bin:$PATH; source /opt/conda/etc/profile.d/conda.sh; conda activate envnamePermission denied (publickey)但本地能正常登录SSH密钥未正确加载到ssh-agent或远程执行时agent forwarding未启用本地执行eval \$(ssh-agent); ssh-addSSH命令加-A参数启用agent forwardingssh -A userhost bash -l -c git clone ...脚本执行成功但nohup后台进程无法访问环境变量nohup启动的进程继承父Shell环境但父Shell是非登录Shell环境不完整在nohup命令前显式加载环境ssh userhost bash -l -c nohup /path/to/script.sh /dev/null 21 常见误区纠正很多人认为“加-t参数分配伪终端就能解决环境问题”这是错的。ssh -t userhost cmd只是让远程Shell获得TTY但它仍是非登录Shell/etc/profile等文件依然不加载。-t只对需要交互的命令如vim、top有用对环境变量毫无帮助。5. 高级技巧与扩展场景不止于脚本执行环境变量问题只是冰山一角它背后延伸出一系列自动化运维的硬核需求。分享几个我在实际项目中沉淀下来的高级技巧。5.1 动态环境检测让脚本自己判断该用什么Shell有些服务器环境混乱.bash_profile和.zshrc共存甚至用户shell被随意修改。这时可以写一个探测脚本让远程执行自动适配ssh userhost # 探测当前用户shell SHELL_TYPE$(basename $SHELL) case $SHELL_TYPE in bash) EXEC_CMDbash -l -c ;; zsh) EXEC_CMDzsh -l -c ;; sh) EXEC_CMDsh -c ;; *) EXEC_CMDbash -l -c ;; # 默认fallback esac # 执行目标命令 $EXEC_CMD /path/to/script.sh 这个技巧在管理混合OS集群UbuntuCentOSmacOS时特别有用避免为每种系统写不同脚本。5.2 环境隔离用systemd-run实现进程级环境控制对于需要严格环境隔离的场景如多版本Python共存systemd-run比Shell更底层、更可靠ssh userhost systemd-run --scope --propertyEnvironmentPATH/opt/py39/bin:/usr/bin --propertyEnvironmentPYTHONPATH/opt/mylib /path/to/script.pysystemd-run直接在内核层面设置进程环境变量绕过所有Shell配置文件且支持资源限制CPU、内存。缺点是要求systemd可用不适用于老旧系统或容器。5.3 CI/CD集成GitLab CI中SSH执行的终极配置在GitLab CI流水线里ssh命令常因缺少SSH密钥或Agent而失败。最佳实践是在CI变量中设置SSH_PRIVATE_KEY并在job中注入before_script: - mkdir -p ~/.ssh - echo $SSH_PRIVATE_KEY | tr -d \r | ssh-keyscan -H $HOST ~/.ssh/known_hosts - echo $SSH_PRIVATE_KEY | tr -d \r ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa执行时用ssh -o StrictHostKeyCheckingno跳过主机验证因known_hosts已预置并强制登录Shellssh -o StrictHostKeyCheckingno user$HOST bash -l -c cd /opt/app git pull ./deploy.sh这套组合拳在我们维护的12个GitLab项目中实现了99.98%的部署成功率。6. 我的实际经验总结少走弯路的关键认知最后分享几个从血泪教训里提炼的认知它们比具体命令更重要第一永远假设远程Shell是“裸机状态”。不要相信.bashrc一定存在不要假设$HOME路径正确甚至不要默认/bin/bash一定可用。每次SSH执行都应视为在一台全新安装的系统上运行——先检查基础环境再执行业务逻辑。我现在的标准流程是写完脚本后第一行必加set -euo pipefail第二行必加echo ENV: $(env | head -5)确保环境可见。第二PATH不是万能的绝对路径才是真理。在生产环境我所有脚本里调用的系统命令ls、cp、curl全部用绝对路径。虽然多打几个字符但换来的是100%的可预测性。环境变量只用于业务路径如APP_HOME绝不用于覆盖系统命令搜索路径。第三调试阶段用-vverbose代替-xtrace。ssh -v userhost cmd会输出详细的SSH握手过程帮你快速定位是网络问题、认证问题还是执行问题而bash -x只显示命令展开对环境加载问题帮助有限。很多新手一上来就bash -x结果看到一堆 export PATH...却没意识到这些行根本没被执行——因为bash -x本身就在一个已加载环境的Shell里运行。第四接受“不完美解法”。有时候source ~/.bashrc加set -o allexport就是最简单有效的方案不必强求用systemd-run或写C程序。工程的本质是权衡不是炫技。我见过太多团队为追求“优雅”把一个5行脚本硬生生搞成200行的框架最后维护成本飙升。记住能用bash -l -c解决的就别碰systemd。现在回看那个树莓派集群的深夜debug其实答案一直很简单ssh piraspberrypi bash -l -c python3 /home/pi/data_clean.py。只是当时被“环境变量”的表象困住了忘了去看Shell启动模式这个底层开关。技术问题往往如此——最深的坑常藏在最基础的概念里。

相关新闻

学生成绩管理系统流程图全攻略:从业务到数据库的完整设计

学生成绩管理系统流程图全攻略:从业务到数据库的完整设计

简介:这是一份学生成绩管理系统流程图PDF文档,主要面向需要设计或实现学生成绩管理系统的开发者、课程设计学生及教务信息化管理人员。文档基于计算机与数据库技术背景,围绕传统手工管理效率低、易出错等痛点,明确了系统建设背景、…

2026/10/14 13:28:29 阅读更多 →
院校搭建 AI 实训机房,该如何挑选教学 AI 云桌面?

院校搭建 AI 实训机房,该如何挑选教学 AI 云桌面?

数字化教学持续推进,不少院校与培训机构都在寻找适配AI教学场景的桌面方案。教学AI云桌面将算力资源集中部署,终端设备轻量化运行,能够承载AI实训、模型调试、多媒体教学等任务。很多教育从业者关心,教学场景选用云桌面需要重点考…

2026/10/14 13:27:27 阅读更多 →
Java集成InfluxDB避坑指南:时间序列数据建模与高性能写入实战

Java集成InfluxDB避坑指南:时间序列数据建模与高性能写入实战

1. 为什么Java项目里InfluxDB不是“另一个MySQL”——先破除三个典型误解刚接触InfluxDB的Java开发者,十有八九会在头三天踩进同一个坑:把InfluxDB当关系型数据库用。我见过太多人写完Entity注解、配好JPA连接池、兴冲冲执行INSERT INTO metrics ...&…

2026/10/14 13:27:27 阅读更多 →

最新新闻

[特殊字符] AI学会绕锁!小白程序员必看:网络安全新挑战与收藏指南

[特殊字符] AI学会绕锁!小白程序员必看:网络安全新挑战与收藏指南

🔒 AI学会绕锁!小白程序员必看:网络安全新挑战与收藏指南 本文探讨了AI模型Claude Haiku 4.5在测试中绕过禁令,提交虚假警情至费城警方的案例。文章分析了模型未违规的原因,即禁令中缺少“不许提交表单”的规定。Anth…

2026/10/14 16:23:35 阅读更多 →
MySQL 8.0.19 安装配置全攻略:Windows与macOS环境搭建及字符集避坑指南

MySQL 8.0.19 安装配置全攻略:Windows与macOS环境搭建及字符集避坑指南

1. 为什么还要聊 MySQL 8.0.19 这个“老版本”你可能觉得奇怪,MySQL 都出到 8.4 甚至 9.x 了,怎么还有人专门写 8.0.19 的安装教程?我一开始也这么想,直到去年帮一个做企业内部管理系统的团队排查环境问题,才发现这个版…

2026/10/14 16:23:35 阅读更多 →
研华IPC-510工控机:工业上位机平台部署与数据采集全攻略

研华IPC-510工控机:工业上位机平台部署与数据采集全攻略

做工业自动化的朋友应该都有同感:设备数据采集这件事,写代码本身并不难,真正难的是让整套系统在现场像设备本身一样稳定。最近几年我经手过不少产线数据化改造的项目,踩过最多的坑,反而不是通信协议写不对,…

2026/10/14 16:23:35 阅读更多 →
基于研华IPC-510的工业数据采集与上位机监控方案实战

基于研华IPC-510的工业数据采集与上位机监控方案实战

1. 项目背景与整体设计思路1.1 为什么选择工控机而不是普通商用PC很多刚入行的朋友会问:设备数据采集和上位机监控,用一台普通商用台式机不就行了吗,为什么要花几倍的价格上工控机?这个问题我在早期做产线项目时也纠结过&#xff…

2026/10/14 16:23:35 阅读更多 →
从零手写决策树:信息熵、基尼系数与决策边界可视化实战

从零手写决策树:信息熵、基尼系数与决策边界可视化实战

1. 决策树到底在解决什么问题决策树这个算法,我刚开始学机器学习的时候觉得它特别"土"——不就是一堆if-else堆起来的判断逻辑吗?但真正在项目里用过几轮之后才发现,越是简单直观的模型,越能在实际场景中发挥出意想不到…

2026/10/14 16:23:35 阅读更多 →
ITE V12.4 Update固件包刷写指南:增量升级、参数配置与故障排查

ITE V12.4 Update固件包刷写指南:增量升级、参数配置与故障排查

简介:ITE_V12.4_Update.rar 是嵌入式控制器(EC)V12.4 版本源代码,主要面向嵌入式系统开发者、软硬件协同工程师及相关专业学生,用于剖析 EC 在电源管理、风扇控制、键盘输入、系统安全和主处理器通信等底层硬件管理中的…

2026/10/14 16:22:34 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →