#!/bin/bash # ============================================================================ # go.sh —— 企业微信「手机 <-> 云端」双向值守服务 一键安装(自包含,无需外网装包) # # 生成时间:2026-09-27 16:08:15 # 版本:1.0.0 # # 自带两道自校: # 第 1 道:内嵌 base64 文本的 md5 # 第 2 道:解码后 tar.gz 的 md5 # 任一道不符 -> 打印【失败】并退出,绝不带病安装。 # # 用法(腾讯云 OrcaTerm 网页终端里粘这一行): # curl -fsSL https://<域名>/.txt | sudo bash # ============================================================================ EXPECT_B64_MD5="db80c0627df5fd9a1323ad0e20576e27" EXPECT_TAR_MD5="8d4be8c273ecd40ab31a7eb5710f17fa" WORK=/tmp/qywatch_install_$$ B64F="$WORK/pkg.b64" TGZF="$WORK/pkg.tar.gz" DEST=/opt/qywatch echo "==============================================" echo " 企业微信云端双向值守 · 一键安装" echo " 生成时间:2026-09-27 16:08:15" 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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 D44A8AAA 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 "【成功】第二道校验通过(压缩包完整:15846 字节)" # ---------- 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