libf 5 months ago
parent
commit
29ce373a2c
10 changed files with 89 additions and 78 deletions
  1. 1 0
      go.mod
  2. 2 0
      go.sum
  3. 4 12
      msh/main.go
  4. 26 0
      msh/winsize_others.go
  5. 7 0
      msh/winsize_windows.go
  6. 9 9
      mssh/client.go
  7. 2 3
      mssh/config.go
  8. 1 1
      mssh/main.go
  9. 37 0
      tty/tty.go
  10. 0 53
      xsh/main.go

+ 1 - 0
go.mod

@@ -23,6 +23,7 @@ require (
 	github.com/golang/protobuf v1.5.2 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/webview/webview v0.0.0-20241127090340-83a4b4a5bbcb // indirect
 	go.etcd.io/etcd/api/v3 v3.5.8 // indirect
 	go.etcd.io/etcd/client/pkg/v3 v3.5.8 // indirect
 	go.etcd.io/etcd/client/v3 v3.5.8 // indirect

+ 2 - 0
go.sum

@@ -98,6 +98,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/webview/webview v0.0.0-20241127090340-83a4b4a5bbcb h1:dKHZEHxtVTqnp29vsFicRxuYr/heaUN8rFgY8OZVep4=
+github.com/webview/webview v0.0.0-20241127090340-83a4b4a5bbcb/go.mod h1:Zk81X+8/mp/MNoeJXXK4Noydn8pcea09e00dFfAwrxg=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=

+ 4 - 12
msh/main.go

@@ -14,7 +14,6 @@ import (
 	"reflect"
 	"regexp"
 	"strings"
-	"syscall"
 	"time"
 
 	"git.wecise.com/wecise/common/matrix/logger"
@@ -274,17 +273,10 @@ func (c *Client) Run() {
 	defer func() { _ = ptmx.Close() }() // Best effort.
 
 	// Handle pty size.
-	ch := make(chan os.Signal, 1)
-	signal.Notify(ch, syscall.SIGWINCH)
-	go func() {
-		for range ch {
-			if err := pty.InheritSize(os.Stdin, ptmx); err != nil {
-				logger.Error("error resizing pty:", err)
-			}
-		}
-	}()
-	ch <- syscall.SIGWINCH                        // Initial resize.
-	defer func() { signal.Stop(ch); close(ch) }() // Cleanup signals when done.
+	ch := HandlePTYSize(ptmx)
+	if ch != nil {
+		defer func() { signal.Stop(ch); close(ch) }() // Cleanup signals when done.
+	}
 
 	// Set stdin in raw mode.
 	oldState, err := term.MakeRaw(int(os.Stdin.Fd()))

+ 26 - 0
msh/winsize_others.go

@@ -0,0 +1,26 @@
+//go:build linux || darwin
+
+package main
+
+import (
+	"os"
+	"os/signal"
+	"syscall"
+
+	"git.wecise.com/wecise/common/matrix/logger"
+	"github.com/creack/pty"
+)
+
+func HandlePTYSize(ptmx *os.File) chan os.Signal {
+	ch := make(chan os.Signal, 1)
+	signal.Notify(ch, syscall.SIGWINCH)
+	go func() {
+		for range ch {
+			if err := pty.InheritSize(os.Stdin, ptmx); err != nil {
+				logger.Error("error resizing pty:", err)
+			}
+		}
+	}()
+	ch <- syscall.SIGWINCH // Initial resize.
+	return ch
+}

+ 7 - 0
msh/winsize_windows.go

@@ -0,0 +1,7 @@
+package main
+
+import "os"
+
+func HandlePTYSize(ptmx *os.File) chan os.Signal {
+	return nil
+}

+ 9 - 9
mssh/client.go

@@ -5,7 +5,6 @@ import (
 	"encoding/base64"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"net"
 	"os"
 	"os/user"
@@ -19,7 +18,7 @@ import (
 	"git.wecise.com/wecise/common/matrix/logger"
 	"git.wecise.com/wecise/common/matrix/util"
 	"golang.org/x/crypto/ssh"
-	"golang.org/x/crypto/ssh/terminal"
+	"golang.org/x/term"
 )
 
 var (
@@ -65,9 +64,9 @@ func genSSHConfig(node *Node) *defaultClient {
 
 	var pemBytes []byte
 	if node.KeyPath == "" {
-		pemBytes, err = ioutil.ReadFile(path.Join(u.HomeDir, ".ssh/id_rsa"))
+		pemBytes, err = os.ReadFile(path.Join(u.HomeDir, ".ssh/id_rsa"))
 	} else {
-		pemBytes, err = ioutil.ReadFile(node.KeyPath)
+		pemBytes, err = os.ReadFile(node.KeyPath)
 	}
 	if err != nil && !os.IsNotExist(err) {
 		logger.Error(util.ErrorWithSourceLine(err))
@@ -105,7 +104,7 @@ func genSSHConfig(node *Node) *defaultClient {
 					return nil, err
 				}
 			} else {
-				b, err := terminal.ReadPassword(int(syscall.Stdin))
+				b, err := term.ReadPassword(int(syscall.Stdin))
 				if err != nil {
 					return nil, err
 				}
@@ -171,7 +170,7 @@ func (c *defaultClient) Login() {
 			if strings.Contains(msg, "no supported methods remain") && !strings.Contains(msg, "password") {
 				fmt.Printf("%s@%s's password:", c.clientConfig.User, host)
 				var b []byte
-				b, err = terminal.ReadPassword(int(syscall.Stdin))
+				b, err = term.ReadPassword(int(syscall.Stdin))
 				if err == nil {
 					p := string(b)
 					if p != "" {
@@ -201,10 +200,11 @@ func (c *defaultClient) Login() {
 	defer session.Close()
 
 	fd := int(os.Stdin.Fd())
-	w, h, err := terminal.GetSize(fd)
+	w, h, err := term.GetSize(fd)
 	if err != nil {
 		logger.Error(util.ErrorWithSourceLine(err))
-		return
+		w = 300
+		h = 50
 	}
 
 	modes := ssh.TerminalModes{
@@ -387,7 +387,7 @@ func (c *defaultClient) Login() {
 			oh = h
 		)
 		for {
-			cw, ch, err := terminal.GetSize(fd)
+			cw, ch, err := term.GetSize(fd)
 			if err != nil {
 				break
 			}

+ 2 - 3
mssh/config.go

@@ -3,7 +3,6 @@ package main
 import (
 	"encoding/json"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"os/user"
 	"path"
@@ -159,14 +158,14 @@ func LoadConfigBytes(names ...string) ([]byte, error) {
 	}
 	// homedir
 	for i := range names {
-		sshw, err := ioutil.ReadFile(path.Join(u.HomeDir, names[i]))
+		sshw, err := os.ReadFile(path.Join(u.HomeDir, names[i]))
 		if err == nil {
 			return sshw, nil
 		}
 	}
 	// relative
 	for i := range names {
-		sshw, err := ioutil.ReadFile(names[i])
+		sshw, err := os.ReadFile(names[i])
 		if err == nil {
 			return sshw, nil
 		}

+ 1 - 1
mssh/main.go

@@ -110,7 +110,7 @@ func main() {
 		}
 	}
 	p := c
-	if p[0:1] == "=" {
+	if len(p) > 0 && p[0:1] == "=" {
 		p = p[1:]
 	} else {
 		x, e := base64.RawStdEncoding.DecodeString(p)

+ 37 - 0
tty/tty.go

@@ -0,0 +1,37 @@
+package main
+
+import (
+	"fmt"
+	"os"
+)
+
+// ANSI转义序列以换码开始,后跟'm'和一个或多个属性,最后以'm'结束。
+// 例如,下面的代码会输出红色的文本:
+//   \x1b[31mRED TEXT\x1b[0m
+
+func main() {
+	// 定义颜色
+	red := "\x1b[31m"
+	green := "\x1b[32m"
+	yellow := "\x1b[33m"
+	blue := "\x1b[34m"
+	reset := "\x1b[0m"
+
+	// 打印多种颜色的文本
+	fmt.Print(red, "红色文本", reset, " ")
+	fmt.Print(green, "绿色文本", reset, " ")
+	fmt.Print(yellow, "黄色文本", reset, " ")
+	fmt.Print(blue, "蓝色文本", reset, " ")
+	fmt.Println()
+
+	// 如果你想改变背景颜色,可以使用'4'开头的代码
+	// 例如,下面的代码会输出红色的背景:
+	//   \x1b[41mRED BACKGROUND\x1b[0m
+
+	// 请注意,某些终端可能不支持背景颜色。
+}
+
+func init() {
+	// 确保输出不被缓冲,以便立即出现在DOS命令行中。
+	os.Stdout.Sync()
+}

+ 0 - 53
xsh/main.go

@@ -1,53 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"os"
-	"strings"
-	"syscall"
-
-	"golang.org/x/crypto/ssh/terminal"
-)
-
-var (
-	oldTermState *terminal.State
-)
-
-const prompt = "LBS> "
-
-func main() {
-
-	fmt.Printf("\nLBS CLI - version 1.0\n\n")
-
-	var err error
-	oldTermState, err = terminal.MakeRaw(syscall.Stdin)
-	if err != nil {
-		fmt.Println(err)
-		return
-	}
-
-	term := terminal.NewTerminal(os.Stdin, prompt)
-	rawState, err := terminal.GetState(syscall.Stdin)
-	if err != nil {
-		fmt.Println(err)
-		return
-	}
-
-	for {
-		cmdline, err := term.ReadLine()
-		if err != nil {
-			break
-		}
-		cmdline = strings.TrimSpace(cmdline)
-		if cmdline == "" {
-			continue
-		}
-		terminal.Restore(syscall.Stdin, oldTermState)
-		fmt.Println("oooooo:", cmdline)
-		terminal.Restore(syscall.Stdin, rawState)
-	}
-
-	terminal.Restore(syscall.Stdin, oldTermState)
-	fmt.Println("")
-	//fmt.Println("Terminal Over !!!!")
-}