让自动化代理安全连接安卓手机:从 SSH 误区到无线 ADB 的完整实践

一、需求背景 在家庭网络中运行了一台常驻服务器,并在服务器上部署自动化代理。希望代理能够连接安卓手机,检查系统状态、读取输入法配置、收集日志,并在明确授权的情况下完成部分设置调整。 最初容易想到的是 SSH,因为服务器管理通常都依赖 SSH。但安卓手机并不是普通 Linux 服务器,直接照搬桌面 Linux 的远程管理方式,会遇到权限、应用沙箱和后台限制等问题。 因此,首先需要区分三类工具: 这三者的用途完全不同。 二、SSH 客户端不能让服务器反向进入手机 手机上常见的 SSH 工具,多数只是 SSH 客户端。 它们适合以下方向: 例如在外出时,用手机登录家里的服务器,查看服务状态或执行维护命令。 但自动化代理连接手机需要的是反方向: SSH 客户端本身不会在手机上监听端口,因此不能让服务器主动登录手机。 如果确实希望通过 SSH 控制手机,需要在手机上另外安装能够提供 sshd 的环境,例如 Termux,并在其中安装 OpenSSH。 这种方式适合: 但它不能自动突破 Android 应用沙箱,也不能直接读取其他应用的内部私有目录。 三、Termux SSH 与无线 ADB 的区别 Termux SSH 的控制范围主要是: 无线 ADB 的控制范围则更偏向 Android 系统: 因此,如果目标是让自动化代理检查安卓系统和输入法,优先选择无线 ADB更合适。 Termux …

Linux 日语输入法审计:确认引擎、备份词库与迁移学习数据

在 Linux 桌面环境中安装日语输入法并不困难,但真正需要迁移系统、重装发行版或更换电脑时,往往会遇到几个问题: 为回答这些问题,对一台运行 Arch Linux、KDE Plasma 和 Wayland 的工作站进行了一次只读审计。审计不修改配置、不卸载软件包,也不重启输入法,仅检查当前运行状态、配置文件、用户数据和可迁移性。 一、当前输入法环境 审计确认,当前活跃的输入法框架是: 桌面会话为 KDE Plasma Wayland,Fcitx5 进程和对应的用户服务均处于正常运行状态。 当前实际激活的输入法是: Rime 主要用于中文输入,并不是本次检查的日语输入法。 当前 Fcitx5 输入法列表中配置的日语输入法是: 系统中另外还安装了多个日语输入引擎: 这些引擎虽然已经安装,但并未全部加入当前日常使用的输入法切换列表。 因此,需要区分四种状态: 状态 含义 已安装 软件包存在于系统中 可用 Fcitx5 能够识别该输入法引擎 已配置 输入法已加入当前 Fcitx5 输入法组 当前激活 此刻正在用于输入的引擎 本机的实际情况是: 二、为什么选择 Mozc Mozc 是一个开源日语输入引擎,常用于 Linux 上的日语输入。它可以通过 Fcitx5、IBus 等不同输入法框架使用。 在当前系统中,Mozc 通过 …

在 Fcitx5-Rime 中实现动态日期与时间候选:一次从“部署成功”到“真实可用”的排查记录

在 Linux 桌面环境中,Rime 输入法具有很强的可定制能力。除了词库、快捷键和候选数量,也可以借助 Lua 动态生成当前日期、时间和星期。 目标效果如下: 这类功能看似只是增加几行配置,实际排查过程中却遇到了几个容易误判的问题: 本文整理完整过程,并总结一套更可靠的处理方法。 一、运行环境与需求 测试环境为: 用户原本已经将每页候选数量改为 9,但修改位置位于: build/ 是 Rime 的编译产物目录。这里的文件会在重新部署时被重新生成,因此不适合保存长期自定义配置。 正确做法是把自定义内容放在用户数据目录: 例如: 二、先确认 Lua 支持是否存在 动态日期和时间需要 librime-lua。 在 Arch Linux 中,新版 librime 软件包通常已经包含 Lua 插件,不一定需要额外安装独立软件包。 可以检查: 再确认插件文件: 如果能看到对应的 Lua 插件文件,并且该文件属于 librime 软件包,说明 Lua 支持已经安装。 三、不要继续修改 build 目录 候选数量应写入: 例如: 动态 Lua translator 也应通过同一个补丁挂载: …

Nextcloud Passkey 登录实践:陌生电脑扫码登录为何需要蓝牙

