OpenCode/OMO/DSH代理启动和更新脚本

最新

OpenCode Web Windows 固定端口代理启动

@echo off
:: 设置代码页为 UTF-8
chcp 65001 >nul

:: =========================
:: 配置区域
:: =========================

:: 你的外网代理端口
SET "PROXY_PORT=10809"

:: OpenCode 前门固定端口:浏览器永远访问这个端口
SET "OPENCODE_FRONT_PORT=41096"

:: OpenCode 后端真实端口:4096 被幽灵占用时,改这里即可
SET "OPENCODE_BACKEND_PORT=4099"

:: OpenCode 后端监听地址
:: 如果只本机用,推荐 127.0.0.1
:: 如果需要局域网访问,可以改回 0.0.0.0
SET "OPENCODE_HOST=127.0.0.1"

:: =========================
:: 局部代理环境变量
:: =========================

:: HTTP 保持直连,确保 192.168.* 局域网服务不经过代理
SET "HTTP_PROXY="
SET "HTTPS_PROXY=http://127.0.0.1:%PROXY_PORT%"
SET "NO_PROXY=localhost,127.0.0.1,::1"

:: 开启 OpenCode 实验性后台子 Agent 功能
SET "OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true"
set "OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER=1"

echo [INFO] 已设置代理端口: %PROXY_PORT%
echo [INFO] OpenCode 固定访问端口: %OPENCODE_FRONT_PORT%
echo [INFO] OpenCode 后端真实端口: %OPENCODE_BACKEND_PORT%
echo [INFO] 已启用实验性后台子 Agent。

:: =========================
:: 检查管理员权限
:: =========================

net session >nul 2>&1
if not %errorlevel% equ 0 (
    echo [ERROR] 当前脚本需要管理员权限运行。
    echo [INFO] 因为 netsh interface portproxy 需要管理员权限。
    echo.
    echo 请右键此 bat,选择“以管理员身份运行”。
    pause
    exit /b 1
)

:: =========================
:: 配置稳定前门端口转发
:: =========================

echo [INFO] 正在刷新 portproxy:
echo        127.0.0.1:%OPENCODE_FRONT_PORT% -^> 127.0.0.1:%OPENCODE_BACKEND_PORT%

netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=%OPENCODE_FRONT_PORT% >nul 2>&1

netsh interface portproxy add v4tov4 ^
    listenaddress=127.0.0.1 ^
    listenport=%OPENCODE_FRONT_PORT% ^
    connectaddress=127.0.0.1 ^
    connectport=%OPENCODE_BACKEND_PORT%

if not %errorlevel% equ 0 (
    echo [ERROR] 配置 portproxy 失败。
    pause
    exit /b 1
)

echo [INFO] 当前 portproxy:
netsh interface portproxy show v4tov4

:: =========================
:: 启动 OpenCode 后端
:: =========================

echo.
echo [INFO] 正在启动 OpenCode 后端...
echo [INFO] 后端地址: http://%OPENCODE_HOST%:%OPENCODE_BACKEND_PORT%
echo [INFO] 固定入口: http://127.0.0.1:%OPENCODE_FRONT_PORT%
echo.

start "" opencode web --port %OPENCODE_BACKEND_PORT% --hostname %OPENCODE_HOST%

if %errorlevel% equ 0 (
    echo [INFO] OpenCode 启动指令已发送。
    echo.
    echo [IMPORTANT] 请固定打开这个地址:
    echo http://127.0.0.1:%OPENCODE_FRONT_PORT%
    echo.
    echo 如果 %OPENCODE_BACKEND_PORT% 被幽灵占用:
    echo 1. 修改本脚本里的 OPENCODE_BACKEND_PORT
    echo 2. 重新运行本脚本
    echo 3. 浏览器仍然打开 http://127.0.0.1:%OPENCODE_FRONT_PORT%
) else (
    echo [ERROR] 无法启动 OpenCode。
    echo 请确认您已将 OpenCode 添加到系统的 PATH 环境变量中。
    pause
    exit /b 1
)

pause

OpenCode Web Linux 固定端口代理启动

#!/usr/bin/env bash

# =========================
# 配置区域
# =========================

