Skip to content

Commit 36182e4

Browse files
committed
客户端更新
1 parent 65528fb commit 36182e4

File tree

17 files changed

+379
-17
lines changed

17 files changed

+379
-17
lines changed

README.md

+13
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,19 @@ https://natnps.com/
2828

2929

3030
## 更新日志
31+
- 2025-01-07 v0.26.21
32+
新增:
33+
- 客户端列表页面新增【快捷启动命令】,此命令为连接地址+链接秘钥的base64编码,方便一键启动、一键安装客户端。
34+
35+
优化:
36+
- 修改vkey生成方式,由16位缩短至10位,截取uuid前10位,避免重复。
37+
- 优化客户端启动方式,当npc文件目录下无配置文件时,可直接双击运行客户端,输入命令完成启动、安装、卸载客户端,直接启动和安装服务时需要输入【快捷启动命令】,卸载服务、启动服务、停止服务时,只需输入隧道秘钥【vkey】即可。
38+
![image](image/new/cmd.png)
39+
40+
41+
**注意**
42+
强烈推荐使用无配置文件模式启动客户端,所有数据应该在服务端保存和配置,而客户端只做连接转发。客户端配置文件对小白极不友好,配置繁琐,容易出错。
43+
3144
- 2024-11-07 v0.26.20
3245
新增:
3346
- 客户端增加创建时间

build.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#/bash/sh
2-
export VERSION=0.26.20
2+
export VERSION=0.26.21
33
export GOPROXY=direct
44

55
sudo apt-get update

cmd/npc/npc.go

+264-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

