From a1faa3c9b5bc5c5c2e1a93142dd73156b53a22e7 Mon Sep 17 00:00:00 2001 From: wuko233 Date: Wed, 8 Apr 2026 15:22:04 +0800 Subject: [PATCH] =?UTF-8?q?[cmd]=20=E8=AE=BE=E7=BD=AE=E4=B8=8D=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=8C=89=E9=94=AE=E4=B8=BAESC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/safe/safe.go | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/cmd/safe/safe.go b/cmd/safe/safe.go index 24974d2..f6f9547 100644 --- a/cmd/safe/safe.go +++ b/cmd/safe/safe.go @@ -13,6 +13,7 @@ import ( "github.com/spf13/cobra" "go.uber.org/zap" + "golang.org/x/term" ) var SafeCmd = &cobra.Command{ @@ -30,6 +31,25 @@ var SafeCmd = &cobra.Command{ }, } +func readKeyWithESC() (string, error) { + oldState, err := term.MakeRaw(int(os.Stdin.Fd())) + if err != nil { + return "", err + } + defer term.Restore(int(os.Stdin.Fd()), oldState) + + b := make([]byte, 1) + _, err = os.Stdin.Read(b) + if err != nil { + return "", err + } + + if b[0] == 27 { // ESC + return "ESC", nil + } + return string(b), nil +} + func interactiveSafe(cfg *config.Config) { dataDir := cfg.Storage.DataDir @@ -55,12 +75,14 @@ func interactiveSafe(cfg *config.Config) { fmt.Println("\n请选择操作:") fmt.Println("[1] 将以上可疑文件全部确认为安全 (移至白名单)") // Todo: 支持逐个确认 - fmt.Println("[2] 退出不处理") - fmt.Print("请输入选项 (1-2): ") + fmt.Println("[ESC] 退出不处理") + fmt.Print("请输入选项: ") - reader := bufio.NewReader(os.Stdin) - input, _ := reader.ReadString('\n') - input = strings.TrimSpace(input) + input, err := readKeyWithESC() + if err != nil { + fmt.Printf("读取输入失败: %v\n", err) + return + } switch input { case "1": @@ -70,7 +92,7 @@ func interactiveSafe(cfg *config.Config) { } else { fmt.Println("已将可疑文件移入白名单。") } - case "2": + case "ESC": fmt.Println("已取消操作。") default: fmt.Println("无效选项,已退出。")