NOTE · Engineering Systems

桌面工具与安全故障排查备忘

整理 Windows 软件检查、目录联接、下载校验、Git 连通性与 Nginx 权限排障。

零散故障最容易被“下载一个修复工具”带偏。更可靠的顺序是:确认版本与来源、保存错误原文、做只读检查、选择可回滚修改,最后验证结果。

Windows 软件清单与卸载

优先使用系统设置或 WinGet 查看精确的软件 ID,不运行来源不明的卸载脚本:

winget list
winget list --name "Example App"
winget uninstall --id Vendor.ExampleApp --exact --interactive

卸载前记录应用版本、安装范围和用户数据目录。--exact 可以减少同名软件被误选的风险;如果 WinGet 无法唯一识别,回到“设置 → 应用”使用软件自带卸载器。

检查实际执行的是哪个命令:

Get-Command python -All
Get-Command git -All
where.exe python
where.exe git

校验下载文件

软件只从项目官网、系统包管理器或官方发布页获取。若发布方提供 SHA-256,下载后本地核对:

Get-FileHash .\installer.exe -Algorithm SHA256

哈希一致只能证明文件与发布方给出的值一致,不能替代来源和数字签名检查。不要从网盘转载、论坛附件或非官方镜像下载安装包。

一个带提取密码的“常用字体”网盘包没有可核验的发布者、版本、哈希和授权信息,因此本文不提供该入口。字体应从操作系统仓库、字体作者或组织的正式发布页获取,并确认使用许可。

版本兼容信息先看项目本身

PyTorch、TorchVision、TorchAudio、TorchText 的第三方版本对应表很快会过时,更稳妥的入口是 PyTorch Previous Versions 和各组件当前发布说明。

排查二进制扩展错误时,先记录实际环境:

python - <<'PY'
import sys
import torch
print("python:", sys.version)
print("torch:", torch.__version__)
print("cuda runtime:", torch.version.cuda)
print("cuda available:", torch.cuda.is_available())
try:
    import torchvision
    print("torchvision:", torchvision.__version__)
except Exception as exc:
    print("torchvision import failed:", repr(exc))
PY

torchvision::nms 不可用通常应从 Torch/TorchVision 构建组合、CPU/CUDA wheel 来源和动态库加载错误入手;不要只看到函数缺失就重新复制 DLL 或随机降级。数组维度相关内容另见站内的 NumPy/PyTorch 笔记。

TensorFlow 可用下面的公开 API 检查框架是否看见 GPU:

python -c 'import tensorflow as tf; print(tf.config.list_physical_devices("GPU"))'

空列表只说明当前 TensorFlow 进程没有枚举到 GPU,不能单独定位是驱动、运行时、软件包还是设备权限问题。

GoodSync:先 Analyze,再 Sync

这里把 GoodSync 的操作整理成不依赖截图的工作原则。一个 Job 包含左右目录、方向、过滤规则和自动执行条件:

  1. 第一次先确认它是双向同步还是单向备份;
  2. 点击 Analyze 后逐项查看复制、覆盖、删除和冲突方向;
  3. 对包含删除动作、目录联接或符号链接的任务,先用测试目录演练;
  4. 确认预览后才执行 Sync
  5. 同步完成后查看日志,并做一次从备份侧恢复文件的验证。

同步不是备份的同义词:双向任务可能把误删传播到两端。重要数据还需要版本历史、离线副本或不可变备份。界面和命令以 GoodSync 官方手册 为准。

用目录联接迁移大目录

mklink /J 创建目录联接,使旧路径指向新的本地目录。下面的例子把 C:\ProgramData\Activision 迁到 G:\Activision

mklink /J "C:\ProgramData\Activision" "G:\Activision"

安全迁移顺序:

  1. 完全退出应用和相关后台服务。
  2. 备份源目录,并复制到目标磁盘。
  3. 比较文件数量、大小和关键文件哈希。
  4. 将原目录改成临时备份名,不要立即删除。
  5. 在原路径创建目录联接并启动应用验证。
  6. 经过一段时间确认应用、更新和备份都正常后,再单独决定如何处理旧副本。

查看目录联接:

dir /AL "C:\ProgramData"
fsutil reparsepoint query "C:\ProgramData\Activision"

边界:

  • /J 用于目录联接,不用于普通文件。
  • 创建联接时,作为链接的旧路径不能仍是一个普通目录。
  • 不要把系统目录、驱动目录或不清楚更新机制的软件目录作为第一次实验对象。
  • 删除链接和删除目标目录不是同一件事;操作前必须再次解析目标路径。

Git 连接到 443 端口失败

先判断问题发生在 DNS、TCP、代理、TLS 还是仓库权限层:

Resolve-DnsName github.com
Test-NetConnection github.com -Port 443
git config --show-origin --get-regexp "http\..*proxy|https\..*proxy"
git remote -v

在 Linux 上可以对应检查:

getent ahosts github.com
curl -I --max-time 10 https://github.com/
git config --show-origin --get-regexp 'http\..*proxy|https\..*proxy'
git remote -v

