فهرست منبع

优化修改项目代码结构, 使得sshd的客户端为纯go编译, 以便生成linux和windows客户端

niujiuru 2 هفته پیش
والد
کامیت
5d53a9c985
7فایلهای تغییر یافته به همراه175 افزوده شده و 33 حذف شده
  1. 11 4
      Makefile
  2. 99 0
      sshd/client/args.go
  3. 24 6
      sshd/client/client.go
  4. 1 3
      sshd/client/config.go
  5. 3 20
      utils/shell/execute.go
  6. 31 0
      utils/shell/execute_types.go
  7. 6 0
      utils/shell/executor.go

+ 11 - 4
Makefile

@@ -7,7 +7,7 @@ DEFINS = -D_GNU_SOURCE
 
 GO := go
 GO_BUILD := $(GO) build
-GO_FLAGS := -ldflags "-s -w -X hnyfkj.com.cn/rtu/linux/baseapp.Version=1.0.0.1 -X hnyfkj.com.cn/rtu/linux/baseapp.BuildTime=$(shell date +%Y-%m-%dT%H:%M:%S)"
+GO_FLAGS := -ldflags "-s -w -X hnyfkj.com.cn/rtu/linux/baseapp.Version=1.0.0.1 -X hnyfkj.com.cn/rtu/linux/baseapp.BuildTime=$(shell date +%Y-%m-%dT%H:%M:%S) -X main.BuildTime=$(shell date +%Y-%m-%dT%H:%M:%S)"
 
 target ?= armv7hf
 ifeq ($(target),armv7hf)
@@ -29,7 +29,7 @@ SETGO_ENV = \
 DATE := $(shell date +%Y%m%d_%H%M%S)
 
 # 编译的目标
-all : camera_test.out hk_takephoto.out dh_takephoto.out air720u_4g.out rtu_linux_modules.out yfkj_sshd.out yfkj_ssh_client.out
+all : camera_test.out hk_takephoto.out dh_takephoto.out air720u_4g.out rtu_linux_modules.out yfkj_sshd.out yfkj_ssh_client.out yfkj_ssh_client.exe
 
 # 通用基础库
 libswapi.a :
@@ -130,10 +130,17 @@ yfkj_sshd.out       : libswapi.a libair530z.a ./sshd/server/server.go
 	$(SETGO_ENV) CGO_LDFLAGS="$(LIB6)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./sshd/server/*.go
 	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)
 
-yfkj_ssh_client.out : libswapi.a libair530z.a ./sshd/client/client.go
+yfkj_ssh_client.out : ./sshd/client/client.go
 	mkdir -p ./build
 	$(GO) mod tidy
