关于交互shll的问题 请大佬指教!

inna · · 2324 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

项目中需要实现一个功能: 远程服务器开一个端口 windows本地通过putty.exe -raw ip -P port 进行连接Linux服务器执行命令 需要能够 tab补全 vim top 等交互命令 不使用网上的 ssh协议 也不使用 telnet协议 本人在测试中只能够本地在服务端敲命令交互 没法达到putty连接远程交互 希望大佬教教(最好能给出示例代码) 下面给出目前的代码 及实现效果(很垃圾希望大佬教教) ```go package main import ( "fmt" "io" "log" "net" "os" "os/exec" "os/signal" "syscall" "github.com/creack/pty" "golang.org/x/term" ) func main() { //监听 listener, err := net.Listen("tcp", "0.0.0.0:8888") if err != nil { fmt.Println("err1=", err) return } defer listener.Close() //接受多个用户连接 for { fmt.Println("listen 0.0.0.0:8888") //有用户连接才会继续向下执行 然后返回该用户连接 不然就一直监听 conn, err := listener.Accept() if err != nil { fmt.Println("err2=", err) return } go GetShell(conn) } } func GetShell(conn net.Conn) error { // Create arbitrary command. c := exec.Command("bash") // Start the command with a pty. ptmx, err := pty.Start(c) if err != nil { return err } // Make sure to close the pty at the end. 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 { log.Printf("error resizing pty: %s", err) } } }() ch <- syscall.SIGWINCH // Initial resize. defer func() { signal.Stop(ch); close(ch) }() // Cleanup signals when done. // Set stdin in raw mode. oldState, err := term.MakeRaw(int(os.Stdin.Fd())) if err != nil { panic(err) } defer func() { _ = term.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort. // Copy stdin to the pty and the pty to stdout. // NOTE: The goroutine will keep reading until the next keystroke before returning. go func() { _, _ = io.Copy(ptmx, os.Stdin) }() _, _ = io.Copy(conn, ptmx) return nil } ``` 下面附上效果图 ![当前效果.gif](https://static.golangjob.cn/220628/2898acdb760b8f77ffdd375684499314.gif)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2324 次点击  ∙  1 赞  
加入收藏 微博
2 回复  |  直到 2022-07-18 11:11:31
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传