# 宿主机外网代理端口(镜像模式下直接走 127.0.0.1 即可直通 Windows)
PROXY_PORT="10809"

# OpenCode 前门固定端口:浏览器永远访问这个端口
OPENCODE_FRONT_PORT="41097"

# OpenCode 后端真实端口:若被幽灵占用,改这里即可
OPENCODE_BACKEND_PORT="4198"

# OpenCode 后端监听地址
OPENCODE_HOST="127.0.0.1"

# =========================
# 镜像网络模式环境配置
# =========================

export HTTP_PROXY=""
export HTTPS_PROXY="http://127.0.0.1:${PROXY_PORT}"
export NO_PROXY="localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8"

# 开启 OpenCode 实验性参数
export OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS="true"
export OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER="1"

echo "[INFO] [镜像网络] 代理直接指向本地回环: ${HTTPS_PROXY}"
echo "[INFO] OpenCode 固定访问端口: ${OPENCODE_FRONT_PORT}"
echo "[INFO] OpenCode 后端真实端口: ${OPENCODE_BACKEND_PORT}"
echo "[INFO] 已启用实验性后台子 Agent。"

# =========================
# 检查依赖与端口转发 (socat)
# =========================

if ! command -v socat &> /dev/null; then
    echo "[WARN] 未检测到 socat,正在自动安装..."
    sudo apt update && sudo apt install -y socat
fi

# 杀掉残留的 socat 前门转发进程,防止反复重启时端口占用
fuser -k -n tcp "${OPENCODE_FRONT_PORT}" >/dev/null 2>&1 || true

echo "[INFO] 建立本地端口映射: 127.0.0.1:${OPENCODE_FRONT_PORT} -> 127.0.0.1:${OPENCODE_BACKEND_PORT}"
socat TCP-LISTEN:"${OPENCODE_FRONT_PORT}",fork,reuseaddr,bind=127.0.0.1 TCP:127.0.0.1:"${OPENCODE_BACKEND_PORT}" &
SOCAT_PID=$!

# =========================
# 退出清理机制 (Trap)
# =========================

cleanup() {
    echo ""
    echo "[INFO] 正在关闭 OpenCode 和端口映射..."
    kill "${SOCAT_PID}" >/dev/null 2>&1 || true
    kill "${OPENCODE_PID}" >/dev/null 2>&1 || true
    exit 0
}
trap cleanup SIGINT SIGTERM EXIT

# =========================
# 启动 OpenCode 后端
# =========================

echo ""
echo "[INFO] 正在启动 OpenCode 后端..."
echo "[INFO] 后端地址: http://${OPENCODE_HOST}:${OPENCODE_BACKEND_PORT}"
echo "[INFO] 固定入口: http://127.0.0.1:${OPENCODE_FRONT_PORT}"
echo ""

opencode web --port "${OPENCODE_BACKEND_PORT}" --hostname "${OPENCODE_HOST}" &
OPENCODE_PID=$!

echo "[IMPORTANT] 请在 Windows 浏览器中直接打开:"
echo "👉 http://127.0.0.1:${OPENCODE_FRONT_PORT}"
echo ""
echo "(按 Ctrl + C 可一键停止服务与映射)"

wait "${OPENCODE_PID}"

老启动

@echo off
:: 设置代码页为 UTF-8
chcp 65001 >nul

:: --- 配置区域 ---
SET "PROXY_PORT=10809"

:: --- 设置局部代理环境变量 ---
:: HTTP 保持直连,确保 192.168.* 局域网服务不经过代理
SET "HTTP_PROXY="
SET "HTTPS_PROXY=http://127.0.0.1:%PROXY_PORT%"
SET "NO_PROXY=localhost,127.0.0.1,::1"

:: 开启 OpenCode 实验性后台子 Agent 功能
SET "OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true"

echo [INFO] 已设置代理端口: %PROXY_PORT%
echo [INFO] 已启用实验性后台子 Agent (OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true)
echo [INFO] 正在尝试通过系统命令启动 OpenCode...

:: --- 直接通过命令启动 ---
:: 使用 start 启动程序,确保它在后台运行并拥有独立环境
start "" opencode web --port 4096 --hostname 0.0.0.0