在公司电脑、公共电脑或临时设备上访问自建 Nextcloud 时,传统的账号密码登录并不理想。 一方面,需要在陌生设备上输入密码;另一方面,即使使用浏览器隐私窗口,也仍然可能留下下载文件、剪贴板内容或系统级访问记录。 Passkey 提供了一种更方便的思路: 整个过程中,Nextcloud 密码不需要输入到陌生电脑上。 不过,这种登录方式有一个容易被忽视的前提:电脑通常需要具备蓝牙功能。 Nextcloud 是否支持 Passkey Nextcloud 支持基于 WebAuthn/FIDO2 的身份验证。 根据 Nextcloud 版本、管理员配置和已启用的应用,WebAuthn 可能以两种形式出现: 如果目标是在陌生电脑上不输入密码,应当使用无密码认证或 Passkey 登录,而不是只配置“密码加 WebAuthn 二次验证”。 通常可以在 Nextcloud 的个人安全设置中找到类似以下选项: 不同版本和语言环境下,名称可能略有差异。 注册 Passkey 时,可以将凭据保存在: 配置完成后,建议先使用另一台可信设备实际测试一次,确认二维码登录、用户名识别和二次验证流程都符合预期。 陌生电脑上的典型登录流程 在支持跨设备 Passkey 的浏览器中,登录流程通常如下: 这种模式的优势是,Passkey 私钥不会复制到临时电脑上,Nextcloud 密码也不需要在该设备中输入。 为什么扫码登录还需要蓝牙 很多人会自然地认为: 二维码已经把手机和电脑连接起来了,为什么还要蓝牙? 原因是,二维码只能让手机知道“这次登录请求是什么”,却不能证明手机与发起登录的电脑确实处在同一地点。 跨设备 Passkey 通常采用一种被称为混合传输的机制。它会同时使用: 三者承担的职责并不相同。 第一步:电脑生成一次性二维码 电脑上的浏览器启动 …

Arch Linux KDE Wayland 下绘图板有线与蓝牙双模式映射实践

本文中的设备型号、硬件 ID、主机名、用户目录、映射参数、日志时间和规则文件名均为虚构示例,仅用于展示排查方法与配置结构,不可直接复制到真实环境。 一、环境与目标 测试环境如下: 目标是让绘图板在两种连接方式下保持一致的行为: 期望映射参数如下: 其中 X 和 Y 表示区域中心,而不是左上角坐标。 对应的屏幕区域边界为: 二、USB 模式:使用 OpenTabletDriver 1. 启动用户级服务 安装驱动后启用用户服务: 确认状态: 插入 USB 后检查日志: 成功识别时可能出现: 还应确认原生内核驱动没有同时接管: 如果第三方驱动与原生驱动同时处理同一设备,可能出现: 2. 配置 USB 映射 启动图形界面: 在 Display 区域填写: 在 Tablet 区域填写: 操作顺序: 保存后,USB 再次插入时应自动恢复该配置。 三、断开 USB 时图形界面崩溃 某些 OpenTabletDriver GTK 界面在设备断开时,可能因为设备列表刷新而异常退出。 典型提示类似: 这不一定意味着后台 daemon 也已停止。 …

用独立 Context 资料库为 AI Agent 的启动上下文减负

随着 AI Agent 使用时间增长,工作区中的规则、主机信息、操作手册、故障记录和长期记忆往往会不断积累。 一开始,所有内容可能只有几个 Markdown 文件。为了让 Agent 每次启动时都能理解环境,这些文件通常会被自动注入上下文。然而,当内容逐渐增加后,一个新的问题随之出现: Agent 每处理一次普通任务,都要重新读取大量与当前任务无关的技术资料。 例如,处理一个简单文件操作时,模型可能同时接收到: 这些资料都很重要,不能删除,但也没有必要在每轮对话中全部注入。 解决这个问题的一种有效方法,是在工作区中建立一个独立的、按需读取的 context/ 资料库。 一、问题不只是某个文件太长 不少 Agent 工作区会包含类似文件: 这些文件通常承担不同职责: 问题在于,详细技术资料往往会逐渐混入这些启动文件。 例如,一个网络问题可能在排查后留下几千字内容,其中包括: 这些内容确实值得长期保存。如果全部留在 TOOLS.md 或 MEMORY.md 中,每次启动都会重复占用上下文。 仅仅把内容从 MEMORY.md 移到 TOOLS.md,并没有真正解决问题。它只是把负担从一个自动注入文件转移到了另一个自动注入文件。 真正需要优化的是: 所有启动文件的总注入量,而不是某一个文件的长度。 二、三层知识结构 更适合长期维护的结构,可以分为三个层级。 1. 启动层 每轮对话都应知道的内容,继续保存在自动注入文件中: 这一层只保存: 启动层应当短、小、稳定。 2. 按需资料层 详细技术资料进入: 这一层保存: 这些文件不应每轮自动注入,而应在任务需要时由 Agent 主动读取。 3. 历史与证据层 …

RustDesk 在 KDE Wayland 下剪贴板只能单向同步的排查与解决

