使用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
相关产品推荐
相关产品推荐