33
import (
4+
"bufio"
5+
"ehang.io/nps/lib/crypt"
46
"flag"
57
"fmt"
68
"os"
@@ -18,6 +20,7 @@ import (
1820
"ehang.io/nps/lib/version"
1921
"github.com/astaxie/beego/logs"
2022
"github.com/ccding/go-stun/stun"
23+
"github.com/fatih/color"
2124
"github.com/kardianos/service"
2225
)
2326

@@ -252,6 +255,266 @@ func run() {
252255
if *configPath == "" {
253256
*configPath = common.GetConfigPath()
254257
}
255-
go client.StartFromFile(*configPath)
258+
259+
// 判断路径下是否有配置文件
260+
if common.FileExists(*configPath) {
261+
logs.Info("配置文件模式启动")
262+
go client.StartFromFile(*configPath)
263+
} else {
264+
// 无配置文件模式双击运行
265+
printSlogan()
266+
inputCmd()
267+
}
268+
}
269+
}
270+
271+
func printSlogan() {
272+
green := color.New(color.FgGreen).SprintFunc()
273+
// 第一次输入,如果输入 1,2,3,4 则需要输入秘钥,否则
274+
275+
fmt.Printf("%s", green(""))
276+
277+
fmt.Printf("\033[32;0m###########################################################\n")
278+
fmt.Printf("\033[32;0m# \033[31mNPS内网穿透客户端\033[0m #\n")
279+
fmt.Printf("\033[32;0m# #\n")
280+
fmt.Printf("\033[32;0m#\033[32m 地址:\033[31;0mhttps://github.com/yisier/nps\033[0m #\n")
281+
fmt.Printf("\033[32;0m#\033[32m 提示:\033[32;0m1、涉及到系统服务的需要以管理员身份运行\033[0m\033[32;0m #\n")
282+
fmt.Printf("\033[32;0m#\033[32m \033[32;0m2、直接启动或[注册系统服务]需要使用[快捷启动命令]\033[0m\033[32;0m #\n")
283+
fmt.Printf("\033[32;0m#\033[32m \033[32;0m3、其他命令如卸载/启动/停止只需要输入[vkey]\033[0m\033[32;0m #\n")
284+
fmt.Printf("\033[32;0m###########################################################\n")
285+
fmt.Printf("\033[0m") // 重置颜色
286+
287+
fmt.Printf("\n")
288+
289+
fmt.Printf("\u001B[32m输入[1]\u001B[0m - 注册系统服务\n")
290+
fmt.Printf("\u001B[32m输入[2]\u001B[0m - 卸载系统服务\n")
291+
fmt.Printf("---------------------\n")
292+
fmt.Printf("\u001B[32m输入[3]\u001B[0m - 启动系统服务\n")
293+
fmt.Printf("\u001B[32m输入[4]\u001B[0m - 停止系统服务\n")
294+
fmt.Printf("---------------------\n")
295+
fmt.Printf("\u001B[32m输入[0]\u001B[0m - 退出\n")
296+
fmt.Printf("---------------------\n")
297+
fmt.Printf("直接输入[快捷启动命令]则是启动隧道,多个[快捷启动命令]用英文逗号拼接\n")
298+
fmt.Printf("\n")
299+
}
300+
301+
func inputCmd() {
302+
303+
var flag string
304+
fmt.Printf("请输入:")
305+
306+
stdin := bufio.NewReader(os.Stdin)
307+
_, err := fmt.Fscanln(stdin, &flag)
308+
if err != nil {
309+
fmt.Println("输入有误")
310+
} else {
311+
if flag == "0" {
312+
os.Exit(0)
313+
}
314+
315+
flag := strings.Replace(flag, " ", "", -1)
316+
317+
// 如果输入不等于 1,2,3,4,则启动隧道
318+
if flag != "1" && flag != "2" && flag != "3" && flag != "4" {
319+
320+
vkeys := strings.Split(flag, `,`)
321+
var cmdArray []string
322+
323+
for _, key := range vkeys {
324+
startCmd, err := crypt.Base64Decoding(key)
325+
if err != nil {
326+
fmt.Println("快捷启动命令解析失败")
327+
inputCmd()
328+
return
329+
}
330+
331+
cmdArray = append(cmdArray, startCmd)
332+
}
333+
334+
for _, item := range cmdArray {
335+
startNpcServer(item)
336+
}
337+
338+
} else {
339+
systemService(flag)
340+
}
341+
}
342+
}
343+
344+
func startNpcServer(startCmd string) {
345+
var serAddr string
346+
var vkey string
347+
array := strings.Fields(startCmd)
348+
serAddr = array[0]
349+
vkey = array[1]
350+
351+
go func() {
352+
for {
353+
logs.Info("start cmd:-server=" + serAddr + " -vkey=" + vkey)
354+
logs.Info("the version of client is %s, the core version of client is %s", version.VERSION, version.GetVersion())
355+
client.NewRPClient(serAddr, vkey, *connType, *proxyUrl, nil, *disconnectTime).Start()
356+
logs.Info("Client closed! It will be reconnected in five seconds")
357+
time.Sleep(time.Second * 5)
358+
}
359+
}()
360+
}
361+
362+
func systemService(flag string) {
363+
364+
if flag == "1" {
365+
fmt.Printf("请输入[快捷启动命令],多个[快捷启动命令]用英文逗号拼接:")
366+
} else {
367+
fmt.Printf("请输入[VKEY],多个[VKEY]用英文逗号拼接:")
368+
}
369+
370+
var vkey string
371+
stdin := bufio.NewReader(os.Stdin)
372+
_, err := fmt.Fscanln(stdin, &vkey)
373+
374+
if err != nil {
375+
fmt.Println("输入错误,请重试")
376+
systemService(flag)
377+
return
378+
} else {
379+
if vkey == "0" {
380+
os.Exit(0)
381+
}
382+
}
383+
384+
vkey = strings.Replace(vkey, " ", "", -1)
385+
386+
vkeys := strings.Split(vkey, `,`)
387+
388+
if flag == "1" {
389+
var cmdArray []string
390+
for _, key := range vkeys {
391+
startCmd, err := crypt.Base64Decoding(key)
392+
if err != nil {
393+
fmt.Println("快捷启动命令解析失败")
394+
systemService(flag)
395+
return
396+
}
397+
cmdArray = append(cmdArray, startCmd)
398+
}
399+
400+
for _, item := range cmdArray {
401+
array := strings.Fields(item)
402+
systemPro(flag, array[0], array[1])
403+
}
404+
} else {
405+
for _, key := range vkeys {
406+
systemPro(flag, "", key)
407+
}
408+
409+
}
410+
411+
inputCmd()
412+
return
413+
}
414+
415+
func systemPro(flag string, serAddr string, vkey string) {
416+
// init service
417+
prg := &npc{
418+
exit: make(chan struct{}),
419+
}
420+
options := make(service.KeyValue)
421+
svcConfig := &service.Config{
422+
Name: "nps-client-" + vkey,
423+
DisplayName: "nps-client-" + vkey,
424+
Description: "NPS内网穿透客户端,支持tcp、udp流量转发,支持内网http代理,地址:https://github.com/yisier/nps",
425+
Option: options,
426+
}
427+
s, _ := service.New(prg, svcConfig)
428+
429+
switch flag {
430+
case "1":
431+
svcConfig.Arguments = append(svcConfig.Arguments, "-server="+serAddr)
432+
svcConfig.Arguments = append(svcConfig.Arguments, "-vkey="+vkey)
433+
svcConfig.Arguments = append(svcConfig.Arguments, "-debug=false")
434+
install.InstallNpc()
435+
err := service.Control(s, "install")
436+
if err != nil {
437+
fmt.Println("隧道["+vkey+"]安装到系统服务失败", err)
438+
return
439+
} else {
440+
fmt.Println("隧道[" + vkey + "]已经安装到系统")
441+
}
442+
if service.Platform() == "unix-systemv" {
443+
logs.Info("unix-systemv service")
444+
confPath := "/etc/init.d/" + svcConfig.Name
445+
os.Symlink(confPath, "/etc/rc.d/S90"+svcConfig.Name)
446+
os.Symlink(confPath, "/etc/rc.d/K02"+svcConfig.Name)
447+
}
448+
449+
err2 := service.Control(s, "start")
450+
if err2 != nil {
451+
fmt.Println("隧道["+vkey+"]启动服务失败", err2)
452+
} else {
453+
fmt.Println("隧道[" + vkey + "]服务已启动")
454+
}
455+
456+
return
457+
case "2":
458+
// 卸载系统服务
459+
err := service.Control(s, "stop")
460+
if err != nil {
461+
fmt.Println("隧道["+vkey+"]服务停止失败", err)
462+
} else {
463+
fmt.Println("隧道[" + vkey + "]服务已停止")
464+
}
465+
466+
err = service.Control(s, "uninstall")
467+
if err != nil {
468+
fmt.Println("隧道["+vkey+"]服务卸载失败", err)
469+
}
470+
if service.Platform() == "unix-systemv" {
471+
fmt.Println("unix-systemv service")
472+
os.Remove("/etc/rc.d/S90" + svcConfig.Name)
473+
os.Remove("/etc/rc.d/K02" + svcConfig.Name)
474+
}
475+
476+
if err == nil {
477+
fmt.Println("隧道[" + vkey + "]服务已卸载成功")
478+
}
479+
480+
return
481+
482+
case "3":
483+
//启动系统服务
484+
if service.Platform() == "unix-systemv" {
485+
logs.Info("unix-systemv service")
486+
cmd := exec.Command("/etc/init.d/"+svcConfig.Name, "start")
487+
err := cmd.Run()
488+
if err != nil {
489+
logs.Error(err)
490+
}
491+
return
492+
}
493+
err := service.Control(s, "start")
494+
if err != nil {
495+
fmt.Println("隧道["+vkey+"]服务启动失败", err)
496+
} else {
497+
fmt.Println("隧道[" + vkey + "]服务启动成功")
498+
}
499+
500+
return
501+
case "4":
502+
if service.Platform() == "unix-systemv" {
503+
logs.Info("unix-systemv service")
504+
cmd := exec.Command("/etc/init.d/"+svcConfig.Name, "stop")
505+
err := cmd.Run()
506+
if err != nil {
507+
logs.Error(err)
508+
}
509+
return
510+
}
511+
err := service.Control(s, "stop")
512+
if err != nil {
513+
fmt.Println("隧道["+vkey+"]服务停止失败", err)
514+
} else {
515+
fmt.Println("隧道[" + vkey + "]服务停止成功")
516+
}
517+
518+
return
256519
}
257520
}