-	$(SETGO_ENV) CGO_LDFLAGS="$(LIB6)" $(GO_BUILD) $(GO_FLAGS) -o $@ ./sshd/client/*.go
+	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 $(GO_BUILD) $(GO_FLAGS) -o $@ ./sshd/client/*.go
+	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)
+	rm -rf $@
+
+yfkj_ssh_client.exe : ./sshd/client/client.go
+	mkdir -p ./build
+	$(GO) mod tidy
+	GOOS=windows GOARCH=amd64 CGO_ENABLED=0 $(GO_BUILD) $(GO_FLAGS) -o $@ ./sshd/client/*.go
 	@cp $@ ./build/$(basename $@)_$(DATE)$(suffix $@)
 	rm -rf $@
 

+ 99 - 0
sshd/client/args.go

@@ -0,0 +1,99 @@
+// Author: NiuJiuRu
+// Email: niujiuru@qq.com
+
+package main
+
+import (
+	"os"
+	"strconv"
+	"strings"
+)
+
+// 解析命令行参数os.Args参数到map, 以'-'开头的视为key, 后面跟着的为value
+var os_args_param map[string]string = make(map[string]string)
+
+func init() {
+	procArgsParam(os.Args)
+}
+
+func GetArgsParamStr(p string, def string) string {
+	s, ok := os_args_param[p]
+	if ok {
+		return s
+	} else {
+		return def
+	}
+}
+
+func GetArgsParamBool(p string, def bool) bool {
+	s, ok := os_args_param[p]
+	if ok {
+		return strings.EqualFold(s, "y") || strings.EqualFold(s, "yes") || strings.EqualFold(s, "true")
+	} else {
+		return def
+	}
+}
+
+func GetArgsParamInt64(p string, def int64) int64 {
+	s, ok := os_args_param[p]
+	if ok {
+		i, e := strconv.ParseInt(s, 10, 64)
+		if e != nil {
+			return def
+		}
+		return i
+	} else {
+		return def
+	}
+}
+
+func GetArgsParamInt(p string, def int) int {
+	s, ok := os_args_param[p]
+	if ok {
+		i, e := strconv.Atoi(s)
+		if e != nil {
+			return def
+		}
+		return i
+	} else {
+		return def
+	}
+}
+
+func procArgsParam(p []string) {
+	if len(p) < 1 {
+		return
+	}
+
+	var k, v string
+	for i := 1; i < len(p); i++ {
+		if len(p[i]) < 1 {
+			continue
+		}
+
+		if p[i][0] == '-' {
+			if k != "" {
+				os_args_param[k] = v
+			}
+			k, v = p[i], ""
+		} else {
+			if k == "" {
+				continue
+			}
+			if v != "" {
+				v += " " + p[i]
+			} else {
+				v = p[i]
+			}
+		}
+	}
+
+	if k != "" {
+		os_args_param[k] = v
+	}
+}
+
+func IsArgsParam(p string) bool {
+	_, ok := os_args_param[p]
+	return ok
+}

+ 24 - 6
sshd/client/client.go

@@ -8,7 +8,9 @@ import (
 	"fmt"
 	"io"
 	"os"
+	"os/exec"
 	"os/signal"
+	"runtime"
 	"strings"
 	"sync/atomic"
 	"syscall"
@@ -16,8 +18,6 @@ import (
 
 	"github.com/google/uuid"
 	"github.com/peterh/liner"
-
-	"hnyfkj.com.cn/rtu/linux/baseapp"
 )
 
 const MODULE_NAME = "YFKJ_SSH_CLIENT"
@@ -25,22 +25,23 @@ const MODULE_NAME = "YFKJ_SSH_CLIENT"
 var (
 	coupler               *MQTTCoupler
 	Version               = "1.0.0.1"
+	BuildTime             = "unknown"
 	ErrBrokerAddressEmpty = errors.New("mqtt server address is empty")
 	ErrIMEINotAvailable   = errors.New("device imei is not available")
 )
 
 func main() {
-	if baseapp.IsArgsParam("-h") {
+	if IsArgsParam("-h") {
 		help()
 		return
 	}
 
-	if baseapp.IsArgsParam("-v") {
-		fmt.Println("程序版本:", Version, "\n构建时间:", baseapp.BuildTime)
+	if IsArgsParam("-v") {
+		fmt.Println("程序版本:", Version, "\n构建时间:", BuildTime)
 		return
 	}
 
-	devIMEI := baseapp.GetArgsParamStr("-c", "")
+	devIMEI := GetArgsParamStr("-c", "")
 	if devIMEI == "" {
 		help()
 		return
@@ -170,6 +171,11 @@ func term(pingState *atomic.Bool) {
 			break
 		}
 
+		if input == "clear" {
+			clearScreen()
+			continue
+		}
+
 		executing.Store(true)
 		result, err := coupler.exec(input)
 		executing.Store(false)
@@ -256,3 +262,15 @@ func printWelcome() {
 `
 	fmt.Println(welcome)
 }
+
+func clearScreen() {
+	if runtime.GOOS == "windows" {
+		cmd := exec.Command("cmd", "/c", "cls")
+		cmd.Stdout = os.Stdout
+		_ = cmd.Run()
+	} else {
+		cmd := exec.Command("clear")
+		cmd.Stdout = os.Stdout
+		_ = cmd.Run()
+	}
+}

+ 1 - 3
sshd/client/config.go

@@ -2,10 +2,8 @@ package main
 
 import (
 	"fmt"
-	"path/filepath"
 
 	"gopkg.in/ini.v1"
-	"hnyfkj.com.cn/rtu/linux/baseapp"
 )
 
 type MQTTBroker struct {
@@ -29,7 +27,7 @@ var (
 )
 
 func loadAppConfig() error {
-	cfgFile := filepath.Join(baseapp.EXEC_DIR, "config.ini")
+	cfgFile := "./config.ini"
 	cfgIni, err := ini.Load(cfgFile)
 	if err != nil {
 		return err

+ 3 - 20
utils/shell/execute.go

@@ -1,3 +1,6 @@
+//go:build !windows
+// +build !windows
+
 // Author: NiuJiuRu
 // Email: niujiuru@qq.com
 
@@ -6,7 +9,6 @@ package shell
 import (
 	"bytes"
 	"context"
-	"errors"
 	"fmt"
 	"io"
 	"os/exec"
@@ -17,7 +19,6 @@ import (
 )
 
 const (
-	DefaultTimeout    = 5 * time.Second
 	gracePeriod       = 2 * time.Second
 	forceKillWait     = 2 * time.Second
 	exitTimeoutCode   = 124
@@ -25,24 +26,6 @@ const (
 	checkProcessDelay = 50 * time.Millisecond
 )
 
-var (
-	ErrInvalidCommand      = errors.New("invalid command")
-	ErrExecutorLostControl = errors.New("executor lost control of process")
-)
-
-type ExecuteParams struct {
-	Cmd     string `json:"cmd"`               // 命令
-	Timeout int    `json:"timeout,omitempty"` // 超时(秒)
-	Dir     string `json:"-"`                 // 工作目录
-}
-
-type ExecuteResult struct {
-	Stdout   string `json:"stdout"`    ///////// 标准输出
-	Stderr   string `json:"stderr"`    ///////// 错误输出
-	ExitCode int    `json:"exit_code"` ///////// 退出状态码: 0表示成功, 非0表示失败
-	Cwd      string `json:"cwd"`       ///////// 当前目录
-}
-
 type limitedBuffer struct {
 	buf   *bytes.Buffer
 	limit int

+ 31 - 0
utils/shell/execute_types.go

@@ -0,0 +1,31 @@
+// Author: NiuJiuRu
+// Email: niujiuru@qq.com
+
+package shell
+
+import (
+	"errors"
+	"time"
+)
+
+const (
+	DefaultTimeout = 5 * time.Second
+)
+
+var (
+	ErrInvalidCommand      = errors.New("invalid command")
+	ErrExecutorLostControl = errors.New("executor lost control of process")
+)
+
+type ExecuteParams struct {
+	Cmd     string `json:"cmd"`               // 命令
+	Timeout int    `json:"timeout,omitempty"` // 超时(秒)
+	Dir     string `json:"-"`                 // 工作目录
+}
+
+type ExecuteResult struct {
+	Stdout   string `json:"stdout"`    ///////// 标准输出
+	Stderr   string `json:"stderr"`    ///////// 错误输出
+	ExitCode int    `json:"exit_code"` ///////// 退出状态码: 0表示成功, 非0表示失败
+	Cwd      string `json:"cwd"`       ///////// 当前目录
+}

+ 6 - 0
utils/shell/executor.go

@@ -1,3 +1,9 @@
+//go:build !windows
+// +build !windows
+
+// Author: NiuJiuRu
+// Email: niujiuru@qq.com
+
 package shell
 
 import (