工作流模板 · 高级

网络运维 Agent:爱快 / OpenWrt / iStoreOS / OpenClash 排错模板

给小白看的网络运维 Agent 模板,覆盖爱快、OpenWrt、iStoreOS、OpenClash、ShadowsocksR Plus+、PassWall、旁路由、DNS 分流、订阅转换、插件配置维修、OpenCode 可直接调用的 OpenWrt SSH 工具和备份回滚。

  • 网络运维
  • 爱快
  • OpenWrt
  • iStoreOS
  • OpenClash
  • PassWall
  • ShadowsocksR Plus+
  • 订阅转换
  • 插件维修
  • 旁路由
  • OpenCode SSH
更新于 2026-05-25

一句话结论

网络运维 Agent 的第一原则是先备份、先只读检查、一次只改一个变量,别让小问题变成全网断线。

适用场景

  • 家用软路由、店铺网络、工作室网络突然无法上网,需要快速定位 WAN、LAN、DNS、网关或插件问题
  • 爱快主路由 + OpenWrt / iStoreOS 旁路由,分不清到底是主路由、旁路由、DNS 分流还是代理插件出错
  • OpenClash、ShadowsocksR Plus+、PassWall、订阅转换、规则集更新、插件启动失败、TUN / TProxy 相关问题反复出现
  • OpenCode 第一次就需要一个能直接调用的 SSH 工具去检查 OpenWrt,而不是让它自己输入密码或手写 SSH 命令
  • 想让 Agent 帮忙整理排错步骤、生成备份清单、输出可复制命令和回滚方案

常见现象

  • 手机能连 Wi-Fi 但打不开网页,或者只有部分网站打不开
  • OpenClash / PassWall / ShadowsocksR Plus+ 显示运行中,但实际没有代理效果
  • 订阅导入失败、节点为空、规则集更新失败、订阅转换格式不匹配、DNS 泄漏或解析很慢
  • OpenCode 说无法 ssh 设备、Permission denied、Host key verification failed,或者提示需要密码但它不能输入
  • 旁路由接入后设备拿不到网关,或者网关指向正确但无法访问外网
  • 改完配置后进不了后台,只能重启或断电恢复

原因解释

  • 小白最常见的问题不是命令不会敲,而是没有把网络拆成 WAN、LAN、DNS、插件、订阅、客户端六层来查
  • 软路由场景里经常有两台设备同时负责 DHCP、网关或 DNS,导致流量走向和自己以为的不一样
  • 代理插件配置里订阅地址、规则模式、DNS 模式、TUN / TProxy 模式互相影响,随便改一个开关就可能影响全局
  • OpenCode 这类 CLI Agent 适合调用固定工具,不适合在 SSH 里临时输入密码;Mac 和 Windows 都应该先准备 `openwrt-ssh` / `openwrt-ssh.ps1` 这类安全包装工具
  • 没有备份和回滚点,Agent 直接给修改命令会放大风险

解决步骤

  1. 先收集拓扑:主路由型号、旁路由 IP、网关、DNS、DHCP 由谁发、哪些设备受影响。
  2. 先做只读检查:只看状态、路由表、DNS、日志、插件状态、订阅配置脱敏结果,不急着改配置。
  3. 如果用 OpenCode 远程检查设备,先安装站内提供的 OpenWrt SSH 工具,让它只暴露 `status`、`network`、`dns`、`proxy`、`backup` 和点名单个插件的日志动作;原始系统日志只由真人本地查看。
  4. 先备份:导出爱快配置、OpenWrt / iStoreOS 的 network、dhcp、firewall、openclash、passwall、passwall2、shadowsocksr 等配置。
  5. 按顺序排查:先 WAN 能不能通,再 LAN 地址是否冲突,再 DNS 是否解析,再插件是否接管流量,再看订阅转换和插件日志。
  6. 一次只改一个变量:例如只换 DNS、只关 TUN、只切换规则模式,改完立刻记录结果。
  7. 所有修改都要写回滚步骤:如果 5 分钟内没有改善,就恢复上一份配置。

可复制命令

