You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mysteriumnetwork/go-openvpn时CMD弹窗问题求助

OpenVPN GUI客户端启动时CMD弹窗问题及排查需求

我基于go-openvpn库开发OpenVPN GUI客户端(计划结合Fyne框架),使用桌面示例代码编译生成test.exe,仅在示例中添加了会话关闭定时器。以管理员权限运行时,会快速弹出并关闭CMD窗口3次,无法查看窗口内的错误或日志信息。

编译命令:

go build -ldflags "-w -s -H windowsgui" -o test.exe

示例代码

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "strings"
    "time"

    "github.com/mysteriumnetwork/go-openvpn/openvpn3"
)

type callbacks interface {
    openvpn3.Logger
    openvpn3.EventConsumer
    openvpn3.StatsConsumer
}

type loggingCallbacks struct {
}

func (lc *loggingCallbacks) Log(text string) {
    lines := strings.Split(text, "\n")
    for _, line := range lines {
        fmt.Println("Openvpn log >>", line)
    }
}

func (lc *loggingCallbacks) OnEvent(event openvpn3.Event) {
    fmt.Printf("Openvpn event >> %+v\n", event)
}

func (lc *loggingCallbacks) OnStats(stats openvpn3.Statistics) {
    fmt.Printf("Openvpn stats >> %+v\n", stats)
}

var _ callbacks = &loggingCallbacks{}

// StdoutLogger represents the stdout logger callback
type StdoutLogger func(text string)

// Log logs the given string to stdout logger
func (lc StdoutLogger) Log(text string) {
    lc(text)
}

func main() {

    var logger StdoutLogger = func(text string) {
        lines := strings.Split(text, "\n")
        for _, line := range lines {
            fmt.Println("Library check >>", line)
        }
    }

    openvpn3.SelfCheck(logger)

    bytes, err := ioutil.ReadFile("./client1.ovpn")
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }
    config := openvpn3.NewConfig(string(bytes))

    session := openvpn3.NewSession(config, openvpn3.UserCredentials{}, &loggingCallbacks{})
    session.Start()

    time.Sleep(20 * time.Second)
    session.Stop()
    os.Exit(0)
}

OVPN客户端配置文件

client
dev tunkj
proto tcp
nobind
remote address port
fast-io
persist-key
verb 3
script-security 3
connect-retry 3 6
connect-timeout 6
ping 5
ping-restart 20
up-delay
<auth-user-pass>
username
password
</auth-user-pass>
auth-nocache
topology subnet
<ca>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</ca>

已尝试的解决方法

  • 使用编译参数-H windowsgui试图隐藏CMD窗口,无效
  • 使用以下提权BAT脚本运行程序,仍会出现弹窗:
@echo off
:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject("Shell.Application") > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "cmd.exe", "/c ""%~s0""", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
::--------------------------------------
:: Your code goes here

"E:\code_projects\go_project\go-openvpn\examples\desktop\test.exe"

::--------------------------------------
pause >nul

需求

解决启动连接时的CMD弹窗问题,或找到记录窗口输出内容的方法以定位问题根源。


内容的提问来源于stack exchange,提问作者000 Degree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:42:15