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