# 先由真人按下文校验 SHA-256、完整审阅并安装 wrapper,再让 Agent 做只读检查
# 不要把 raw UCI 或 raw logread 输出直接交给 Agent;其中可能包含 PPPoE、订阅或客户环境信息
openwrt-ssh ping
openwrt-ssh status
openwrt-ssh network
openwrt-ssh dns
openwrt-ssh plugin-status
openwrt-ssh subscriptions
# 定向日志必须明确一个插件,例如 openwrt-ssh plugin-logs openclash
# 原始系统日志只由真人本地查看
# 只调用已校验并全文审阅的 wrapper;不要手写固定 /tmp 备份路径
openwrt-ssh backup all

# wrapper 会拒绝 symlink 和不安全权限,把敏感备份写入:
# /root/openwrt-backups(root:root,目录 700、文件 600)
# 备份可能包含 PPPoE、订阅、节点和客户环境信息,不要上传或发给 Agent。
# 问题解决并确认不再需要回滚后,由真人登录路由器清理旧备份。
# macOS:先下载到临时文件、核对固定 SHA-256、完整人工审阅,再备份并替换
umask 077
tool_dir="$HOME/bin"
target="$tool_dir/openwrt-ssh"
expected="6db3d0fa4a6ce52d221b7bc24c3e739c95f3eef362c83ad05d5b3cce69b5bb0a"
mkdir -p "$tool_dir"
tmp="$(mktemp "$tool_dir/openwrt-ssh.tmp.XXXXXX")"
trap 'rm -f "$tmp"' EXIT
curl --fail --location --proto '=https' --tlsv1.2 \
  https://thinktank.1a1api.top/tools/openwrt-ssh/openwrt-ssh -o "$tmp"
actual="$(shasum -a 256 "$tmp" | awk '{print $1}')"
[ "$actual" = "$expected" ] || { echo "SHA-256 mismatch" >&2; exit 1; }
cat "$tmp"
read -r -p '已完整审阅脚本,输入 yes 才安装:' confirm
[ "$confirm" = yes ] || exit 1
[ ! -e "$target" ] || cp -p "$target" "$target.bak.$(date +%Y%m%d-%H%M%S)"
chmod 700 "$tmp"
mv "$tmp" "$target"
trap - EXIT

# 确认 ~/bin 在 PATH 中;如果没有,就追加到 zsh 配置
case ":$PATH:" in *":$HOME/bin:"*) ;; *) echo 'export PATH="$HOME/bin:$PATH"' >> ~/.zshrc; export PATH="$HOME/bin:$PATH" ;; esac

# 第一次仍由真人完成专用 SSH Key 和 Host 别名;先人工核对路由器 IP 与主机指纹
mkdir -p ~/.ssh && chmod 700 ~/.ssh
ssh-keygen -t ed25519 -C "opencode-openwrt" -f ~/.ssh/openwrt_opencode
# 首次连接显示 fingerprint 时,先与路由器本机界面或本地控制台显示的主机指纹逐字比对;
# 无法带外核对就停止,不要确认主机密钥,也不要输入 root 密码。
cat ~/.ssh/openwrt_opencode.pub | ssh root@192.168.1.1 "umask 077; mkdir -p /etc/dropbear; cat >> /etc/dropbear/authorized_keys; chmod 600 /etc/dropbear/authorized_keys"
cat >> ~/.ssh/config <<'EOF'
Host openwrt-router
  HostName 192.168.1.1
  User root
  IdentityFile ~/.ssh/openwrt_opencode
  IdentitiesOnly yes
  StrictHostKeyChecking yes
EOF

openwrt-ssh ping
openwrt-ssh status
# Windows PowerShell:临时下载、固定 SHA-256 校验、完整人工审阅、备份后替换
$BinDir = Join-Path $env:USERPROFILE 'bin'
$Target = Join-Path $BinDir 'openwrt-ssh.ps1'
$Expected = 'dd0670e2f255f5679eda4270c73368bf6488d6c5a3e7e5763b3b2f532310a8b6'
New-Item -ItemType Directory -Force $BinDir | Out-Null
$Tmp = Join-Path $BinDir ("openwrt-ssh.{0}.tmp.ps1" -f [guid]::NewGuid())
try {
  Invoke-WebRequest -Uri 'https://thinktank.1a1api.top/tools/openwrt-ssh/openwrt-ssh.ps1' -OutFile $Tmp
  $Actual = (Get-FileHash -Algorithm SHA256 $Tmp).Hash.ToLowerInvariant()
  if ($Actual -ne $Expected) { throw 'SHA-256 mismatch' }
  Get-Content $Tmp
  if ((Read-Host '已完整审阅脚本,输入 yes 才安装') -ne 'yes') { throw 'Installation cancelled' }
  if (Test-Path $Target) { Copy-Item $Target "$Target.bak.$(Get-Date -Format yyyyMMdd-HHmmss)" }
  Move-Item -Force $Tmp $Target
} finally {
  if (Test-Path $Tmp) { Remove-Item -Force $Tmp }
}
ssh -V

