next-terminal/server/sshd/writer.go
2022-10-23 20:05:13 +08:00

76 lines
1.6 KiB
Go

package sshd
import (
"encoding/hex"
"strings"
"next-terminal/server/api"
"next-terminal/server/common/term"
"github.com/gliderlabs/ssh"
)
type Writer struct {
sessionId string
frontSshSess ssh.Session
backTerm *term.NextTerminal
rz bool
sz bool
}
func NewWriter(sessionId string, frontSshSess ssh.Session, backSshSess *term.NextTerminal) *Writer {
return &Writer{
sessionId: sessionId,
frontSshSess: frontSshSess,
backTerm: backSshSess,
}
}
func (w *Writer) Write(p []byte) (n int, err error) {
s := string(p)
if !w.sz && !w.rz {
// rz的开头字符
hexData := hex.EncodeToString(p)
if strings.Contains(hexData, "727a0d2a2a184230303030303030303030303030300d8a11") {
w.sz = true
} else if strings.Contains(hexData, "727a2077616974696e6720746f20726563656976652e2a2a184230313030303030303233626535300d8a11") {
w.rz = true
}
}
if w.sz {
// sz 会以 OO 结尾
if "OO" == s {
w.sz = false
}
} else if w.rz {
// rz 最后会显示 Received /home/xxx
if strings.Contains(s, "Received") {
w.rz = false
// 把上传的文件名称也显示一下
if w.backTerm.Recorder != nil {
err := w.backTerm.Recorder.WriteData(s)
if err != nil {
return 0, err
}
}
api.SendObData(w.sessionId, s)
}
} else {
if w.backTerm.Recorder != nil {
err := w.backTerm.Recorder.WriteData(s)
if err != nil {
return 0, err
}
}
api.SendObData(w.sessionId, s)
}
return w.frontSshSess.Write(p)
}
func (w *Writer) Read(p []byte) (n int, err error) {
n, err = w.frontSshSess.Read(p)
return n, err
}