#!/bin/bash # ==================== 配置 ==================== ROOT_HOST="${CHROMIUM_MANAGER_HOST:-127.0.0.1}" ROOT_PORT="${CHROMIUM_MANAGER_PORT:-19520}" BASE_URL="http://$ROOT_HOST:$ROOT_PORT" # ==================== 颜色 ==================== GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # ==================== 帮助 ==================== show_help() { cat << EOF ${CYAN}Chromium 调试管理器${NC} 用法: ./chromium_debugging.sh <命令> [选项] ${GREEN}命令:${NC} start 启动 Chromium(带 GUI,显示在 root 桌面) stop 停止 Chromium restart 重启 Chromium status 查看 Chromium 状态 debug-url 获取 WebSocket 调试地址(给 VS Code 插件用) log 查看 Chromium 日志(默认最近 50 行) log -f 实时跟踪日志 help 显示此帮助 ${YELLOW}环境变量:${NC} CHROMIUM_MANAGER_HOST 管理服务地址(默认 127.0.0.1) CHROMIUM_MANAGER_PORT 管理服务端口(默认 19520) ${CYAN}示例:${NC} ./chromium_debugging.sh start # 启动 Chromium ./chromium_debugging.sh status # 查看状态 ./chromium_debugging.sh debug-url # 获取调试地址 EOF } # ==================== API 调用 ==================== call_api() { local ENDPOINT="$1" local RESULT local HTTP_CODE RESULT=$(curl -s -w "\n%{http_code}" -X GET "$BASE_URL$ENDPOINT" 2>/dev/null) HTTP_CODE=$(echo "$RESULT" | tail -1) RESULT=$(echo "$RESULT" | sed '$d') if [ "$HTTP_CODE" != "200" ]; then echo "{\"status\":\"error\",\"message\":\"连接管理服务失败 ($HTTP_CODE),请确认 root 上已运行 chromium-manager.sh\"}" return 1 fi echo "$RESULT" return 0 } # ==================== 命令实现 ==================== cmd_start() { echo -e "${YELLOW}🚀 请求启动 Chromium...${NC}" local RESULT=$(call_api "/start") local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null) if [ "$STATUS" = "ok" ]; then local PID=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('pid',''))" 2>/dev/null) echo -e "${GREEN}✅ Chromium 已启动 (PID: $PID)${NC}" echo -e " 调试地址: ${CYAN}http://$ROOT_HOST:9222${NC}" elif [ "$STATUS" = "error" ]; then local MSG=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('message','未知错误'))" 2>/dev/null) echo -e "${RED}❌ $MSG${NC}" else echo -e "${RED}❌ 请求失败${NC}" echo "$RESULT" fi } cmd_stop() { echo -e "${YELLOW}🛑 请求停止 Chromium...${NC}" local RESULT=$(call_api "/stop") local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null) if [ "$STATUS" = "ok" ]; then echo -e "${GREEN}✅ Chromium 已停止${NC}" else local MSG=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('message','未知错误'))" 2>/dev/null) echo -e "${YELLOW}⚠️ $MSG${NC}" fi } cmd_restart() { echo -e "${YELLOW}🔄 请求重启 Chromium...${NC}" local RESULT=$(call_api "/restart") local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null) if [ "$STATUS" = "ok" ]; then local PID=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('pid',''))" 2>/dev/null) echo -e "${GREEN}✅ Chromium 已重启 (PID: $PID)${NC}" else local MSG=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('message','未知错误'))" 2>/dev/null) echo -e "${RED}❌ $MSG${NC}" fi } cmd_status() { local RESULT=$(call_api "/status") if [ $? -ne 0 ]; then echo -e "${RED}❌ 无法连接管理服务${NC}" return 1 fi local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null) if [ "$STATUS" = "running" ]; then local PID=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('pid',''))" 2>/dev/null) echo -e "${GREEN}✅ Chromium 运行中${NC}" echo -e " PID: ${CYAN}$PID${NC}" echo -e " 调试端口: ${CYAN}$ROOT_HOST:9222${NC}" local BROWSER=$(echo "$RESULT" | python3 -c " import sys,json data = json.load(sys.stdin) info = data.get('browser_info', {}) if isinstance(info, dict): print(f\" 浏览器: {info.get('Browser', '未知')}\") ua = info.get('User-Agent', '') if ua: print(f\" 用户代理: {ua[:80]}...\") " 2>/dev/null) echo -e "$BROWSER" else echo -e "${YELLOW}⏹️ Chromium 未运行${NC}" fi } cmd_debug_url() { local RESULT=$(call_api "/status") if [ $? -ne 0 ]; then return 1; fi local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null) if [ "$STATUS" != "running" ]; then echo -e "${RED}❌ Chromium 未运行,请先执行 start${NC}" return 1 fi # 获取 WebSocket 调试地址 local WS_URL=$(curl -s "http://$ROOT_HOST:9222/json/version" 2>/dev/null | python3 -c " import sys,json try: data = json.load(sys.stdin) print(data.get('webSocketDebuggerUrl', '')) except: print('') " 2>/dev/null) local PAGE_WS=$(curl -s "http://$ROOT_HOST:9222/json" 2>/dev/null | python3 -c " import sys,json try: pages = json.load(sys.stdin) if pages: print(pages[0].get('webSocketDebuggerUrl', '')) else: print('') except: print('') " 2>/dev/null) if [ -n "$WS_URL" ]; then echo -e "${GREEN}🔗 调试地址:${NC}" echo -e " 浏览器: ${CYAN}$WS_URL${NC}" if [ -n "$PAGE_WS" ]; then echo -e " 当前页面: ${CYAN}$PAGE_WS${NC}" fi echo "" echo -e "${YELLOW}💡 VS Code 插件配置示例:${NC}" echo " {" echo " \"type\": \"chrome\"," echo " \"request\": \"attach\"," echo " \"name\": \"Attach to Chromium\"," echo " \"port\": 9222," echo " \"host\": \"$ROOT_HOST\"" echo " }" else echo -e "${RED}❌ 无法获取调试地址${NC}" fi } cmd_log() { # 先看看管理服务能不能返回日志路径 local LOG_PATH=$(curl -s "http://$ROOT_HOST:9222/json/version" 2>/dev/null | python3 -c " import sys,json print('ok') " 2>/dev/null) if [ $? -ne 0 ] || [ -z "$LOG_PATH" ]; then echo -e "${YELLOW}⚠️ 无法直接访问日志文件${NC}" echo " root 上的日志目录: ~/debug/logs/chromium/" echo " 可以在 root 上用 cat/tail 查看" return 1 fi # 通过 Chromium 的 API 简单确认它在运行 echo -e "${YELLOW}📄 日志文件在 root 上: ~/debug/logs/chromium/${NC}" echo -e " 请在 root 终端查看,或使用 ssh root@localhost 'tail -f ~/debug/logs/chromium/chromium-*.log'" } # ==================== 主入口 ==================== case "${1:-help}" in start) cmd_start ;; stop) cmd_stop ;; restart) cmd_restart ;; status) cmd_status ;; debug-url|debug_url|url) cmd_debug_url ;; log) shift cmd_log "$@" ;; help|--help|-h) show_help ;; *) echo -e "${RED}未知命令: $1${NC}" show_help exit 1 ;; esac