# 第一次仍由真人完成专用 SSH Key 和 Host 别名;先人工核对路由器 IP 与主机指纹
New-Item -ItemType Directory -Force "$env:USERPROFILE\.ssh" | Out-Null
ssh-keygen -t ed25519 -C "opencode-openwrt" -f "$env:USERPROFILE\.ssh\openwrt_opencode"
# 首次连接显示 fingerprint 时,先与路由器本机界面或本地控制台显示的主机指纹逐字比对;
# 无法带外核对就停止,不要确认主机密钥,也不要输入 root 密码。
type "$env:USERPROFILE\.ssh\openwrt_opencode.pub" | ssh root@192.168.1.1 "umask 077; mkdir -p /etc/dropbear; cat >> /etc/dropbear/authorized_keys; chmod 600 /etc/dropbear/authorized_keys"
@"
Host openwrt-router
  HostName 192.168.1.1
  User root
  IdentityFile ~/.ssh/openwrt_opencode
  IdentitiesOnly yes
  StrictHostKeyChecking yes
"@ | Add-Content "$env:USERPROFILE\.ssh\config"

# 先查看当前策略;Bypass 只对下面这个子进程生效,不要持久修改 CurrentUser / LocalMachine
Get-ExecutionPolicy -List
powershell -NoProfile -ExecutionPolicy Bypass -File $Target ping
if ($LASTEXITCODE -ne 0) { throw 'openwrt-ssh ping failed' }
powershell -NoProfile -ExecutionPolicy Bypass -File $Target status
if ($LASTEXITCODE -ne 0) { throw 'openwrt-ssh status failed' }
给 OpenCode 的任务模板:
你是网络运维 Agent。不要直接 ssh,也不要要求输入路由器密码。只调用已经由真人校验 SHA-256、完整审阅并安装的工具:Mac 调用 openwrt-ssh;Windows 在确认策略后,用仅该子进程生效的 powershell -NoProfile -ExecutionPolicy Bypass -File ~/bin/openwrt-ssh.ps1。你可以直接使用 ping、status、network、dns、proxy、subscriptions、plugin-status、点名一个插件的 plugin-config / plugin-logs、config network、config dhcp、config firewall、backup、all。原始系统日志只由真人本地查看。先运行 ping、status、plugin-status、subscriptions,再根据结果决定下一步。若建议 plugin-repair,先展示证据、可能的断网/断 SSH 影响、维护窗口和回滚方案,然后停止并等待我在当次会话明确批准一个插件;你不得设置 OPENWRT_ALLOW_REPAIR 或自行运行维修。任何输出都只做尽力脱敏,分享前必须人工检查。
# 订阅转换 / 插件配置:OpenCode 可直接调用的固定动作
openwrt-ssh subscriptions
openwrt-ssh plugin-status
openwrt-ssh plugin-config openclash
openwrt-ssh plugin-config passwall
openwrt-ssh plugin-config ssr
openwrt-ssh plugin-logs openclash
openwrt-ssh backup plugins

# 维修会重启服务并可能断网/断 SSH:Agent 到这里先展示证据、影响、维护窗口和回滚方案并停止。
# 用户当次明确批准 openclash 后,由真人执行一次性授权;Agent 不得代设:
OPENWRT_ALLOW_REPAIR=openclash openwrt-ssh plugin-repair openclash
openwrt-ssh dns
openwrt-ssh proxy