不要看到连接失败就全局写入一个未知代理。若确实配置过代理,应先确认配置来自哪个文件,再有针对性地修正。仓库返回 401/403 时还要检查克隆 URL、账号权限和凭据,网络可达不代表授权成功。

仓库可见性不是普通网络设置

把 GitHub 仓库从 public 改为 private 不只是改变一个开关:公开 fork、规则、Actions 日志以及部分功能都可能受影响。执行前先阅读 GitHub 官方可见性说明,确认仓库、fork、Pages 和协作者影响,再在仓库 Settings 的 Danger Zone 中操作。

安装 Git 则优先使用 Git 官方下载页 或系统包管理器。安装完先验证实际命令来源:

Get-Command git -All
git --version

npm 镜像与缓存

切换 npm 镜像前,先查看当前有效配置及来源:

npm config get registry
npm config list

官方默认 registry 是 https://registry.npmjs.org/。只有组织明确提供并维护镜像时才更改;排障后应删除临时覆盖,而不是把未知镜像写入全局配置。registry 可达不代表包可信,仍要核对包名、发布者、锁文件和完整性信息。

Home Assistant 反向代理 400

Home Assistant 位于传统反向代理之后时,会拒绝来自未受信任代理的转发头。下面的历史配置使用反向代理地址 10.0.0.200

http:
  use_x_forwarded_for: true
  trusted_proxies:
    - 10.0.0.200

这里必须替换为实际反向代理本身的精确地址;不要为了省事信任整个局域网或 0.0.0.0/0。如果填写 CIDR,应写网络地址而不是“主机地址/前缀”。修改前保存配置,按当前 Home Assistant 的配置检查/回滚机制操作。详见 Home Assistant HTTP integration

qBittorrent WebUI 经反代出现 Unauthorized 时,也不要直接关闭 Host header、CSRF 或认证保护。先核对 qBittorrent 日志、外部 URL、转发的 Host/scheme、WebSocket 和代理来源;不同版本的安全选项有变化,应以正在运行版本的官方 WebUI 文档为准。

浏览器扩展与文档工具

  • “手动安装 CRX”只适合能够验证发布者、源码、签名和更新来源的内部扩展。普通用户应从浏览器官方商店安装;来源不明的 CRX 可能读取所有网页内容。
  • CAJViewer 卸载重装仍失败时,先记录版本、文件关联、用户配置目录和错误日志;不要运行来源不明的“一分钟修复”脚本。
  • MuPDF 项目的 mutool 能检查、转换和修复 PDF,但具体子命令可能重写输出。先用 mutool -vmutool help 查看本机版本,并始终写到新文件,不覆盖唯一原件。
  • 把磁盘格式化为 ext4 会销毁原文件系统,不属于杂项“修复命令”。应先按 Ubuntu 存储页确认设备身份、挂载状态和可验证备份。

Windows 与外设小问题

  • Keychron 等键盘的 F1–F12 行为可能由键盘模式、固件、桌面快捷键和 Linux HID 驱动共同决定。先确认硬件的 Windows/macOS 模式和键盘事件,再决定是否需要驱动参数;不直接复制永久内核选项。
  • 笔记本合盖不睡眠已经整理到《Windows 睡眠、休眠与电源计划》。AwayModeEnabled 注册表配方没有足够适用边界,因此不建议使用。
  • 路由器“有线中继下固定 IP”应优先做 DHCP reservation;不要在多台设备上手工写入可能冲突的地址。

Nginx directory index ... is forbidden

这个错误通常表示请求落到了目录,但没有可用的首页文件,或 Nginx 工作用户无法沿路径读取。先做只读检查:

sudo nginx -T
namei -l /var/www/example/index.html
sudo -u www-data test -r /var/www/example/index.html

逐项核对:

  • root / alias 是否指向预期目录。
  • index 中声明的文件是否真实存在。
  • Nginx 用户对每一级父目录是否有执行权限,对文件是否有读取权限。
  • 是否本来就不应开启目录列表。

不要用 chmod -R 777 作为修复;它会扩大整个目录树的写权限,并掩盖真正的所有者或路径错误。修改后先运行 sudo nginx -t,成功后再 reload。

通用排障记录模板

公开记录问题时应保留能复现问题的技术证据,同时删除直接姓名和真实凭据:

环境:操作系统、软件版本、安装来源
预期:希望发生什么
实际:完整错误文本与退出码
最小复现:不含真实姓名、密码、令牌、私钥或授权码的步骤
已验证:只读检查结果
改动:具体修改及回滚办法
结果:修改后如何确认恢复

截图前重点检查真实姓名、密码、令牌、私钥、邮箱授权码、浏览器标签和通知内容。普通用户名、路径、IP、主机名和设备编号如果能解释问题可以保留;能用完整文字错误日志表达时,仍优先使用可搜索的文本。

官方资料

参考资料与书签

以下 20 条作为历史书签,保留链接原题和 URL。第三方卸载、注册表、镜像、格式化、浏览器扩展和“一分钟修复”内容必须先验证版本、来源、影响范围和回滚方式,不能直接照抄。

本文不提供带提取密码的非官方字体压缩包链接。它属于未知二进制或字体下载,缺少可核验授权和完整性信息。