if %errorlevel% equ 0 (
    echo [INFO] OpenCode 启动指令已发送。
) else (
    echo [ERROR] 无法启动 OpenCode。
    echo 请确认您已将 OpenCode 添加到系统的 PATH 环境变量中。
    pause
)

Windows 清理端口占用

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: ==============================================
:: 需要释放的端口列表(以空格分隔)
:: ==============================================
set "PORTS=41096 4096 4098 5096"

echo ==============================================
echo           Windows 端口深度清理与释放工具
echo ==============================================
echo.

:: 1. 检查管理员权限
net session >nul 2>&1
if not %errorlevel% equ 0 (
    echo [ERROR] 当前脚本需要管理员权限!
    echo [INFO] 请右键此 bat 文件,选择【以管理员身份运行】。
    echo.
    pause
    exit /b 1
)

:: 2. 清理 netsh portproxy 转发残留
echo [1/2] 正在检查并清理系统持久化的 netsh portproxy 规则...
for %%P in (%PORTS%) do (
    netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=%%P >nul 2>&1
    netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=%%P >nul 2>&1
    echo   - 已重置端口 %%P 的 portproxy 监听
)

:: 3. 杀死占用指定端口的残留应用进程
echo.
echo [2/2] 正在排查并强杀占用上述端口的残留进程...
for %%P in (%PORTS%) do (
    set "FOUND_PID="
    for /f "tokens=5" %%a in ('netstat -ano -p tcp ^| findstr /r /c:":%%P\>"') do (
        set "FOUND_PID=%%a"
        if defined FOUND_PID (
            if not "!FOUND_PID!"=="0" (
                if not "!FOUND_PID!"=="4" (
                    echo   - 发现端口 %%P 被 PID: !FOUND_PID! 占用,正在终止...
                    taskkill /F /PID !FOUND_PID! >nul 2>&1
                ) else (
                    echo   - 端口 %%P 由系统内核占用(通常为规则释放延迟),无需终止 PID 4
                )
            )
        )
    )
    if not defined FOUND_PID (
        echo   - 端口 %%P 当前未被任何进程占用
    )
)

echo.
echo ==============================================
echo [SUCCESS] 端口释放完成!当前系统中 portproxy 列表:
echo ==============================================
netsh interface portproxy show v4tov4

echo.
echo 端口已就绪,按任意键退出本窗口...
pause >nul

Linux 清理端口占用

#!/usr/bin/env bash

# ==============================================
# 需要释放的端口列表(以空格分隔)
# ==============================================
PORTS=(41096 4096 4098)

echo "=============================================="
echo "          WSL / Linux 端口释放与清理工具        "
echo "=============================================="
echo ""

# 1. 检查必要工具 (psmisc 包含 fuser)
if ! command -v fuser &> /dev/null; then
    echo "[INFO] 正在安装底层端口管理工具 psmisc..."
    sudo apt update && sudo apt install -y psmisc
fi

# 2. 遍历检查并强杀占用端口的进程
for PORT in "${PORTS[@]}"; do
    echo "[*] 检查 TCP 端口: ${PORT} ..."
    
    # 查找占用该端口的 PID 列表
    PIDS=$(fuser "${PORT}/tcp" 2>/dev/null)

    if [ -n "$PIDS" ]; then
        # 获取占用端口的具体进程名(方便确认杀掉了什么)
        PROC_NAMES=$(ps -o comm= -p $PIDS 2>/dev/null | tr '\n' ' ')
        echo "  - 发现占用进程: [${PROC_NAMES}] (PID: ${PIDS})"
        
        # 强制发送 SIGKILL (-9) 信号回收端口
        fuser -k -9 -n tcp "${PORT}" >/dev/null 2>&1
        sleep 0.5
        
        # 二次确认状态
        RECHECK=$(fuser "${PORT}/tcp" 2>/dev/null)
        if [ -z "$RECHECK" ]; then
            echo "  - 端口 ${PORT} 释放成功!"
        else
            echo "  - [WARN] 端口 ${PORT} 强杀失败,请尝试加上 sudo 运行!"
        fi
    else
        echo "  - 端口 ${PORT} 当前空闲,无进程占用。"
    fi
done