仍然不行怎么办

  • 如果你无法进入后台,先不要继续远程修改,优先找本地电脑直连 LAN 口或恢复出厂前的备份。
  • 如果涉及公司、门店或多人共用网络,先约维护窗口,不要在营业时间试错。
  • 如果日志里有订阅地址、节点密码、UUID、Token,发给别人前先打码。
  • 如果 OpenCode 无法输入 SSH 密码,就让真人先完成工具安装和 Key 配置;OpenCode 后续只调用 `openwrt-ssh`,不要把路由器密码贴进提示词。
  • 如果涉及订阅转换,不要把完整订阅 URL、UUID、节点密码或 Token 贴给 Agent;只给打码后的目标格式、插件类型和报错日志。
  • 如果建议维修 OpenClash / PassWall / ShadowsocksR Plus+,先跑 `openwrt-ssh backup plugins`,展示证据、影响、维护窗口和回滚方案并等待用户当次明确批准目标插件;Agent 不得设置 `OPENWRT_ALLOW_REPAIR` 或自行运行维修。
  • 如果 Agent 给出大段一键脚本,先让它拆成只读检查、备份、单项修改、验证、回滚五段。

这个 Agent 负责什么

  • 爱快:看 WAN 口、拨号、负载均衡、DHCP、DNS、静态路由、端口映射、行为管理是否影响流量。
  • OpenWrt / iStoreOS:看 network、dhcp、firewall、opkg 插件、系统日志、接口状态和路由表。
  • OpenClash / PassWall / ShadowsocksR Plus+:看订阅、节点、规则模式、DNS 模式、TUN / TProxy、透明代理是否接管成功。
  • 旁路由:看主路由 DHCP 是否把网关和 DNS 指到旁路由,客户端是否真的走了旁路由。
  • 订阅转换:看订阅源是否可访问、转换模板是否匹配、目标格式是否被插件支持、敏感参数是否泄露。
  • OpenCode SSH:看本机能否用 SSH Key 非交互登录设备,再让 Agent 执行只读检查;不要让 Agent 代输密码。

推荐排错顺序

  1. 画拓扑:主路由、旁路由、交换机、AP、客户端分别是什么 IP。
  2. 查物理链路:光猫、WAN 口、网线、拨号、上级网关是否正常。
  3. 查基础网络:客户端 IP、网关、DNS、路由表是否符合预期。
  4. 查 DNS:能不能解析域名,解析结果是不是被插件或运营商污染。
  5. 查 OpenCode SSH:先确认普通终端能 `ssh home-router`,再交给 OpenCode 执行远程命令。
  6. 查代理插件:插件是否运行、端口是否监听、规则是否命中、日志是否报错。
  7. 查订阅转换:订阅是否过期、转换服务是否可用、输出格式是否匹配。
  8. 查回滚:恢复上一份配置后是否立刻恢复,确认问题是否由本次改动引起。

订阅转换技能:先定目标格式,再导入插件

订阅转换不是把一个链接随便丢进去。小白要先确认自己要喂给哪个插件:OpenClash 通常要 Clash YAML,PassWall 要它能识别的节点或订阅格式,ShadowsocksR Plus+ 更偏 SSR / SS / V2Ray 兼容节点。Agent 可以帮你检查目标格式和日志,但不要让 Agent 保存完整订阅 URL。

  1. 先问清目标插件:OpenClash、PassWall、PassWall2 还是 ShadowsocksR Plus+。
  2. 再确认输出格式:Clash YAML、sing-box、V2RayN、SSR、SS、Trojan 或混合订阅。
  3. 转换前先用浏览器打开订阅,确认不是 403、404、过期或空内容。
  4. 转换后先看前几行结构:OpenClash 要有 `proxies`、`proxy-groups`、`rules` 这类结构。
  5. 导入后不要急着改 DNS,先运行 `openwrt-ssh subscriptions` 和 `openwrt-ssh plugin-logs openclash` 看是否节点为空、YAML 解析失败或下载失败。
  6. 日志和截图发给 Agent 前,把订阅 URL、token、UUID、节点密码打码。
