#!/bin/bash # ============================================================================ # go.sh —— 企业微信「手机 <-> 云端」双向值守服务 一键安装(自包含,无需外网装包) # # 生成时间:2026-09-27 16:14:58 # 版本:1.0.0 # # 自带两道自校: # 第 1 道:内嵌 base64 文本的 md5 # 第 2 道:解码后 tar.gz 的 md5 # 任一道不符 -> 打印【失败】并退出,绝不带病安装。 # # 用法(腾讯云 OrcaTerm 网页终端里粘这一行): # curl -fsSL https://<域名>/.txt | sudo bash # ============================================================================ EXPECT_B64_MD5="f8bcc16ee25b0c960188c5ed16e9018c" EXPECT_TAR_MD5="2e625b0ae0bfc63d18009cbbb8c8a9ab" WORK=/tmp/qywatch_install_$$ B64F="$WORK/pkg.b64" TGZF="$WORK/pkg.tar.gz" DEST=/opt/qywatch echo "==============================================" echo " 企业微信云端双向值守 · 一键安装" echo " 生成时间:2026-09-27 16:14:58" echo "==============================================" # ---------- 0. 前置检查 ---------- if [ "$(id -u)" != "0" ]; then echo "【失败】请用 sudo 运行:curl -fsSL ... | sudo bash" exit 1 fi for c in python3 base64 tar md5sum systemctl; do if ! command -v "$c" >/dev/null 2>&1; then echo "【失败】系统缺少必需命令:$c" exit 1 fi done echo "【信息】前置检查通过:python3/base64/tar/md5sum/systemctl 齐全" PYVER=$(python3 -c 'import sys;print("%d.%d"%sys.version_info[:2])') echo "【信息】Python 版本:$PYVER" PMIN=$(python3 -c 'import sys;print(1 if sys.version_info>=(3,6) else 0)') if [ "$PMIN" != "1" ]; then echo "【失败】Python 版本过低(需 3.6 以上),实际 $PYVER" exit 1 fi mkdir -p "$WORK" # ---------- 1. 释放内嵌安装包 ---------- cat > "$B64F" <<'QYWATCH_PKG_EOF' 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 U0J3epaqOsiUuazWiK7KLjm9ybnttdi3vRb7ttdUc9uL2vmfJI0mmSNVX9QmoRO7se9eUZWa8B6KqDUWG5LIIn+Ti/xhG/mbPMgvJ1eleWKcvlK+BN8vYSjG Sxf4BZT5xfXrV9aXYTLeYGbHCV88l08fiZMY5zrA8cWZ8pNi2cXNPAGwBaKbEXQUZYCe3hOmCLo7MVQA+YSPgxgQSQ61cg2QXHl8QMvLEdp5ez1SY73K2zEe ZMVWgjXfKwRQAmQXULnbZHtn54FOtuJYRoP3iDXyCtx1DHTlQf9biaDy1ltHOTqUfqnjAM+8RHJ45ZuTSOfTV6zEmDBHmjabRE2bTqImNomaPaQ5O03dIl1z jbltH0l4yzrpM8NksKrec7Yp4LPlbnGDkiaN/XyL6IJOtuw+Kec09jkHY+E5zu8io+FDqFJ9dHhjfmwKeqquzos4QV71g865IR2Ryctjdrq0PGU8XjXOXKVd k5AsLd5i2bAlRtjswQglB1fPUr/eQ868HqFSzCaeX4Y/pusdaMBen3uON08pExn9ZrRBtPCiSID6gZc7uCSIX1t9tWIjSZfG0AGbtWMmK4aiJ3l4GgJIQiS7 hxPKD4I4xSPTpI9kc6ChsEwxupTyy4wMEjG7Us+VNXbd7HuzuxPiDJR1MOCrEwGz8XBgKwrC1mfrs/XZ+mx9tj5bn63P1mfrs/XZ+mx9tj5bn63P1mfrs/XZ +mx9tj5bn63P1mfrs/XZ+vzP//w/mn1xVwDwAAA= QYWATCH_PKG_EOF # ---------- 2. 第一道自校:内嵌文本 md5 ---------- ACTUAL_B64_MD5=$(md5sum "$B64F" | awk '{print $1}') if [ "$ACTUAL_B64_MD5" != "$EXPECT_B64_MD5" ]; then echo "【失败】安装包在传输中被改动,第一道校验不通过" echo " 期望:$EXPECT_B64_MD5" echo " 实际:$ACTUAL_B64_MD5" echo " 文件头 80 字节:$B64F" head -c 80 "$B64F" 2>/dev/null echo echo " 处理:请重新粘贴完整那一行命令,不要分段、不要手改。" rm -rf "$WORK" exit 1 fi echo "【成功】第一道校验通过(内嵌包完整未被改动)" # ---------- 3. 解码 + 第二道自校 ---------- if ! base64 -d "$B64F" > "$TGZF" 2>/dev/null; then echo "【失败】base64 解码失败,安装包已损坏" rm -rf "$WORK" exit 1 fi ACTUAL_TAR_MD5=$(md5sum "$TGZF" | awk '{print $1}') if [ "$ACTUAL_TAR_MD5" != "$EXPECT_TAR_MD5" ]; then echo "【失败】解码后的压缩包校验不通过" echo " 期望:$EXPECT_TAR_MD5" echo " 实际:$ACTUAL_TAR_MD5" rm -rf "$WORK" exit 1 fi echo "【成功】第二道校验通过(压缩包完整:15869 字节)" # ---------- 4. 解压到 /opt/qywatch ---------- mkdir -p "$DEST/inbox" "$DEST/logs" "$DEST/state" if ! tar -xzf "$TGZF" -C "$DEST"; then echo "【失败】解压失败" rm -rf "$WORK" exit 1 fi chmod +x "$DEST/setkey" "$DEST/health.sh" "$DEST/qy_watch_server.py" \ "$DEST/setkey.py" "$DEST/selftest_offline.py" 2>/dev/null echo "【成功】程序已解压到 $DEST" # ---------- 5. 语法自检(装前先确认代码没坏) ---------- if python3 -m py_compile "$DEST/qy_watch_server.py" "$DEST/setkey.py" 2>/dev/null; then echo "【成功】主程序语法检查通过" else echo "【失败】主程序语法检查不通过" rm -rf "$WORK" exit 1 fi # ---------- 6. 离线自检(不联网、不碰凭据,纯逻辑跑一遍) ---------- if (cd "$DEST" && python3 selftest_offline.py > "$WORK/selftest.out" 2>&1); then echo "【成功】离线自检通过:$(tail -n 1 "$WORK/selftest.out")" else echo "【失败】离线自检未通过,输出如下:" tail -n 30 "$WORK/selftest.out" rm -rf "$WORK" exit 1 fi # ---------- 7. 凭据文件 ---------- if [ ! -f "$DEST/.env" ]; then cp "$DEST/qy_watch.env.example" "$DEST/.env" fi # (未内嵌凭据:保持模板占位,稍后用 setkey 填写) chmod 600 "$DEST/.env" chown root:root "$DEST/.env" 2>/dev/null echo "【成功】两串字符的存放文件已就位:$DEST/.env(权限 600)" # ---------- 8. 装服务(开机自启 + 崩溃自动重启) ---------- cp "$DEST/qywatch.service" /etc/systemd/system/qywatch.service systemctl daemon-reload systemctl enable qywatch >/dev/null 2>&1 systemctl restart qywatch echo "【成功】服务已安装并设置为开机自启、崩溃自动重启" # ---------- 9. 体检 ---------- sleep 4 echo echo "---------------- 体检 ----------------" STATE=$(systemctl is-active qywatch 2>&1) echo "服务状态:$STATE" echo "--- 最近运行记录 ---" tail -n 15 "$DEST/logs/qywatch.log" 2>/dev/null echo "--- 收到消息存放目录 ---" ls -l "$DEST/inbox" 2>/dev/null echo "--------------------------------------" rm -rf "$WORK" if [ "$STATE" = "active" ]; then echo "【成功】程序安装完成,服务已在跑" echo "【待办】还差最后一步:把机器人那两串字符填进去才能连通,命令是:" echo " sudo /opt/qywatch/setkey <机器人ID> <长连接密钥>" echo " 填完会自动重启;再用 sudo /opt/qywatch/health.sh 看体检" else echo "【失败】服务未处于运行状态($STATE),请看上面运行记录定位原因" exit 1 fi