在 Linux 桌面环境中使用 RustDesk 远程连接 Windows 时,遇到了一个比较特殊的剪贴板问题: 这种“单向正常、反向失败”的现象,容易被误认为是 Windows 剪贴板服务异常,或者 RustDesk 的剪贴板权限没有打开。但进一步排查后发现,真正的问题位于 Linux 客户端一侧,并且与 KDE Plasma Wayland 环境及 RustDesk 版本有关。 一、问题环境 发生问题的本地系统为 Arch Linux,桌面环境使用 KDE Plasma,当前会话类型为 Wayland。 远程端是一台 Windows 系统,通过 RustDesk 进行远程控制。 首先检查 Linux 当前的图形会话类型和 RustDesk 安装情况: 输出结果显示: 这说明当前使用的是系统软件包方式安装的 RustDesk 1.4.7,并不是 Flatpak 版本。 二、为什么问题只发生在一个方向 远程桌面的剪贴板同步并不是一个完全对称的过程。 当从 Windows 复制文字到 Linux 时,RustDesk …

通过 SSH 隧道连接远程 Windows:FRP、RDP 与 Linux 客户端的组合实践

在远程维护 Windows 主机时,常见方案包括 RustDesk、AnyDesk、直接暴露 RDP、VPN,以及通过 SSH 隧道转发 RDP。 其中一种兼顾安全性、清晰度和使用便利性的方案是: 这种结构不需要把 Windows 的 RDP 端口直接暴露到公网,同时仍然可以获得原生 RDP 较高的画质、较低的带宽占用和良好的剪贴板体验。 一、整体结构 假设存在三台设备: 远程 Windows 位于内网,没有公网 IP。Windows 上运行 FRP 客户端,主动连接公网中转服务器上的 FRP 服务端。 FRP 已经建立了一条 SSH 映射: 因此,在 Linux 上可以通过下面的方式登录远程 Windows: 这里连接的虽然是公网中转服务器的地址和端口,但最终进入的是远程 Windows 的 OpenSSH 服务。 在此基础上,再增加一层 SSH 本地端口转发: 最终链路如下: 需要特别注意: FRP 映射的仍然只是 SSH,并没有把 RDP 直接暴露到公网。 …

Waydroid 突然提示“设备未通过 Play Protect 认证”的排查与修复

在 Linux 桌面环境中运行带有 Google 服务的 Waydroid 时,Google Play 商店可能原本一直正常,某次启动后却突然显示: This device isn’t Play Protect certified 页面会提示设备没有获得运行 Google 应用和服务的认证,Play 商店也无法继续使用。 这类问题看起来像是整个 Google 服务环境失效,但实际原因往往没有那么严重。一次实际排查表明,网络连接、Google Services Framework ID 和 Google 服务器签到都可能完全正常,真正没有刷新的只是 Google Play services 内部保存的设备认证状态。 一、问题表现 Waydroid 可以正常启动,Android 系统也能够联网,其他应用没有明显异常,但打开 Google Play 商店后会直接跳转到未认证提示页面。 常见误判包括: 实际上,Play Protect 应用扫描和设备认证状态是两套不同的机制。关闭扫描并不能让未认证设备恢复认证。 二、先查询当前 GSF Android ID Google 为未经过厂商认证的自定义 Android …

KDE Plasma Wayland 下 Fcitx5 托盘状态不同步:从双启动修复到启动顺序竞态的完整排查

前言:此前的修复为什么“有效”,却又不够完整 此前曾记录过一次 KDE Plasma Wayland 环境下的 Fcitx5 冷启动故障。 当时的现象是:系统冷启动后,部分 Chromium 系应用无法正常切换输入法;重新启动 Fcitx5 后,问题又会消失。最终排查发现,系统同时存在两条 Fcitx5 启动路径: 两条路径在登录时同时尝试启动 Fcitx5,导致 D-Bus 名称竞争和初始化竞态。解决办法是在用户配置目录建立同名覆盖文件,将传统 XDG Autostart 项隐藏: 示例路径经过脱敏: 这样便只保留 KWin Wayland 的官方输入法启动路径。 这项修复非常重要,而且确实解决了一个真实问题: 当时一度认为问题已经完整解决。 后来出现的新现象证明:Hidden=true 解决的是“双启动”,但没有解决所有与启动时序相关的问题。 新的问题不再是输入法不能使用,而是: 这两个问题彼此相关,但并不是同一个问题。 一、环境与故障现象 测试环境经过脱敏后大致如下: 最典型的现象是: 这说明必须把两个概念分开: 输入法核心状态 负责: 托盘显示状态 负责: 因此,托盘状态错误并不意味着 Fcitx5 核心输入功能已经失效。 二、先确认双启动问题没有复发 由于此前已经发生过双启动,第一步仍然是确认旧问题没有回来。 检查结果显示: 这一步非常关键。 如果没有先排除双启动,很容易把后面的托盘问题错误归因于此前的老问题。实际上,新的故障发生在单一 Fcitx5 …