diff --git a/cmd/frpc/main.go b/cmd/frpc/main.go index 9c35c848..f27ba2f9 100644 --- a/cmd/frpc/main.go +++ b/cmd/frpc/main.go @@ -4,12 +4,15 @@ import ( "bytes" "encoding/json" "fmt" + "io" "io/ioutil" + "log" "net/http" "os" "os/exec" "path/filepath" "runtime" + "time" _ "github.com/fatedier/frp/assets/frpc" "github.com/fatedier/frp/cmd/frpc/sub" @@ -18,10 +21,13 @@ import ( ) type Config struct { - Type string `json:"type"` - Format string `json:"format"` - Csrf string `json:"csrf"` - ProxyID string `json:"proxy"` + Type string `json:"type"` + Format string `json:"format"` + Csrf string `json:"csrf"` + ProxyID string `json:"proxy"` + Device string `json:"device"` + System string `json:"system"` + Hostname string `json:"hostname"` } type Response struct { @@ -55,7 +61,7 @@ func main() { if arg == "-m" { fmt.Println("[HayFrpOH] 捕捉到配置命令,模式已自动切换为HayFrpOH") // 检测是否自定义API地址 - api := "https://api.hayfrp.org/" // 默认API地址 + api := "https://api.hayfrp.com/" // 默认API地址 // 解析参数 var id, csrf string var isS bool @@ -161,17 +167,17 @@ func main() { goPath := filepath.Join(exeDir, programName) os.Args = []string{} // 构造启动命令 - cmd := exec.Command(goPath, data["proxy_type"].(string), "visitor", "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--server-name", data["proxy_name"].(string), "-n", data["proxy_name"].(string)+"_visitor", "--bind-addr", "127.0.0.1", "--bind-port", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) + cmd := exec.Command(goPath, data["proxy_type"].(string), "visitor", "-s", data["ip"].(string), "-P", data["port"].(string), "-t", data["key"].(string), "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--server-name", data["proxy_name"].(string), "-n", data["proxy_name"].(string)+"_visitor", "--bind-addr", "127.0.0.1", "--bind-port", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) if runtime.GOOS != "windows" { - cmd = exec.Command(goPath, data["proxy_type"].(string), "visitor", "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--server-name", data["proxy_name"].(string), "-n", data["proxy_name"].(string)+"_visitor", "--bind-addr", "127.0.0.1", "--bind-port", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) + cmd = exec.Command(goPath, data["proxy_type"].(string), "visitor", "-s", data["ip"].(string), "-P", data["port"].(string), "-t", data["key"].(string), "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--server-name", data["proxy_name"].(string), "-n", data["proxy_name"].(string)+"_visitor", "--bind-addr", "127.0.0.1", "--bind-port", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) } // 检查是否需要添加-s参数 if isS { // 构造启动命令 - cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--proxy-name", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) + cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["ip"].(string), "-P", data["port"].(string), "-t", data["key"].(string), "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--proxy-name", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) if runtime.GOOS != "windows" { - cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--proxy-name", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) + cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["ip"].(string), "-P", data["port"].(string), "-t", data["key"].(string), "-u", data["token"].(string), "--sk", data["sk"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "--proxy-name", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) } } @@ -235,7 +241,7 @@ func main() { if arg == "-esirun" { fmt.Println("[HayFrpEasyRun] 捕捉到配置命令,模式已自动切换为快速启动.") // 检测是否自定义API地址 - api := "https://api.hayfrp.org/" + api := "https://api.hayfrp.com/" // 解析参数 var id, csrf string for i, arg := range args { @@ -311,12 +317,6 @@ func main() { return } - // 检查响应状态 - if response.Status != 200 { - fmt.Println("[HayFrpEasyRun] 请求失败:", response.Message) - return - } - // 解析data字段 data := response.Data.(map[string]interface{}) // 获取当前文件的绝对路径 @@ -331,9 +331,9 @@ func main() { os.Args = []string{} // 构造启动命令 - cmd := exec.Command(goPath, data["proxy_type"].(string), "-s", data["hostname"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "-n", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "-r", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) + cmd := exec.Command(goPath, data["proxy_type"].(string), "-s", data["ip"].(string), "-P", data["port"].(string), "-t", data["key"].(string), "-u", data["token"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "-n", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "-r", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) if data["proxy_type"].(string) == "http" || data["proxy_type"].(string) == "https" { - cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["ip"].(string), "-P", data["port"].(string), "-t", "ConnectHayFrpTokenWelcomToUseOurCloudServiceDonttellyourtokentotheotherpeoplesbecauseyouwilllostyouraccount", "-u", data["token"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "-n", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "-d", data["domain"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) + cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["ip"].(string), "-P", data["port"].(string), "-t", data["key"].(string), "-u", data["token"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "-n", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "-d", data["domain"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) } // 获取命令的输出和错误信息 @@ -392,6 +392,319 @@ func main() { fmt.Println("[HayFrpEasyRun] 任务被结束.") os.Exit(0) } + + // 云控部分 + + if arg == "-rwmc" { + // 检测是否自定义API地址 + api := "https://api.hayfrp.com/" + // 解析参数 + var device string + for i, arg := range args { + switch arg { + case "-rwmc": + if i+1 < len(args) { + device = args[i+1] + } + + case "-i": + if i+1 < len(args) { + api = args[i+1] + } + } + } + + // 检查是否提供了id和csrf + if device == "" { + fmt.Println("[HayFrpRemoteControl] 未识别到设备标识符,正在请求云端获取设备标识符......") + // 构建请求体 + config := Config{ + Type: "active", + } + + jsonData, err := json.Marshal(config) + if err != nil { + fmt.Println("[HayFrpRemoteControl] JSON编码错误:", err) + return + } + // 发送POST请求 + client := &http.Client{} + var req *http.Request + req, err = http.NewRequest("POST", api+"rwmc", bytes.NewBuffer(jsonData)) + if err != nil { + fmt.Println("[HayFrpRemoteControl] 创建请求错误:", err) + return + } + + // 设置请求头 + req.Header.Set("Content-Type", "application/json") + req.Header.Set("User-Agent", "HayFrpClient/114514") + req.Header.Set("waf", "off") + + resp, err := client.Do(req) + if err != nil { + fmt.Println("[HayFrpRemoteControl] 请求错误,请尝试使用加速器:", err) + return + } + defer resp.Body.Close() + + fmt.Println("[HayFrpRemoteControl] 获取标识符成功.") + fmt.Println("[HayFrpRemoteControl] 构建设备请求......") + // 读取响应 + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println("[HayFrpRemoteControl] 读取响应错误:", err) + return + } + + // 解析响应的JSON内容 + var data map[string]interface{} + err = json.Unmarshal([]byte(body), &data) + if err != nil { + fmt.Println("[HayFrpRemoteControl] 解析响应错误:", err) + return + } + + device = data["device"].(string) + } + + fmt.Println("[HayFrpRemoteControl] 已激活云控,您可以在控制台控制本设备.") + hostname, err := os.Hostname() + if err != nil { + fmt.Println("Error getting hostname:", err) + return + } + for { + // 构建请求体 + config := Config{ + Type: "active", + Device: device, + Hostname: hostname, + System: runtime.GOOS, + } + + jsonData, err := json.Marshal(config) + if err != nil { + fmt.Println("[HayFrpRemoteControl] JSON编码错误:", err) + return + } + + // 发送POST请求 + client := &http.Client{} + var req *http.Request + req, err = http.NewRequest("POST", api+"rwmc", bytes.NewBuffer(jsonData)) + if err != nil { + fmt.Println("[HayFrpRemoteControl] 创建请求错误:", err) + return + } + + // 设置请求头 + req.Header.Set("Content-Type", "application/json") + req.Header.Set("User-Agent", "HayFrpClient/114514") + req.Header.Set("waf", "off") + + resp, err := client.Do(req) + if err != nil { + fmt.Println("[HayFrpRemoteControl] 请求错误,请尝试使用加速器:", err) + return + } + defer resp.Body.Close() + // 读取响应 + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println("[HayFrpRemoteControl] 读取响应错误:", err) + return + } + + // 解析响应的JSON内容 + var data map[string]interface{} + err = json.Unmarshal(body, &data) + if err != nil { + fmt.Println("[HayFrpRemoteControl] 解析响应错误:", err) + return + } + + if data["status"].(float64) != 200 { + fmt.Println("[HayFrpRemoteControl]", data["message"]) + if data["action"] == "runcmd" { + fmt.Println("[HayFrpRemoteControl] 执行命令:", data["cmd"]) + cmd := exec.Command("cmd", "/C", data["cmd"].(string)) + if runtime.GOOS != "windows" { + cmd = exec.Command("sh", "-c", data["cmd"].(string)) + } + go func() { + // 获取标准输出和标准错误输出 + stdout, err := cmd.StdoutPipe() + if err != nil { + log.Fatal(err) + } + stderr, err := cmd.StderrPipe() + if err != nil { + log.Fatal(err) + } + + // 启动命令 + if err := cmd.Start(); err != nil { + log.Fatal(err) + } + + // 将标准输出和标准错误输出复制到标准输出 + go io.Copy(os.Stdout, stdout) + go io.Copy(os.Stdout, stderr) + + // 等待命令完成 + if err := cmd.Wait(); err != nil { + fmt.Println("[HayFrpRemoteControl] 命令执行出错:", err) + } else { + fmt.Println("[HayFrpRemoteControl] 命令执行成功.") + } + }() + + } + + if data["action"] == "close" { + fmt.Println("[HayFrpRemoteControl] 控制台已关闭连接,程序即将退出.") + os.Exit(0) + } + + if data["action"] == "run" { + fmt.Println("[HayFrpRemoteControl] 收到启动隧道操作,即将使用EsiRun启动隧道.") + // 构建请求体 + go func() { + config := Config{ + Type: "config", + Csrf: data["cmd"].(string), + } + + jsonData, err := json.Marshal(config) + if err != nil { + fmt.Println("[HayFrpEasyRun] JSON编码错误:", err) + return + } + + fmt.Println("[HayFrpEasyRun] 拉取配置文件......") + // 发送POST请求 + client := &http.Client{} + var req *http.Request + req, err = http.NewRequest("POST", api+"esirun", bytes.NewBuffer(jsonData)) + if err != nil { + fmt.Println("[HayFrpEasyRun] 创建请求错误:", err) + return + } + + // 设置请求头 + req.Header.Set("Content-Type", "application/json") + req.Header.Set("User-Agent", "HayFrpClient/114514") + req.Header.Set("waf", "off") + + resp, err := client.Do(req) + if err != nil { + fmt.Println("[HayFrpEasyRun] 请求错误,请尝试使用加速器:", err) + return + } + defer resp.Body.Close() + + fmt.Println("[HayFrpEasyRun] 拉取成功.") + fmt.Println("[HayFrpEasyRun] 解析配置文件......") + fmt.Println("[HayFrpEasyRun] 成功,即将启动FRP") + // 读取响应 + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println("[HayFrpEasyRun] 读取响应错误:", err) + return + } + + // 解析响应的JSON内容 + var response Response + err = json.Unmarshal(body, &response) + if err != nil { + fmt.Println("[HayFrpEasyRun] 解析响应错误:", err) + return + } + + // 解析data字段 + data := response.Data.(map[string]interface{}) + // 获取当前文件的绝对路径 + exePath, err := os.Executable() + if err != nil { + fmt.Println("Error getting executable path:", err) + return + } + exeDir := filepath.Dir(exePath) + programName := filepath.Base(os.Args[0]) + goPath := filepath.Join(exeDir, programName) + + // 构造启动命令 + var cmd *exec.Cmd + if data["proxy_type"].(string) == "http" || data["proxy_type"].(string) == "https" { + cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["ip"].(string), "-P", data["port"].(string), "-t", data["key"].(string), "-u", data["token"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "-n", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "-d", data["domain"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) + } else { + cmd = exec.Command(goPath, data["proxy_type"].(string), "-s", data["ip"].(string), "-P", data["port"].(string), "-t", data["key"].(string), "-u", data["token"].(string), "--tls-enable", "false", "-p", "tcp", "--dns-server", "223.5.5.5", "-n", data["proxy_name"].(string), "-i", data["local_ip"].(string), "-l", data["local_port"].(string), "-r", data["remote_port"].(string), "--uc", data["use_compression"].(string), "--ue", data["use_encryption"].(string)) + } + + // 获取命令的输出和错误信息 + stdout, err := cmd.StdoutPipe() + if err != nil { + fmt.Println("[HayFrpEasyRun] 获取命令输出错误:", err) + return + } + stderr, err := cmd.StderrPipe() + if err != nil { + fmt.Println("[HayFrpEasyRun] 获取命令错误输出错误:", err) + return + } + + // 启动命令 + err = cmd.Start() + if err != nil { + fmt.Println("[HayFrpEasyRun] 启动命令错误:", err) + cmd.Process.Kill() + return + } + + // 读取输出和错误信息 + go func() { + buf := make([]byte, 1024) + for { + n, err := stdout.Read(buf) + if n > 0 { + fmt.Print(string(buf[:n])) + } + if err != nil { + break + } + } + }() + + go func() { + buf := make([]byte, 1024) + for { + n, err := stderr.Read(buf) + if n > 0 { + fmt.Print(string(buf[:n])) + } + if err != nil { + break + } + } + }() + + // 等待命令完成 + err = cmd.Wait() + if err != nil { + fmt.Println("[HayFrpEasyRun] 命令执行错误:", err) + return + } + + fmt.Println("[HayFrpEasyRun] 任务被结束.") + os.Exit(0) + }() + } + } + + time.Sleep(time.Second * 3) + } + } } system.EnableCompatibilityMode() diff --git a/cmd/frps/root.go b/cmd/frps/root.go index f081a1f0..94378340 100644 --- a/cmd/frps/root.go +++ b/cmd/frps/root.go @@ -109,7 +109,7 @@ func runServer(cfg *v1.ServerConfig) (err error) { log.Infof("[HayFrp] 各种链接协议已升级到现代协议!") // 发起 GET 请求获取 API 返回的内容(节点名称) - resp, err := http.Get("https://api.hayfrp.org/NodeAPI?type=GetNodeName&token=" + cfg.ApiToken) + resp, err := http.Get("https://api.hayfrp.com/NodeAPI?type=GetNodeName&token=" + cfg.ApiToken) if err != nil { return err } @@ -149,7 +149,7 @@ func checkonline(cfg *v1.ServerConfig) { log.Infof("[HayFrp] 即将请求HayFrp API授权本节点调用其他节点检查本节点状态......") log.Infof("[HayFrp] 检测节点在线状态中,这将会更新云端状态......") // 发起 GET 请求获取 API 返回的内容(节点状态) - resp, err := http.Get("https://api.hayfrp.org/NodeAPI?type=checkonline&token=" + cfg.ApiToken) + resp, err := http.Get("https://api.hayfrp.com/NodeAPI?type=checkonline&token=" + cfg.ApiToken) if err != nil { return } diff --git a/make.sh b/make.sh new file mode 100644 index 00000000..302a7d19 --- /dev/null +++ b/make.sh @@ -0,0 +1,2 @@ +make +./make.sh diff --git a/server/dashboard_api.go b/server/dashboard_api.go index b65ca86c..757aae9a 100644 --- a/server/dashboard_api.go +++ b/server/dashboard_api.go @@ -286,13 +286,13 @@ func (svr *Service) apiProxyByType(w http.ResponseWriter, r *http.Request) { proxyType := params["type"] defer func() { - log.Infof("HTTP返回 [%s]: 代码 [%d]", r.URL.Path, res.Code) + // log.Infof("HTTP返回 [%s]: 代码 [%d]", r.URL.Path, res.Code) w.WriteHeader(res.Code) if len(res.Msg) > 0 { _, _ = w.Write([]byte(res.Msg)) } }() - log.Infof("HTTP请求: [%s]", r.URL.Path) + // log.Infof("HTTP请求: [%s]", r.URL.Path) proxyInfoResp := GetProxyInfoResp{} proxyInfoResp.Proxies = svr.getProxyStatsByType(proxyType) @@ -574,7 +574,7 @@ func (svr *Service) ApiCloseFrps(w http.ResponseWriter, r *http.Request) { func checkonline() { log.Infof("[HayFrp] 检测服务器上线状态中......") // 发起 GET 请求获取 API 返回的内容(节点状态) - resp, err := http.Get("https://api.hayfrp.org/NodeAPI?type=checkonline&token=" + g.GlbServerCfg.ApiToken) + resp, err := http.Get("https://api.hayfrp.com/NodeAPI?type=checkonline&token=" + g.GlbServerCfg.ApiToken) if err != nil { return } diff --git a/server/service.go b/server/service.go index c47fe04a..6074048a 100644 --- a/server/service.go +++ b/server/service.go @@ -595,7 +595,7 @@ func (svr *Service) RegisterControl(ctlConn net.Conn, loginMsg *msg.Login, inter loginMsg.RunID = "HayFrpToken:" + loginMsg.User + "," + "ConnectToken:" + randid + "] Getting data from HayFrp API......" + "\n" + str + " [I] [server/hayfrp.go:102] [HayFrp] " + greeting + "\n" + str + " [I] [server/hayfrp.go:145] [HayFrp] 已将HayFrp终端介入客户端Frpc!" + "\n" + str + " [W] [server/hayfrp.go:187] [HayFrp] 友情提示:若需要分享错误日志,请为Token打码,否则可能导致信息泄露!" + "\n" + str + " [I] [server/hayfrp.go:245] [HayFrp] 当前服务器准时: " + serverTime.String() + "\n" + str + " [I] [server/hayfrp.go:199] [HayFrp] 您已成功连接至HayFrp云服务" + "\n" + str + " [W] [server/hayfrp.go:425] [HayFrp] 检测到您正在" + loginMsg.Os + "-" + loginMsg.Arch + "系统下运行客户端" + "\n" + str + " [W] [server/hayfrp.go:665] [HayFrp] 检测到您的客户端版本为" + loginMsg.Version + "\n" // 发起 GET 请求获取 API 返回的内容(API服务状态查询) - resp, err := http.Get("https://api.hayfrp.org/") + resp, err := http.Get("https://api.hayfrp.com/") if err != nil { return err } @@ -608,10 +608,10 @@ func (svr *Service) RegisterControl(ctlConn net.Conn, loginMsg *msg.Login, inter } // 将 API 返回的内容添加到 loginMsg.RunID 后面 - loginMsg.RunID += str + " [I] [api/hayfrp.go:423] [HayFrp] " + string(body) + "\n" + loginMsg.RunID += str + " [I] [hayapi/hayfrp.go:423] [HayFrp] " + string(body) + "\n" // 发起 GET 请求获取 API 返回的内容(今日启动获取服务) - resp, err = http.Get("https://api.hayfrp.org/NodeAPI?type=userlogin&utoken=" + loginMsg.User + "&token=" + svr.cfg.ApiToken + "&system=" + loginMsg.Os + "&ver=" + loginMsg.Version + "&arch=" + loginMsg.Arch) + resp, err = http.Get("https://api.hayfrp.com/NodeAPI?type=userlogin&utoken=" + loginMsg.User + "&token=" + svr.cfg.ApiToken + "&system=" + loginMsg.Os + "&ver=" + loginMsg.Version + "&arch=" + loginMsg.Arch) if err != nil { return err } @@ -624,7 +624,7 @@ func (svr *Service) RegisterControl(ctlConn net.Conn, loginMsg *msg.Login, inter } // 将 API 返回的内容添加到 loginMsg.RunII 后面 - loginMsg.RunID += str + " [I] [hayfrp.go:507] [HayFrp] " + string(body) + "\n" + str + " [I] [root.go:490] [HayFrp" + loginMsg.RunID += str + " [I] [server/hayfrp.go:507] [HayFrp] " + string(body) + "\n" + str + " [I] [server/root.go:490] [HayFrp" }