基于ws的简易webshell
【摘要】 客户端:参考: 基于Websocket的简易webshell实现 ---- https://stackoverflow.com/questions/38277740/html-css-javascript-command-line-like-interface有几点小改动:addLine添加br并且设置滚动位置 ;点击背景,设置焦点到textarea;ws.onmessage是调用...
客户端:
参考:
基于Websocket的简易webshell实现 ---- https://stackoverflow.com/questions/38277740/html-css-javascript-command-line-like-interface
有几点小改动:
addLine添加br并且设置滚动位置 ;
点击背景,设置焦点到textarea;
ws.onmessage是调用addline;
checkInput中发送当前值,注意发送的值需要添加\n;
其他参考:
https://www.runoob.com/html/html5-websocket.html
https://codepen.io/paoloppp/pen/WNbOaNG
服务端参考:
https://blog.csdn.net/tankpanv/article/details/105562735
对其中的RemoteShell函数做一些改造:
func RemoteShell(ws *websocket.Conn) {
bScanner := bufio.NewScanner(ws)
cmd := exec.Command("cmd" )
cmdReader, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
cmd.Stderr = cmd.Stdout
cmdWriter, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}
idleCount := 0
mu := &sync.Mutex{}
go func() {
for bScanner.Scan() {
mu.Lock()
idleCount = 0
mu.Unlock()
cmdStr := bScanner.Bytes()
str, _ := Utf8ToGbk(cmdStr)
//fmt.Println(string(cmdStr))
cmdWriter.Write(append([]byte(str), '\n'))//\r\n
}
}()
scanner := bufio.NewScanner(cmdReader)
go func() {
for scanner.Scan() {
mu.Lock()
idleCount = 0
mu.Unlock()
outStr := scanner.Bytes()
str, _ := GbkToUtf8(outStr) //windous命令行默认编码是gbk,可以使用chcp查看和修改
//fmt.Println(string(str))
ws.Write(str)
}
}()
go func() {//长时间不操作,退出
for {
mu.Lock()
idle := idleCount
mu.Unlock()
if idle > 120 {
cmdWriter.Write([]byte("exit\n"))
break;
}
mu.Lock()
idleCount = idle +1
mu.Unlock()
time.Sleep(time.Duration(1)*time.Second)
}
}()
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
if err := cmd.Wait(); err != nil {
log.Fatal(err)
}
}
测试效果:
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)