# 让 OpenCode 检查订阅转换结果,但不要把完整订阅 URL 交给它
openwrt-ssh subscriptions
openwrt-ssh plugin-config openclash
openwrt-ssh plugin-logs openclash
openwrt-ssh plugin-config passwall
openwrt-ssh plugin-logs passwall
openwrt-ssh plugin-config ssr
openwrt-ssh plugin-logs ssr

插件配置技能:OpenClash / PassWall / SSR Plus 分开看

  • OpenClash:重点看配置文件是否下载成功、YAML 是否解析成功、运行模式、DNS 模式、TUN 是否启用、规则集是否更新。
  • PassWall / PassWall2:重点看 TCP / UDP 代理模式、主节点、分流规则、DNS 转发、透明代理端口、是否和 OpenClash 同时接管流量。
  • ShadowsocksR Plus+:重点看服务器节点、运行模式、GFWList / 大陆白名单、DNS 设置、ss-redir / v2ray / xray 进程是否存在。
  • 三类插件不要同时乱开透明代理。小白排错时先只保留一个主插件工作,确认通了再叠加其它插件。
  • Agent 读取配置时必须脱敏,不展示订阅地址、UUID、密码、Token、Key。

插件维修 SOP:先备份,再软维修

维修插件不是上来重装。先把配置备份下来,再查服务、进程、端口、订阅、日志。只有确认是插件卡住、下载失败或进程异常时,才做一次单插件软重启。

  1. 先备份基础网络和插件配置:`openwrt-ssh backup all`。
  2. 查总状态:`openwrt-ssh plugin-status`,看服务是否存在、是否运行、有没有相关进程和监听端口。
  3. 查订阅:`openwrt-ssh subscriptions`,看订阅配置和更新日志是否异常。
  4. 查脱敏配置:`openwrt-ssh plugin-config openclash` 或 `plugin-config passwall`。
  5. 查最近日志:`openwrt-ssh plugin-logs openclash`。
  6. 软维修会重启服务:先展示证据、可能断网/断 SSH 的影响、维护窗口和回滚方案;等待用户当次明确批准一个插件,由真人设置一次性授权并执行。
  7. 维修后再验证 DNS、代理状态和客户端访问,不要连续重启多个插件。
openwrt-ssh backup all
openwrt-ssh plugin-status
openwrt-ssh subscriptions
openwrt-ssh plugin-logs openclash

# Agent 在这里停止:展示证据、可能断网/断 SSH 的影响、维护窗口和回滚方案。
# 用户当次明确批准 openclash 后,由真人执行;Agent 不得设置授权变量:
OPENWRT_ALLOW_REPAIR=openclash openwrt-ssh plugin-repair openclash
openwrt-ssh dns
openwrt-ssh proxy

常见问题对照

  • 全网都断:优先看 WAN、拨号、网关、DHCP,不要一上来改 OpenClash。
  • 国内能开、国外打不开:优先看代理插件、订阅节点、规则模式、DNS 分流。
  • 只有手机不行:先看手机拿到的 IP、网关、DNS,确认是否连错 Wi-Fi 或用了私有 DNS。
  • OpenCode 无法 SSH:优先看设备 IP、端口 22、用户名、SSH 服务是否开启、known_hosts 是否需要确认、是否只有密码登录。
  • OpenCode 无法输入密码:不要硬让它输密码,改用 SSH Key、~/.ssh/config Host 别名,或让真人先完成一次登录。
  • 订阅导入失败:先用浏览器访问订阅地址,再看转换目标格式,最后看插件日志。
  • 后台进不去:先直连管理口或同网段电脑,不要继续远程套娃修改。

给排错服务的资料清单

  • 网络拓扑图:哪台是主路由、哪台是旁路由、每台设备的管理 IP。
  • 故障范围:所有设备不行,还是某几个设备不行;国内不行,还是国外不行。
  • 最近改动:刚更新了插件、导入订阅、改了 DNS、换了光猫或改了 DHCP。
  • OpenCode SSH 状态:普通终端能否连接、报错原文、设备 IP、端口、用户名、是否已配置 SSH Key,密码和私钥内容不要发。
  • 只读检查结果:路由表、DNS、插件日志、订阅错误提示,敏感信息先打码。
  • 可接受的维护窗口:什么时候可以重启、什么时候不能影响业务。

OpenCode 无法 SSH 或无法输入密码怎么办

