基于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)