魔改novnc ,指定别名、指定ip+端口都能访问远程vnc server
前提
前提1,selenium grid配置
我的是用的selenium grid集群作为远程的vnc server,所以,如下:
selenium grid 集群的docker镜像有,一些无关的我就马死了
集群管理界面:
如果不知道怎么配置selenium grid集群的,可以看我之前的: python爬虫 - 配置强有力的js绕过神器-selenium grid分布式集群
前提2,novnc正常使用
然后我novnc的token.conf文件如下:
node1: xxxx:35008
node2: xxxx:35009
好,我现在用浏览器访问 http://<novnc server host>:<novnc server port>/vnc.html?path=?token=node1 ,
输入密码secret之后正常打开:
这样我就访问了我的别名为node1实际为xxxx:35008的vnc server上了
此时如果你的不能正常访问,自行检查重新配置,怎么配置novnc就不多说了,网上教程一大堆
在网上有的教程的同时,大多都有把远程的vnc server的ip和端口取个别名,放在token.conf文件里面,这样的话访问起来确实比较方便,就不用再输入繁琐的ip和端口号了,万一ip输入错误还要检查半天是吧?
问题
但是在实际的开发工作中,我们可能会有如下的场景,我们不止以上两个vnc sever,可能会有多个,而且还可能连接别人配置好的vnc server,那我每次有新的vnc sever加入,是不是都得重新写入到token.conf文件,然后再次的重启novnc才行呢?而且在重启中途,有可能你同事连上某个节点的vncv server 正在操作中呢,你突然就重启了,这样肯定是不太合理的,而且这样是不是更繁琐,每有一个新的就要重写配置文件,重启服务,当然如果你实际的vnc sever 是固定的话,以上指定别名的方式绝对是够用了
而我说的这个场景的话,确实不太行,所以需要魔改,魔改过程就不多说了,直接改./noVNC/utils/websockify/websockify/token_plugins.py文件,你novnc装在哪就自己找了,进入noVNC目录到我给的这个路径,改token_plugins.py的这里:
解决问题
魔改代码
把41行的lookup方法:由以下
改成这样:
def lookup(self, token):
if self._targets is None:
self._load_targets()
if token in self._targets:
return self._targets[token]
else:
if re.search(r'\d{2,3}(\.\d{1,3}){3}:\d{2,5}', token):
return token.split(':')
else:
return None
就完了,就这么点。
lookup方法的作用是啥,可以在同级目录创建一个测试文件调用试试:
也就是先获取token.conf文件里的所有配置,然后拿到url里指定的vnc server,比对,如果有,则返回实际ip和端口,也就是其实还是用的ip和端口访问
那我上面改的意思就是只要正则匹配是一个ip+端口的就直接切割后返回,保存重启
/usr/bin/python3 -m websockify -D --web ./noVNC --log-file=ws.log --token-plugin=TokenFile --token-source=token/token.conf --cert ./noVNC/utils/self.pem 6080
验证,token的值直接输入一个ip+端口,访问:确实可行,我这里用的35009,也就是上面的token.conf配置的node2
验证
为了确认我连的是不是就是node2而不是node1,我用代码控制打开一个网站看看:
node2的反应:
同时node1并没有任何反应;
那就说明,指定的ip和端口访问成功了,而且原有的别名指定的功能也同样存在
等会儿,还没完,注意一下,看下launch.sh这个启动脚本“:
大概意思就是说,启动脚本的时候,这个Q脚本会检测同级目录下有没有websockify文件相关,如果没有的话,就要去github拉取代码,这个是我们脚本第一次启动的时候会作的操作,之后就不会了,而我刚才魔改的哪个token_plugins.py文件就是拉取的websockify仓库里的,也就是说,你如果中途迁移了项目,或者丢失这个文件,或者你不小心把这个websockify名字改了,都会重新去拉取下代码,然后会把刚才改的支持ip+端口访问的覆盖掉,所以你得重新配置下,然后重启才行