conf/clients.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
{"Cnf":{"U":"","P":"","Compress":false,"Crypt":false},"Id":2,"VerifyKey":"a82kjhdyllqnlruk","Addr":"127.0.0.1","Remark":"","Status":true,"IsConnect":false,"RateLimit":0,"Flow":{"ExportFlow":551,"InletFlow":551,"FlowLimit":0},"Rate":{"NowRate":0},"NoStore":false,"NoDisplay":false,"MaxConn":0,"NowConn":0,"WebUserName":"","WebPassword":"","ConfigConnAllow":true,"MaxTunnelNum":0,"Version":"0.26.19","BlackIpList":[""],"LastOnlineTime":"2024-05-28 15:08:39"}
1+
{"Cnf":{"U":"","P":"","Compress":false,"Crypt":false},"Id":34,"VerifyKey":"a1efa114df","Addr":"127.0.0.1","Remark":"","Status":true,"IsConnect":false,"RateLimit":0,"Flow":{"ExportFlow":0,"InletFlow":0,"FlowLimit":0},"Rate":{"NowRate":0},"NoStore":false,"NoDisplay":false,"MaxConn":0,"NowConn":0,"WebUserName":"","WebPassword":"","ConfigConnAllow":true,"MaxTunnelNum":0,"Version":"0.26.20","BlackIpList":[""],"CreateTime":"2025-01-03 17:07:37","LastOnlineTime":"2025-01-07 11:12:00"}
22
*#*