echo ""
echo "=============================================="
echo "[SUCCESS] 当前端口状态汇总:"
echo "=============================================="
# 列出目标端口当前的监听情况(若为空则说明全已释放)
ss -tulpn | grep -E "(:41096|:4096|:4098)" || echo "目标端口已全部干净释放,无任何监听占用。"
echo ""

代理启动dsh

@echo off
:: 设置代码页为 UTF-8
chcp 65001 >nul

:: --- 配置区域 ---
SET "PROXY_PORT=10809"

:: --- 设置局部代理环境变量 ---
:: HTTP 保持直连,确保 192.168.* 局域网服务不经过代理
SET "HTTP_PROXY="
SET "HTTPS_PROXY=http://127.0.0.1:%PROXY_PORT%"
SET "NO_PROXY=localhost,127.0.0.1,::1"

echo [INFO] 已设置代理端口: %PROXY_PORT%
echo [INFO] 正在尝试通过系统命令启动 DSH (DeepSeek Harness)...

:: --- 直接通过命令启动 ---
:: 使用 start 启动程序,确保它在后台运行并拥有独立环境
start "" dsh web --port 5096

if %errorlevel% equ 0 (
    echo [INFO] DSH 启动指令已发送。
) else (
    echo [ERROR] 无法启动 DSH。
    echo 请确认您已将 DSH 添加到系统的 PATH 环境变量中。
    pause
)

历史版本

更新

@echo off
:: 设置代码页为 UTF-8 以支持中文显示
chcp 65001 >nul
title 一键更新 oh-my-opencode

:: --- 配置区域 ---
SET "PROXY_PORT=10809"
SET "OPENCODE_EXE=OpenCode.exe"
:: 预设你的 OpenCode 安装路径,方便复制
SET "OPENCODE_PATH=E:\Software\OpenCode"

:: --- 设置局部网络代理 (确保顺畅连接外网拉取最新包) ---
SET "HTTP_PROXY=http://127.0.0.1:%PROXY_PORT%"
SET "HTTPS_PROXY=http://127.0.0.1:%PROXY_PORT%"
echo [INFO] 已挂载本地代理端口: %PROXY_PORT%

:: --- 第一步:强制关闭运行中的 OpenCode ---
echo [INFO] 正在检查并关闭 OpenCode 进程释放文件占用...
taskkill /f /im %OPENCODE_EXE% >nul 2>nul
:: 暂停 2 秒,给系统一点时间彻底释放文件句柄
timeout /t 2 /nobreak >nul

:: --- 第二步:执行更新安装 ---
echo.
echo ===================================================
echo [INFO] 开始拉取并安装最新版 oh-my-opencode...
echo [提示] 如果终端停住并要求你确认 OpenCode 的安装目录,
echo        请手动复制并粘贴以下路径后回车:
echo        %OPENCODE_PATH%
echo ===================================================
echo.

:: 执行带 @latest 标签的 bunx 命令跳过本地缓存
bunx oh-my-opencode@latest install

echo.
echo [INFO] 更新脚本执行完毕!
pause

启动

@echo off
:: 设置代码页为 UTF-8 以支持中文显示
chcp 65001 >nul

:: --- 配置区域 ---
SET "PROXY_PORT=10809"
:: 这里的路径已经过清理,确保没有隐藏字符
SET "EXE_PATH=E:\Software\OpenCode\OpenCode.exe"

:: --- 设置局部代理环境变量 (只对本次启动的 OpenCode 生效,不污染系统) ---
SET "HTTP_PROXY=http://127.0.0.1:%PROXY_PORT%"
SET "HTTPS_PROXY=http://127.0.0.1:%PROXY_PORT%"
SET "NO_PROXY=localhost,127.0.0.1,::1"

echo [INFO] 已设置代理端口: %PROXY_PORT%

:: --- 检查路径是否存在并启动 ---
if exist "%EXE_PATH%" (
    echo [INFO] 全局路径环境变量已生效,正在启动 OpenCode...
    :: 使用 start 启动,并在路径后添加了 --port 参数
    start "" "%EXE_PATH%" --port 23333
) else (
    echo [ERROR] 找不到程序文件,请检查路径:
    echo "%EXE_PATH%"
    pause
)