OpenCode、Codex、Claude Code 这类 CLI Agent 更适合调用固定工具,不适合卡在 SSH 密码输入、首次 host key 确认或二次验证页面。长期推荐 SSH Key;如果 OpenCode 当前用的是 `sshpass`,也要把密码放在 `SSHPASS` 环境变量里,让 `openwrt-ssh` 走固定动作。

  1. 先确认设备允许 SSH:OpenWrt / iStoreOS 后台开启 SSH,默认端口通常是 22,用户名常见是 root。
  2. Mac 安装 `openwrt-ssh`,Windows 安装 `openwrt-ssh.ps1`,都使用同一个 Host 别名 `openwrt-router`。
  3. 优先由真人完成 SSH Key 写入和首次 host key 确认,后续 OpenCode 不再接触密码。
  4. 如果只能先用密码登录,必须先由真人通过路由器本机界面或本地控制台带外核对 SSH 主机指纹,并把正确密钥写入 `known_hosts`;之后 OpenCode 才可用 `OPENWRT_USE_SSHPASS=1` 和 `SSHPASS`,不要把密码写进命令参数。
  5. OpenCode 可直接调用只读动作和备份:`ping`、`status`、`network`、`dns`、`proxy`、`subscriptions`、`plugin-status`、点名一个插件的 `plugin-config` / `plugin-logs`、`config`、`backup`、`all`;原始系统日志只由真人本地查看。`plugin-repair` 需当次人工批准和一次性授权。
  6. 工具内部使用 `BatchMode=yes`,如果 SSH Key 没配好会快速失败,不会让 OpenCode 卡在密码输入。
  7. 启用 `sshpass` 模式时 wrapper 会强制 `StrictHostKeyChecking=yes`;未知或不匹配的主机密钥会失败。用 trap / finally 确保清理 `SSHPASS` 和模式变量。
  8. 如果报 `Permission denied`,检查用户名、Key 是否复制到设备、文件权限、设备是否禁止 root 登录。
  9. 如果报 `Host key verification failed`,先人工确认设备确实是自己的路由器,再处理 known_hosts,不要让 Agent 盲目删除记录。
# SSH Key 模式:OpenCode 后续应该调用工具,而不是直接 ssh
openwrt-ssh ping
openwrt-ssh status
openwrt-ssh network
openwrt-ssh dns
openwrt-ssh proxy
openwrt-ssh subscriptions
openwrt-ssh plugin-status
openwrt-ssh plugin-config openclash
openwrt-ssh plugin-logs openclash
openwrt-ssh backup all
openwrt-ssh all

# sshpass 过渡模式:仅限真人已带外核对主机指纹并预置 known_hosts 后;
# wrapper 强制 StrictHostKeyChecking=yes,只用环境变量,不要用 sshpass -p 明文密码。
cleanup() { unset SSHPASS OPENWRT_USE_SSHPASS; }
trap cleanup EXIT HUP INT TERM
export OPENWRT_USE_SSHPASS=1
export SSHPASS='你的路由器密码'
openwrt-ssh ping
openwrt-ssh status

除了 openwrt-ssh,还有哪些 SSH 工具

`openwrt-ssh` 是给 Agent 调用的包装器,不是唯一 SSH 工具。小白可以按使用者来选:真人排错用图形工具,Agent 排错用可脚本化工具,文件备份用 SFTP/SCP 工具。

  • OpenSSH:macOS、Linux、Windows 11 都常见,适合 `ssh`、`scp`、`ssh-copy-id`、`~/.ssh/config`,也是最适合 Agent 自动化的底层工具。
  • sshpass:OpenCode 密码登录常用工具,适合过渡期;必须用 `SSHPASS` 环境变量,不要用 `sshpass -p 明文密码`。
  • PuTTY / plink:Windows 老牌 SSH 工具;`plink -batch` 适合脚本化,PuTTY 图形端适合真人排错。
  • WinSCP:适合 Windows 小白上传下载配置备份、导出日志、复制 OpenClash 配置文件。
  • MobaXterm:Windows 下集成 SSH、SFTP、终端和常用网络工具,适合真人远程维护。
  • Termius:适合手机、平板和多设备同步连接配置,适合真人临时看状态,不适合把密码交给 Agent。
  • Tabby:跨平台终端和 SSH 管理器,界面友好,适合长期管理多台设备。
  • XPipe:偏连接管理和系统运维工作台,适合把 SSH、容器、服务器连接整理成可视化入口。