conf/hosts.json

-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
{"Id":1,"Host":"test.test.pp2pdf.com","HeaderChange":"","HostChange":"","Location":"/","Remark":"","Scheme":"all","CertFilePath":"-----BEGIN CERTIFICATE-----\r\nMIIGADCCBOigAwIBAgIQC0shW9rSx8iw/8ZZiE2w3TANBgkqhkiG9w0BAQsFADBu\r\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\nd3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg\r\nRFYgVExTIENBIC0gRzIwHhcNMjQwNTI4MDAwMDAwWhcNMjQwODI2MjM1OTU5WjAf\r\nMR0wGwYDVQQDExR0ZXN0LnRlc3QucHAycGRmLmNvbTCCASIwDQYJKoZIhvcNAQEB\r\nBQADggEPADCCAQoCggEBALjLe8gKybQuTd8B07mx1VPq+DkZ4Am3VVi4dBozi/47\r\nu/8uP35hpDi5evCfR5dm6z3KgyE1NLfd8HwFKFPoD6CRqMkj0Idtr89rsvufzGSx\r\nD1M91Tm0Im/jFGxFfCq8UymrQ9oMy+faBZ7fWsIwtYDJrk3qDoQ9kUyIJi7A2g8b\r\neWMNNW80lSn06Tgbhpc3HL9YGBUMihlKy1Tw3lcqfh9ua3AyJof/CEzMC/9Q7X38\r\nrdQjnWpsk3+mfmWvb82X4fqdcYUY3UPvI3vEdIDug96T9mcVxO7WhfhPXJat/99I\r\npIHlGwtsbSNCGRwitg9jvq1a8DPVBl8WMXFpX7it7S8CAwEAAaOCAucwggLjMB8G\r\nA1UdIwQYMBaAFHjfkZBf7t6s9sV169VMVVPvJEq2MB0GA1UdDgQWBBS11bj+JIYy\r\n9pGI0b6OMwsUI3IwTzAfBgNVHREEGDAWghR0ZXN0LnRlc3QucHAycGRmLmNvbTA+\r\nBgNVHSAENzA1MDMGBmeBDAECATApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRp\r\nZ2ljZXJ0LmNvbS9DUFMwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF\r\nBwMBBggrBgEFBQcDAjCBgAYIKwYBBQUHAQEEdDByMCQGCCsGAQUFBzABhhhodHRw\r\nOi8vb2NzcC5kaWdpY2VydC5jb20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRz\r\nLmRpZ2ljZXJ0LmNvbS9FbmNyeXB0aW9uRXZlcnl3aGVyZURWVExTQ0EtRzIuY3J0\r\nMAwGA1UdEwEB/wQCMAAwggF+BgorBgEEAdZ5AgQCBIIBbgSCAWoBaAB3AHb/iD8K\r\ntvuVUcJhzPWHujS0pM27KdxoQgqf5mdMWjp0AAABj72xAXEAAAQDAEgwRgIhAIwF\r\nnyFmHkP26yxDyRuia6iVV/HH7n0PQoixiMQTyzXWAiEAiSOrrfuCbw7u+GZ9rMRV\r\nCRAH1zIQuulDUkO9Ob9AeWAAdgBIsONr2qZHNA/lagL6nTDrHFIBy1bdLIHZu7+r\r\nOdiEcwAAAY+9sQFnAAAEAwBHMEUCIHNMxGqlB5lNAtF52V3oJTEcuhzroQHHpvMB\r\nUJomOKCGAiEA8jYJg2cjePys7LZhAcZ1qOcpML1JHi1Dg7EW8y3l4hwAdQDatr9r\r\nP7W2Ip+bwrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAY+9sQFiAAAEAwBGMEQCIEqR\r\nR3SALmhmand0/20AozuPWPWDc/pvWhjABljN0dalAiBcoHTZZZgA1YMUEAmxC3tv\r\nfCkB0t9191fmFpIJ/e/zBDANBgkqhkiG9w0BAQsFAAOCAQEAHr7FK816dKlzAV+2\r\nH+J4rfXYl/9hudEz5T5yDP/8MIf13ThQqUQQ5QyoOZSdBFjLqxnqTRrxQJ32puGc\r\nVzpqzwR7l3J+46XHN9C8winqzgd7ZNpBz5e82cW7AOp5nYzogO3AGyVQjEZab2Nc\r\nNs0CZJ5RjyMMGYqO0xVNAO4nMmG9sMd4tuIzz1dYb7BrjNbhwqSnXguKZ/XnHkn8\r\n150FEy62kF292o9VFpDVnObbR4haIyUweA6gz+8/ccShbs58ToNnIZgSTsjGUmnf\r\nd/NF3HlT7T1I0f47IKg8ZV7GYiBczpDJszk2pp49K+Fgu8gSMzzMxwrVkcLCRGD0\r\nF0mqVA==\r\n-----END CERTIFICATE-----\r\n-----BEGIN CERTIFICATE-----\r\nMIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh\r\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\nMjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT\r\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\r\nb20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH\r\nMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE\r\neSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv\r\nNhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch\r\nQisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn\r\nNYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP\r\nha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI\r\nlfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf\r\nBgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw\r\nHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C\r\nAQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp\r\nY2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu\r\nY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG\r\n/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT\r\nMAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ\r\nL0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi\r\n98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe\r\nxNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN\r\nGfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2\r\nn2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg==\r\n-----END CERTIFICATE-----\r\n","KeyFilePath":"-----BEGIN RSA PRIVATE KEY-----\r\nMIIEpAIBAAKCAQEAuMt7yArJtC5N3wHTubHVU+r4ORngCbdVWLh0GjOL/ju7/y4/\r\nfmGkOLl68J9Hl2brPcqDITU0t93wfAUoU+gPoJGoySPQh22vz2uy+5/MZLEPUz3V\r\nObQib+MUbEV8KrxTKatD2gzL59oFnt9awjC1gMmuTeoOhD2RTIgmLsDaDxt5Yw01\r\nbzSVKfTpOBuGlzccv1gYFQyKGUrLVPDeVyp+H25rcDImh/8ITMwL/1Dtffyt1COd\r\namyTf6Z+Za9vzZfh+p1xhRjdQ+8je8R0gO6D3pP2ZxXE7taF+E9clq3/30ikgeUb\r\nC2xtI0IZHCK2D2O+rVrwM9UGXxYxcWlfuK3tLwIDAQABAoIBADKfQ3RkSCb8vEZH\r\n+NkYtyi66G60AOSIfW/Fb8CxuDrX4EMiRzB2zQbhAKWj7He0MOMHc+6H5b4spTFE\r\nNGzv2EATRtp63igLSysWBLzbZKF8w4b5HE0nZHukCDc0vbPzTRDQItE7yivkVL/V\r\nzcX+k+oI1Z/wazOcrg36CgOqvtF+LDUSZvFfBwYWMv9s/7FyY9YrWpCb5h6hM8L4\r\nZ3OAfKZJyI4LQGM/MR2yM0reKCZvodso0lqHIDe28s5U9CAFlcxoBPFa+iEOkXcx\r\ngVrnnBrsqAYLW6qyarFUhc/gznKc/bGWQRoRDI0dJDDaFQexv5fMr00geMid9CXQ\r\nxHDIiAkCgYEA9V/IW2aKvBK5bPctrlW1JVmwQx9eEdgErDCEHf4GuJnepcrAWxM4\r\nRlezTQmhgMTqhqgslNSnKwp+Pfs5UlMSznt9+XwAFKPw5iek0gP56gDER0oNA0Ol\r\nM7/K0sMAbijEQWRnqvNhHy999zyC5EblFE/XfWMLGHUuQJB7afY79MUCgYEAwMwe\r\nc2XDjVtuogD2Eh1JmEACBtb9El0W6tJm7XAc0zbJRLb43lB2q98BFvQufY4NoOwE\r\nEtjMSOO1WxO5fAwy1IblnQFE/s93mCaFsjI44As7JN9MsVOcIhlFrkEKCYArCHWo\r\nLYpcLOHYrQRz2/e2BD/DqEqNst0wuXvjY9z7gWMCgYEAonkozrSoWn4/f5JwEga4\r\naqHnn5pujHwwI+AAK2fgBW4FSlxlYCjq01EQ7YraAMziygUjd+0TP+Gz09C8lPFi\r\n+4wzzvW3i/M9+Pf5IAL4AWU+kkHLOgUZp5lwcHwklcyynuYf6sc64Q5uZz4PIZ57\r\n4yY29tSVLT2yQZgpz/D2pE0CgYEAmfBhP/K5OV0P8Pqjf8MyyAYTmDKAzvDVI5nr\r\n5Rnnah4MhnkyLRBCMOlWjWVa2ZVa/Gp2tjW0p15pp9cP+yQiUd+D5uDknjA5ZZsc\r\nlTPUhc9x4fcJ3WzM9c0H/iKgSQW1VoPbTMF058FMqJktiS04gBwJtY4RpgdGqFNr\r\nNIl1p9ECgYAP8frFBdcARGVDrKwgKRed3lxqMpDJKxeDjHMDgNPy2TCfUMKmbFc4\r\njHgk+AfTVJ3GzMGdkB6BV63vDsRe7yFTdGSaHNJuxYP5TWkabj22Rsc6+/aW7dYA\r\nU0eL3+sTq2fgEzfNLIRqy4m93Tru9RLUOcrLp2+AlUXpQU6tqBdkOg==\r\n-----END RSA PRIVATE KEY-----\r\n","NoStore":false,"IsClose":false,"AutoHttps":false,"Flow":{"ExportFlow":0,"InletFlow":0,"FlowLimit":0},"Client":{"Cnf":{"U":"","P":"","Compress":false,"Crypt":false},"Id":2,"VerifyKey":"a82kjhdyllqnlruk","Addr":"127.0.0.1","Remark":"","Status":true,"IsConnect":false,"RateLimit":0,"Flow":{"ExportFlow":551,"InletFlow":551,"FlowLimit":0},"Rate":{"NowRate":0},"NoStore":false,"NoDisplay":false,"MaxConn":0,"NowConn":0,"WebUserName":"","WebPassword":"","ConfigConnAllow":true,"MaxTunnelNum":0,"Version":"0.26.19","BlackIpList":[""],"LastOnlineTime":"2024-05-28 15:08:39"},"Target":{"TargetStr":"127.0.0.1:9090","TargetArr":null,"LocalProxy":false}}
2-
*#*

