Selaa lähdekoodia

1, 优化修改sshd客户端代码, 使得Ctrl+C中断按键更加丝滑; 2, 新增sshd客户端打包脚本; 3, 重命名项目代码脚本名称

niujiuru 1 viikko sitten
vanhempi
commit
5fa6208fd9

+ 1 - 3
Makefile

@@ -135,14 +135,12 @@ yfkj_ssh_client.out : ./sshd/client/client.go
 	$(GO) mod tidy
 	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 $@
 
 # 综合应用测试程序
 LIBS := -Wl,-Bstatic -L./swapi -lswapi -L./hk_takephoto -lhk_takephoto -L./dh_takephoto -ldh_takephoto -L./air720u -lair720u -L./air530z -lair530z -L./ec200u -lec200u
@@ -168,4 +166,4 @@ clean :
 	make -C ./air530z clean
 	make -C ./ec200u  clean
 	make -C ./ymodem  clean
-	rm -rf ./*.a ./*.out ./build
+	rm -rf ./*.a ./*.out ./*.exe ./build

+ 1 - 0
package/armv7hf.sh

@@ -13,6 +13,7 @@ pkg_dir="${cur_dir}/${pkgname}"
 pkg_tar="${cur_dir}/${pkgname}_${ver_num}.tar.gz"
 
 rm -rf "${pkg_dir}" "${pkg_tar}"
+mkdir -p "${pkg_dir}"
 
 echo "1, Creating config directory and copying config files..."
 mkdir -p "${pkg_dir}/config"

+ 35 - 0
package/build_yfkj_ssh_client.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+# 2026-01-29 14:12 created by niujiuru
+
+set -e
+set -o pipefail
+
+ver_num="1.0.0.1"
+cur_dir="$(pwd)"
+pre_dir="$(dirname "$cur_dir")"
+
+pkgname="yfkj_ssh_client"
+pkg_dir="${cur_dir}/${pkgname}"
+pkg_tar="${cur_dir}/${pkgname}_${ver_num}.tar.gz"
+
+rm -rf "${pkg_dir}" "${pkg_tar}"
+mkdir -p "${pkg_dir}"
+
+echo "1, Building ${pkgname}..."
+cd ${pre_dir}
+make -C "${pre_dir}" clean
+make -C "${pre_dir}" yfkj_ssh_client.out yfkj_ssh_client.exe
+cd ${cur_dir}
+cp -rf "${pre_dir}/sshd/client/config.ini" "${pkg_dir}"
+cp -rf "${pre_dir}/yfkj_ssh_client.out" "${pkg_dir}"
+cp -rf "${pre_dir}/yfkj_ssh_client.exe" "${pkg_dir}"
+make -C "${pre_dir}" clean
+
+echo "2, Packaging into ${pkg_tar}..."
+tar -czvf "${pkg_tar}" -C "${cur_dir}" "${pkg_dir##*/}"
+
+# 清理临时目录
+rm -rf "${pkg_dir}"
+
+echo "✅ Package build completed successfully: ${pkg_tar}"
+exit 0

BIN
package/rtu_linux_modules_1.0.0.1.tar.gz


BIN
package/yfkj_ssh_client_v1.0.0.1.tar.gz


+ 16 - 11
sshd/client/client.go