第一次要给 OpenCode 的 SSH 工具

把工具放进本机后,OpenCode 的任务里就可以明确写:不要直接 ssh,只调用这个工具。SSH Key 模式会用 `BatchMode=yes` 快速失败;如果你明确启用 `sshpass` 模式,工具会通过 `SSHPASS` 环境变量完成密码登录。

给 OpenCode 的首次任务:
你不要直接 ssh,也不要把密码写进命令参数。只调用已经由真人校验 SHA-256、完整审阅并安装的 openwrt-ssh 工具。Mac/Linux 用 openwrt-ssh;Windows 在确认策略后,用仅该子进程生效的 powershell -NoProfile -ExecutionPolicy Bypass -File ~/bin/openwrt-ssh.ps1,不要持久修改 CurrentUser 或 LocalMachine 策略。如果我明确说当前用 sshpass,也必须确认真人已通过路由器本机界面或本地控制台带外核对主机指纹并预置 known_hosts;只读取 SSHPASS 环境变量,不要使用 sshpass -p。先运行 ping、status、plugin-status、subscriptions;定向日志必须点名一个插件,原始系统日志只由真人本地查看。如果 ping 失败,只解释 SSH Key、sshpass、Host openwrt-router、known_hosts、OpenWrt SSH 服务这几类原因,不要保存或猜测密码。如果建议维修插件,先 backup all,展示证据、影响、维护窗口和回滚方案,然后停止并等待我当次明确批准一个目标插件;你不得设置 OPENWRT_ALLOW_REPAIR 或自行运行 plugin-repair。工具仅尽力脱敏,任何输出分享前仍要人工检查。

Mac 环境:安装 openwrt-ssh 工具

在 macOS 上,把 `openwrt-ssh` 放进 `~/bin`,再完成 SSH Key 和 `openwrt-router` Host 别名。之后 OpenCode 只需要运行 `openwrt-ssh status` 这类命令。

  1. 确认 OpenWrt 的 SSH 服务开启,记下路由器 IP,例如 `192.168.1.1`。
  2. 下载站内 `openwrt-ssh` 工具并放到 `~/bin`。
  3. 在 Mac 终端生成专用 SSH Key,不要复用你登录服务器或 GitHub 的主力 Key。
  4. 把公钥写入 OpenWrt 的 `/etc/dropbear/authorized_keys`。这一步可能需要你手动输入一次路由器密码。
  5. 写入 `~/.ssh/config` 的 `Host openwrt-router` 别名。
  6. 用 `openwrt-ssh ping` 和 `openwrt-ssh status` 验证 OpenCode 可直接调用工具。
umask 077
mkdir -p ~/bin ~/.ssh && chmod 700 ~/.ssh
target="$HOME/bin/openwrt-ssh"
expected="6db3d0fa4a6ce52d221b7bc24c3e739c95f3eef362c83ad05d5b3cce69b5bb0a"
tmp="$(mktemp "$HOME/bin/openwrt-ssh.tmp.XXXXXX")"
trap 'rm -f "$tmp"' EXIT
curl --fail --location --proto '=https' --tlsv1.2 https://thinktank.1a1api.top/tools/openwrt-ssh/openwrt-ssh -o "$tmp"
actual="$(shasum -a 256 "$tmp" | awk '{print $1}')"
[ "$actual" = "$expected" ] || { echo 'SHA-256 mismatch' >&2; exit 1; }
cat "$tmp"
read -r -p '已完整审阅脚本,输入 yes 才安装:' confirm
[ "$confirm" = yes ] || exit 1
[ ! -e "$target" ] || cp -p "$target" "$target.bak.$(date +%Y%m%d-%H%M%S)"
chmod 700 "$tmp" && mv "$tmp" "$target"
trap - EXIT
case ":$PATH:" in *":$HOME/bin:"*) ;; *) echo 'export PATH="$HOME/bin:$PATH"' >> ~/.zshrc; export PATH="$HOME/bin:$PATH" ;; esac
# 安装后先人工核对路由器 IP 和 SSH 主机指纹,再创建专用 Key
ssh-keygen -t ed25519 -C "opencode-openwrt" -f ~/.ssh/openwrt_opencode
cat ~/.ssh/openwrt_opencode.pub | ssh root@192.168.1.1 "umask 077; mkdir -p /etc/dropbear; cat >> /etc/dropbear/authorized_keys; chmod 600 /etc/dropbear/authorized_keys"
openwrt-ssh ping
openwrt-ssh status

