kaisawind's blog
  • 关于
  • 所有帖子

go实现webshell - Tue, Jun 22, 2021

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())
	}


辽ICP备2021007608号 | © 2025 | kaisawind

Facebook Twitter GitHub