基于ws的简易webshell

举报
Amrf 发表于 2020/06/04 09:58:37 2020/06/04
【摘要】 客户端:参考: 基于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)
	}
}

测试效果:

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。