dryrun 的 ssh 探测适配强制命令,并分清指纹与认证两种失败

采集机那侧的 authorized_keys 用了强制命令,把这把 key 锁成只能跑 tail,
拿不到 shell。副作用是任何请求都变成 tail -F 而它永不返回,原先
`ssh <host> 'echo ok'` 的探测会永久挂住——ConnectTimeout 只管建连,不管
命令时长。改成照 ship_signals 的真实用法读流:tail -c +0 先吐出整个文件,
数行数就等于对端总线条数,之后由 timeout 收掉。

失败诊断原先一律说"装 key",但 Host key verification failed 是 known_hosts
空的,装 key 修不了,会把人引到错方向。现在分三类:指纹未确认、认证被拒、
其他,各给对应做法。指纹那条明确不建议 StrictHostKeyChecking=no——这条链路
上跑的是下单信号。

install.sh 的第 2 步补上 known_hosts:原先只说装 key,而服务跑起来会撞同一
个墙(BatchMode=yes 不允许交互确认)。

实测:强制命令下故意请求错路径,仍拿到真总线内容且 stderr 干净。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jack
2026-08-28 18:01:01 +08:00
co-authored by Cursor
parent b6ed5c8b50
commit d884de2c36
2 changed files with 42 additions and 12 deletions
+10 -2
View File
@@ -182,10 +182,18 @@ echo " BITGET_API_KEY / SECRET / PASSPHRASE 用只读+交易权限,"
echo " **不要开提币权限**。SHIP_FROM 填采集机的 ssh 目标。"
echo
fi
echo " 2. 装拉总线用的 ssh key,并确认能连上采集机"
echo " 2. 装拉总线用的 ssh key"
echo " sudo -u $USER_NAME ssh-keygen -t ed25519 -N '' -f $STATE/home/.ssh/id_ed25519"
echo " # 把 $STATE/home/.ssh/id_ed25519.pub 加到采集机的 authorized_keys"
echo " sudo -u $USER_NAME ssh -o BatchMode=yes <采集机> 'echo ok'"
echo
echo " 还要写 known_hosts,否则报 Host key verification failed —— 服务跑"
echo " 起来会撞同一个墙,因为 BatchMode=yes 不允许交互确认:"
echo " sudo -u $USER_NAME ssh-keyscan -t ed25519 <采集机IP> \\"
echo " | sudo -u $USER_NAME tee -a $STATE/home/.ssh/known_hosts"
echo " ssh-keygen -lf $STATE/home/.ssh/known_hosts"
echo " # 把指纹跟采集机上 ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub"
echo " # 的输出比一遍。**不要**图省事用 StrictHostKeyChecking=no"
echo " # 那等于放弃中间人防护,而这条链路上跑的是下单信号"
echo
echo " 3. 空跑验全链(不下真单,跑够看到一次心跳再停):"
echo " sudo $APP/live/deploy/dryrun.sh"