webrtc远程控制系统源码学习笔记(三)

webrtc远程控制系统源码学习笔记(三)

1、ssh.go //主要实现ssh登录,及执行远程命令

//主要完成ssh连接,使用密码认证
func initSSH(sshUser, sshPassword string, dc *webrtc.DataChannel, rtcin chan string) (*ssh.Session, error) {
//创建sshp登陆配置
config := &ssh.ClientConfig{
	Timeout:         time.Second, //ssh 连接time out 时间一秒钟, 如果ssh验证错误 会在一秒内返回
	User:            sshUser,
	HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个可以, 但是不够安全
	//HostKeyCallback: hostKeyCallBackFunc(h.Host),
}
config.Auth = []ssh.AuthMethod{ssh.Password(sshPassword)} //获取鉴定

//dial 获取ssh client
addr := fmt.Sprintf("%s:%d", Conf.SSHHost, Conf.SSHPort)
sshClient, err := ssh.Dial("tcp", addr, config)
if err != nil {
	return nil, err
}
//创建session
sshSession, err := sshClient.NewSession()
if err != nil {
	return nil, err
}
dc.SendText("success")

//开启线程执行远程命令
go sshHandler(sshClient, sshSession, dc, rtcin)
return sshSession, nil
}

代码详解:

  1. 配置ssh.ClientConfig
    建议TimeOut自定义一个比较端的时间
    自定义HostKeyCallback 如果像简便就使用 ssh.InsecureIgnoreHostKey回调, 这种方式不是很安全
    publicKeyAuthFunc 如果使用key登陆 就需要着用这个函数量读取id_rsa私钥,当然你可以自定义这个访问让他支持字符串

  2. ssh.Dial创建ssh客户端
    拼接字符串得到ssh连接地址,同时不要忘记 defer client.Close()

  3. sshClient.NewSession 创建session 会话
    可以自定义stdin,stdout
    可以创建pty
    可以SetEnv

 //主要功能是使得可以执行交互式命令
 func sshHandler(sshClient *ssh.Client, sshSession *ssh.Session, dc *webrtc.DataChannel, rtcin chan string) error {	
	defer sshClient.Close()
	defer sshSession.Close()
    //将 session 的 Stdout 和 Stderr 重定向,与webrtc.DataChannel绑定
	sshSession.Stdout = &Wrap{dc}
	sshSession.Stderr = &Wrap{dc}
	//sshSession.Stdin = &Wrap{dc}
	//下面两行代码完成sshin的重定向
	sshin, _ := sshSession.StdinPipe()
	go stdinHandler(sshin, rtcin) //开启线程将channel rtcin的数据与sshin绑定
	// Set up terminal modes
	modes := ssh.TerminalModes{
		ssh.ECHO:          0,     // disable echoing
		ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
		ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
	}
	// Request pseudo terminal
	if err := sshSession.RequestPty("xterm", 40, 80, modes); err != nil {
		return err
	}
	// Start remote shell
	if err := sshSession.Shell(); err != nil {
		return err
	}
	if err := sshSession.Wait(); err != nil {
		return err
	}

	return nil
}