go.mod

+5-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ require (
77
github.com/astaxie/beego v1.12.0
88
github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c
99
github.com/ccding/go-stun v0.0.0-20180726100737-be486d185f3d
10+
github.com/fatih/color v1.18.0
1011
github.com/golang/snappy v0.0.3
12+
github.com/google/uuid v1.6.0
1113
github.com/kardianos/service v1.2.0
1214
github.com/panjf2000/ants/v2 v2.4.2
1315
github.com/pkg/errors v0.9.1
@@ -35,7 +37,8 @@ require (
3537
github.com/klauspost/pgzip v1.2.1 // indirect
3638
github.com/klauspost/reedsolomon v1.9.12 // indirect
3739
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
38-
github.com/pires/go-proxyproto v0.7.0 // indirect
40+
github.com/mattn/go-colorable v0.1.13 // indirect
41+
github.com/mattn/go-isatty v0.0.20 // indirect
3942
github.com/pmezard/go-difflib v1.0.0 // indirect
4043
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
4144
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect
@@ -53,7 +56,7 @@ require (
5356
github.com/yusufpapurcu/wmi v1.2.3 // indirect
5457
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect
5558
golang.org/x/image v0.0.0-20200430140353-33d19683fad8 // indirect
56-
golang.org/x/sys v0.13.0 // indirect
59+
golang.org/x/sys v0.25.0 // indirect
5760
golang.org/x/text v0.3.3 // indirect
5861
gopkg.in/yaml.v2 v2.2.8 // indirect
5962
gopkg.in/yaml.v3 v3.0.1 // indirect

0 commit comments

Comments
 (0)