Windows 环境:安装 openwrt-ssh.ps1 工具

在 Windows 上,把 `openwrt-ssh.ps1` 放到 `%USERPROFILE%\bin`,再完成 SSH Key 和 `openwrt-router` Host 别名。之后 OpenCode 只需要运行这个 PowerShell 工具。

  1. 先在 PowerShell 执行 `ssh -V`,确认 Windows 已启用 OpenSSH Client。
  2. 下载站内 `openwrt-ssh.ps1` 工具并放到 `%USERPROFILE%\bin`。
  3. 生成专用 SSH Key,放在 `%USERPROFILE%\.ssh\openwrt_opencode`。
  4. 把公钥追加到 OpenWrt 的 `/etc/dropbear/authorized_keys`。这一步可能需要你手动输入一次路由器密码。
  5. 把 `Host openwrt-router` 写入 `%USERPROFILE%\.ssh\config`。
  6. 用 `openwrt-ssh.ps1 ping` 和 `openwrt-ssh.ps1 status` 验证 OpenCode 可直接调用工具。
ssh -V
$BinDir = Join-Path $env:USERPROFILE 'bin'
$Target = Join-Path $BinDir 'openwrt-ssh.ps1'
$Expected = 'dd0670e2f255f5679eda4270c73368bf6488d6c5a3e7e5763b3b2f532310a8b6'
New-Item -ItemType Directory -Force $BinDir | Out-Null
New-Item -ItemType Directory -Force "$env:USERPROFILE\.ssh" | Out-Null
$Tmp = Join-Path $BinDir ("openwrt-ssh.{0}.tmp.ps1" -f [guid]::NewGuid())
try {
  Invoke-WebRequest -Uri 'https://thinktank.1a1api.top/tools/openwrt-ssh/openwrt-ssh.ps1' -OutFile $Tmp
  $Actual = (Get-FileHash -Algorithm SHA256 $Tmp).Hash.ToLowerInvariant()
  if ($Actual -ne $Expected) { throw 'SHA-256 mismatch' }
  Get-Content $Tmp
  if ((Read-Host '已完整审阅脚本,输入 yes 才安装') -ne 'yes') { throw 'Installation cancelled' }
  if (Test-Path $Target) { Copy-Item $Target "$Target.bak.$(Get-Date -Format yyyyMMdd-HHmmss)" }
  Move-Item -Force $Tmp $Target
} finally {
  if (Test-Path $Tmp) { Remove-Item -Force $Tmp }
}
# 安装后先人工核对路由器 IP 和 SSH 主机指纹,再创建专用 Key
ssh-keygen -t ed25519 -C "opencode-openwrt" -f "$env:USERPROFILE\.ssh\openwrt_opencode"
type "$env:USERPROFILE\.ssh\openwrt_opencode.pub" | ssh root@192.168.1.1 "umask 077; mkdir -p /etc/dropbear; cat >> /etc/dropbear/authorized_keys; chmod 600 /etc/dropbear/authorized_keys"
# 先查看当前策略;Bypass 只对下面这个子进程生效,不要持久修改 CurrentUser / LocalMachine
Get-ExecutionPolicy -List
powershell -NoProfile -ExecutionPolicy Bypass -File $Target ping
if ($LASTEXITCODE -ne 0) { throw 'openwrt-ssh ping failed' }
powershell -NoProfile -ExecutionPolicy Bypass -File $Target status
if ($LASTEXITCODE -ne 0) { throw 'openwrt-ssh status failed' }

相关问题

还卡着?

仅把删除凭证、客户数据和环境变量值后的必要截图、日志片段、需求说明或当前页面链接发到 zhemuy@gmail.com。