//将channel rtcin中的数据写入StdinPipe
func stdinHandler(sshin io.Writer, rtcin chan string) {
	for input := range rtcin {
		sshin.Write([]byte(input))
	}

参考资料1:https://studygolang.com/articles/20592
参考资料2:http://www.01happy.com/golang-exec-remote-command/

2、contro.go //实现远程指令功能

func controlHandler(msg []byte) string {
resq := make(map[string]string)
err := json.Unmarshal(msg, &resq)//解码
if err != nil {
	return "{\"result\":\"failure\",\"msg\":\"" + err.Error() + "\",\"timestamp\":" + strconv.FormatInt(time.Now().Unix(), 10) + "}"
}

//找到预先编写的命令文件,然后运行
if !isExist("./control/" + resq["device_id"]) {
	return "{\"result\":\"failure\",\"msg\":\"device_id not exist\",\"timestamp\":" + strconv.FormatInt(time.Now().Unix(), 10) + "}"
}

if !isExist("./control/" + resq["device_id"] + "/" + resq["operate"]) {
	return "{\"result\":\"failure\",\"msg\":\"operate not exist\",\"timestamp\":" + strconv.FormatInt(time.Now().Unix(), 10) + "}"
}

cmd := exec.Command("sh",  "./control/"+resq["device_id"]+"/"+resq["operate"])  //执行改文件夹
out, err := cmd.Output()
if err != nil {
	return "{\"result\":\"failure\",\"msg\":\"" + err.Error() + "\",\"timestamp\":" + strconv.FormatInt(time.Now().Unix(), 10) + "}"
}
return "{\"result\":\"success\",\"msg\":\"" + string(out) + "\",\"timestamp\":" + strconv.FormatInt(time.Now().Unix(), 10) + "}"
}

//查找文件是否存在
func isExist(f string) bool {
_, err := os.Stat(f)
return err == nil || os.IsExist(err)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你有多台电脑的键盘鼠标放在狭窄的电脑桌上, 当你在每台电脑的键盘鼠标之间来回切换而焦头烂额时, 当你为了发送一段文本而不得不使用飞鸽或QQ甚至通过共享文件来时传递时, 你或许需要它:"远程虚拟控制" 这个软件实现了只使用一套键盘鼠标控制最多八台主机的功能, 并能在这些主机之间方便的传送文本内容, 实现在一台电脑上Ctrl + C 在另外一台电脑上Ctrl + V, 完成远程复制功能。 主机之间的切换无需进行任何附加操作, 你只需要将你的鼠标从这个显示移动到另一台显示器, 就如同将输入焦点从一个窗口移动到另一个窗口一样, 当完成鼠标切换后, 键盘也同时将输入焦点切换到相应的主机, 此后的大部分键盘输入操作均只对拥有鼠标的主机有效, 除了(Ctrl + ATL + DEL、WIN + L)这些组合键无法传送, 当按下这些组合键后, 主控机即刻获取输入焦点。 此软件只能在登陆后的默认桌面才可使用, 不能在登陆桌面, 屏保桌面下使用(等待解决这个问题), 在使用时如果系统安装有防火墙软件, 请将本程序加入防火墙的白名单或是相应配制文件中, 让防火墙放过检测。否则可能 给你的使用带来不便。 软件分为主控端和被控端, 可能存在多台被控端, 但是只能有一台主控端, 由主控端向其它被控端发送键盘鼠标指令, 以控制被控端的行为。 将程序分别解压到你每台的电脑上,依据配制说明将一台电脑配制成主控机, 将其它的电脑制成被控机。
### 回答1: JS WebRTC远程控制源码可以用于实现浏览器间的实时音视频通信和数据传输。下面是一个简单的示例源码: HTML部分: ```html <!DOCTYPE html> <html> <head> <title>WebRTC远程控制</title> <style> #video { width: 400px; height: 300px; margin-bottom: 10px; } #message { width: 400px; height: 100px; } </style> </head> <body> <video id="video" autoplay></video> <textarea id="message" placeholder="发送消息"></textarea> <button id="connectBtn">连接</button> <script src="script.js"></script> </body> </html> ``` JS部分: ```javascript let localStream; let remoteStream; let rtcPeerConn; const iceServers = { iceServers: [ { urls: "stun:stun.stunserver.com:3478" }, { urls: "stun:stun.l.google.com:19302" }, ], }; const connBtn = document.getElementById("connectBtn"); const videoElement = document.getElementById("video"); const messageElement = document.getElementById("message"); connBtn.addEventListener("click", () => { connBtn.disabled = true; createConnection(); }); async function createConnection() { try { const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true }); videoElement.srcObject = stream; localStream = stream; rtcPeerConn = new RTCPeerConnection(iceServers); rtcPeerConn.onicecandidate = handleIceCandidate; rtcPeerConn.ontrack = handleRemoteStream; rtcPeerConn.addTrack(localStream.getTracks()[0], localStream); rtcPeerConn.addTrack(localStream.getTracks()[1], localStream); const offer = await rtcPeerConn.createOffer(); await rtcPeerConn.setLocalDescription(offer); // 将offer发送给远程端 // 接收远程端的answer // rtcPeerConn.setRemoteDescription(answer); } catch (error) { console.error("Error creating connection: ", error); } } function handleIceCandidate(event) { if (event.candidate) { // 将ice candidate发送给远程端 } } function handleRemoteStream(event) { remoteStream = event.streams[0]; videoElement.srcObject = remoteStream; // 在此处进行远程端的操作,控制源码的关键部分 } ``` 上述示例代码是一个简单的WebRTC远程控制源码,用户通过浏览器连接到其他用户的端口,实现双方的音视频通话。您还可以根据具体的需求对源码进行扩展和优化来满足更多的功能需求。 ### 回答2: JS WebRTC 远程控制源码是一种用于实现实时通信和远程控制的JavaScript源码WebRTC(Web实时通信)是一种Web标准,用于在浏览器之间实现音视频通信和数据传输。它可以实现点对点的实时通信,无需额外的插件或软件。 远程控制是通过WebRTC的数据通道实现的。数据通道是一个双向的、低延迟的信道,可以在浏览器之间发送任意类型的数据。通过在源码中创建和管理数据通道,可以实现远程控制功能。 源码的实现通常包括以下步骤: 1. 创建一个WebRTC连接:使用WebRTC的API,创建一个连接对象,可以通过连接对象建立对等连接,实现点对点的通信。 2. 建立数据通道:在连接对象上创建一个数据通道,用于发送和接收控制信息。数据通道可以在连接建立后立即创建,或者在需要控制时创建。 3. 监听数据通道的消息:通过监听数据通道的消息事件,可以获取远程发送的控制指令。一旦接收到消息,就可以根据指令来执行相应的远程控制操作。 4. 发送控制指令:通过数据通道,可以将本地的控制指令发送到远程浏览器。可以将指令打包成特定格式的数据,并通过数据通道发送给对方。 5. 执行远程控制:根据收到的控制指令,可以在本地执行相应的远程控制操作。例如,可以控制远程浏览器的页面导航、元素操作等。 通过以上步骤,就可以实现基于WebRTC远程控制功能。源码中通常会包含上述步骤的实现代码以及一些辅助函数和事件处理函数。 需要注意的是,为了实现远程控制,需要在两个浏览器之间进行连接和通信。在实际使用中,可能需要额外的服务器端代码来协调和中转通信,以确保双方能够互相连接,并进行数据交换。 总结起来,JS WebRTC 远程控制源码是一种用于在浏览器之间实现实时通信和远程控制的JavaScript源码,通过建立连接、创建数据通道和监听通道消息来实现远程控制功能。 ### 回答3: JavaScript WebRTC远程控制源码是一种基于WebRTC技术实现的能实现远程控制的源代码。WebRTC(Web Real-Time Communication)是一种现代化的Web技术标准,它允许浏览器之间进行实时通信,包括音视频传输、数据传输以及P2P通信。 WebRTC远程控制源码的实现需要借助以下几个核心组件: 1. PeerConnection(对等连接):它是WebRTC的核心组件之一,用于建立实时的音视频和数据通信。通过PeerConnection,浏览器之间可以建立点对点的连接,实现远程控制的双向通信。 2. getUserMedia(获取媒体):这个API可以从设备的摄像头和麦克风获取实时的音视频流。在远程控制中,通过getUserMedia可以获取控制端浏览器的摄像头和麦克风的音视频流,并传输给被控端浏览器进行实时展示。 3. DataChannel(数据通道):除了传输音视频流外,WebRTC还提供了DataChannel,用于传输其他类型的数据。在远程控制中,可以通过DataChannel传输控制指令、鼠标位置等数据,实现对被控端浏览器的实时控制。 基于这些核心组件,远程控制源码可以实现以下功能: 1. 建立连接:通过PeerConnection建立控制端浏览器和被控端浏览器之间的连接。 2. 获取媒体:控制端浏览器通过getUserMedia获取自己的音视频流,并将其传输给被控端浏览器进行实时展示。 3. 控制指令传输:通过DataChannel传输控制指令,如鼠标点击、键盘输入等,实现对被控端浏览器的远程控制。 4. 数据传输:如果需要传输其他类型的数据,如文件等,也可以通过DataChannel进行传输。 综上所述,JavaScript WebRTC远程控制源码实现了控制端和被控端浏览器之间的实时音视频传输和数据通信,实现了远程控制的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值