go实现webshell

  1. 1. 概述
  2. 2. 示例

go实现webshell

1. 概述

tty是将服务器中shell通过web端进行访问的一种技术。
正常的os/exec包指令不能进行文件夹切换,因为一条指令就是一个终端,不同终端环境隔离。
github.com/creack/pty包能够实现不同平台的bash子进程,从而实现tty功能。

2. 示例

本地pty建立

    cmd := FindCmd()
    // Create arbitrary command.
    m.cmd = exec.Command(cmd)
    m.cmd.Env = os.Environ()
    m.cmd.Env = append(m.cmd.Env, "TERM=xterm-256color")
    // Start the command with a pty.
    m.tty, err = pty.Start(m.cmd)
    if err != nil {
        logrus.WithError(err).Errorln("pty.Start error")
        return
    }
    // Set the initial window size
    cols := 200
    rows := 55
    err = pty.Setsize(m.tty, &pty.Winsize{
        Rows: uint16(rows),
        Cols: uint16(cols),
        X:    0,
        Y:    0,
    })
    if err != nil {
        logrus.WithError(err).Errorln("pty.Setsize error")
        return
    }

本地pty与远程服务器结合

    mw := io.MultiWriter(s)

    go func() {
        _, err = io.Copy(mw, s.ptyd)
        if err != nil {
            logrus.WithError(err).Fatalln("copy ptyd stdout error")
        }
    }()
    err = s.ptyd.Wait()
    if err != nil {
        logrus.WithError(err).Fatalln("ptyd wait error")
    }
    if s.ptyd != nil {
        s.ptyd.Write(msg.Payload())
    }

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wind.kaisa@gmail.com

💰

×

Help us with donation