@@ -59,14 +59,15 @@ func main() {
 
 	ctx, cancel := context.WithCancel(context.Background())
 	coupler = &MQTTCoupler{
-		ctx:      ctx,
-		cancel:   cancel,
-		broker:   CfgServers.MQTTSrv.Address,
-		username: CfgServers.MQTTSrv.Username,
-		password: CfgServers.MQTTSrv.Password,
-		clientID: uuid.New().String(),
-		imei:     devIMEI,
-		cwd:      "/",
+		ctx:         ctx,
+		cancel:      cancel,
+		broker:      CfgServers.MQTTSrv.Address,
+		username:    CfgServers.MQTTSrv.Username,
+		password:    CfgServers.MQTTSrv.Password,
+		clientID:    uuid.New().String(),
+		imei:        devIMEI,
+		cwd:         "/",
+		interrupted: make(chan struct{}, 1),
 	}
 
 	id, err := machineid.ID()
@@ -96,7 +97,7 @@ func term(pingState *atomic.Bool) {
 	var executing atomic.Bool   // 是否有正在执行中的命令
 	var interrupted atomic.Bool // 用户是否按键取消了命令
 
-	interruptLoop(&executing, &interrupted) // Ctrl+C卍
+	interruptLoop(pingState, &executing, &interrupted) // Ctrl+C卍
 
 	printWelcome(pingState)
 
@@ -224,13 +225,17 @@ func help() {
 	fmt.Println(h)
 }
 
-func interruptLoop(executing *atomic.Bool, interrupted *atomic.Bool) {
+func interruptLoop(pingState, executing, interrupted *atomic.Bool) {
 	sigCh := make(chan os.Signal, 1)
 	signal.Notify(sigCh, syscall.SIGINT)
 	go func() {
 		for range sigCh {
 			interrupted.Store(true)
-			if executing.Load() {
+			if executing.Load() && pingState.Load() {
+				select {
+				case coupler.interrupted <- struct{}{}:
+				default:
+				}
 				_, _ = coupler.stop()
 			}
 		}

+ 6 - 3
sshd/client/coupler.go

@@ -11,7 +11,6 @@ import (
 
 	mqtt "github.com/eclipse/paho.mqtt.golang"
 	"hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
-	"hnyfkj.com.cn/rtu/linux/utils/shell"
 )
 
 const (
@@ -40,6 +39,8 @@ type MQTTCoupler struct {
 	cmdMu     sync.Mutex                      // 串行执行的锁
 	pending   map[int]chan *jsonrpc2.Response // 等待命令结果
 	pendingMu sync.Mutex                      // 等待结果的锁
+
+	interrupted chan struct{} // Ctrl+C 通知当前命令取消的信号
 }
 
 func (c *MQTTCoupler) init2() error {
@@ -170,8 +171,8 @@ func (c *MQTTCoupler) doCmd(method string, params any, id ...int) (*jsonrpc2.Res
 
 	var timer *time.Timer
 	var timeout <-chan time.Time
-	if c.needTimeoutEnd(method) {
-		timer = time.NewTimer(shell.DefaultTimeout)
+	if c.isCtrlCommand(method) {
+		timer = time.NewTimer(3 * time.Second)
 		timeout = timer.C
 		defer timer.Stop()
 	}
@@ -183,6 +184,8 @@ func (c *MQTTCoupler) doCmd(method string, params any, id ...int) (*jsonrpc2.Res
 		return resp, nil
 	case <-timeout:
 		return zero, fmt.Errorf("command timeout")
+	case <-c.interrupted:
+		return zero, fmt.Errorf("command interrupted by user")
 	}
 }
 

+ 10 - 10
sshd/client/invoker.go

@@ -15,7 +15,7 @@ var (
 	rpc_quit = "executor.close"
 )
 
-// 串行执行
+// 是否串行执行
 func (c *MQTTCoupler) needSerialize(method string) bool {
 	switch method {
 	case rpc_ping, rpc_stop:
@@ -27,19 +27,19 @@ func (c *MQTTCoupler) needSerialize(method string) bool {
 	}
 }
 
-// 超时结束
-func (c *MQTTCoupler) needTimeoutEnd(method string) bool {
+// 是否控制指令
+func (c *MQTTCoupler) isCtrlCommand(method string) bool {
 	switch method {
-	case rpc_exec:
-		return false
 	case rpc_ping, rpc_stop, rpc_quit:
 		return true
+	case rpc_exec:
+		return false
 	default:
-		return true
+		return false
 	}
 }
 
-// 心跳检测
+// 一次心跳检测
 func (c *MQTTCoupler) ping() (*jsonrpc2.Response, error) {
 	params := struct {
 		ClientID string `json:"client_id"`
@@ -50,7 +50,7 @@ func (c *MQTTCoupler) ping() (*jsonrpc2.Response, error) {
 	return c.doCmd(rpc_ping, params)
 }
 
-// 执行命令
+// 执行一条命令
 func (c *MQTTCoupler) exec(
 	cmd string) (*shell.ExecuteResult, error) {
 	params := struct {
@@ -88,7 +88,7 @@ func (c *MQTTCoupler) exec(
 	return &exrs, nil
 }
 
-// 中断执行
+// 中断当前执行
 func (c *MQTTCoupler) stop() (*jsonrpc2.Response, error) {
 	params := struct {
 		ClientID string `json:"client_id"`
@@ -99,7 +99,7 @@ func (c *MQTTCoupler) stop() (*jsonrpc2.Response, error) {
 	return c.doCmd(rpc_stop, params)
 }
 
-// 关闭退出
+// 关闭退出终端
 func (c *MQTTCoupler) quit() (*jsonrpc2.Response, error) {
 	params := struct {
 		ClientID string `json:"client_id"`