加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

Django实现WebSSH操作物理机或虚拟机的办法

发布时间:2021-12-14 11:51:34 所属栏目:系统 来源:互联网
导读:我想用它替换掉xshell、crt之类的工具 WebSSH操作物理机或虚拟机 上篇文章给大家介绍详解基于django实现的webssh简单例子,有小伙伴说咖啡哥,我们现在还没有用上Kubernetes,但我想通过浏览器连接我们的物理机和虚拟机该怎么办? 这就比较简单了,既然我们
我想用它替换掉xshell、crt之类的工具
 
WebSSH操作物理机或虚拟机
 
上篇文章给大家介绍详解基于django实现的webssh简单例子,有小伙伴说咖啡哥,我们现在还没有用上Kubernetes,但我想通过浏览器连接我们的物理机和虚拟机该怎么办?
 
这就比较简单了,既然我们已经实现了浏览器操作Kubernetes的Pod,那么想想操作Pod和物理机虚拟机有什么区别呢?
 
整个数据流是一点没变:用户打开浏览器--》浏览器发送websocket请求给Django建立长连接--》Django与要操作的服务器建立SSH通道,实时的将收到的用户数据发送给SSH后的主机,并将主机执行的结果数据返回给浏览器
 
唯一不一样的地方就是Django与要操作的服务器建立SSH通道的方式,在Kubernetes中是通过Kubernetes提供的API建立的Stream流,而操作物理机或者虚拟机的时候我们可以使用Paramiko模块来建立SSH长连接隧道,Paramiko模块建立SSH长连接通道的方法如下:
 
# 实例化SSHClientssh = paramiko.SSHClient()# 当远程服务器没有本地主机的密钥时自动添加到本地,这样不用在建立连接的时候输入yes或no进行确认ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接SSH服务器,这里以账号密码的方式进行认证,也可以用keyssh.connect(hostname=host, port=port, username=username, password=password, timeout=8)# 打开ssh通道,建立长连接transport = ssh.get_transport()self.ssh_channel = transport.open_session()# 获取ssh通道,并设置term和终端大小self.ssh_channel.get_pty(term=term, width=cols, height=rows)# 激活终端,这样就可以正常登陆了self.ssh_channel.invoke_shell()
连接建立,可以通过如下方法给SSH通道发送数据
 
self.ssh_channel.send(data)
 
当然SSH返回的数据也可以通过如下方法持续的输出给Websocket
 
while not self.ssh_channel.exit_status_ready(): # SSH返回的数据需要转码为utf-8,否则json序列化会失败 data = self.ssh_channel.recv(1024).decode('utf-8','ignore') if len(data) != 0: message = {'flag': 'success', 'message': data} self.websocket.send(json.dumps(message)) else: break
有了这些信息,结合详解基于django实现的webssh简单例子的文章,实现WebSSH浏览器操作物理机或者虚拟机就不算困难了,完整的Consumer代码如下:
 
import ioimport jsonimport paramikofrom threading import Threadfrom channels.generic.websocke

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读