内容简介:上一篇文章中讲了远程桌面监控的实现思路。虽然是可用的,但有很多不好用的地方,于是我又进行了完善。我对这个工具的期望是我希望用户在用的时候,只要通过npm全局安装一个服务端的包,然后命令行启动服务端,在另一台机器全局安装客户端的包,也是命令行启动,这样就可以做到远程监控了。且命令行支持灵活地参数配置。这次迭代后的效果如下:
上一篇文章中讲了远程桌面监控的实现思路。虽然是可用的,但有很多不好用的地方,于是我又进行了完善。
我对这个 工具 的期望是我希望用户在用的时候,只要通过npm全局安装一个服务端的包,然后命令行启动服务端,在另一台机器全局安装客户端的包,也是命令行启动,这样就可以做到远程监控了。且命令行支持灵活地参数配置。
这次迭代后的效果如下: 演示
概览
列一下我做了哪些改动:
-
服务端支持命令行启动,支持参数设置
-
服务端支持 cosmiconfig 风格的配置
-
客户端支持网页的方式
-
客户端支持命令行启动
-
修改了键盘和鼠标不准的一些bug
-
添加了英文的README
详述
服务端支持命令行启动
我调试的时候直接使用node运行的js脚本,后来我一想,用户也这样的话就太麻烦了。应该通过图形界面或者命令行的方式,命令行的方式轻量一些。
实现是使用 yargs ,代码如下:
#!/usr/bin/env node const yargs = require('yargs'); const conf = require('./Configuration').getInstance(); const script = yargs.scriptName("remote-monitor-server"); script.usage('$0 <cmd> [args]'); script.command('start', '启动服务器', (yargs) => { yargs.option('--port', { description: '端口号' }) yargs.option('--monitorScreenshotInterval', { description: '截图间隔' }) yargs.option('--controlEnable', { description: '是否允许远程控制' }) yargs.option('--controlLog', { description: '是否打印鼠标键盘事件的日志' }) }, function (options) { if(options.port) { conf.setConfig('server.port', options.port) } if(options.monitorScreenshotInterval) { conf.setConfig('monitor.screenshotInterval', options.monitorScreenshotInterval) } if(options.controlEnable) { conf.setConfig('control.enable', options.controlEnable) } if(options.controlLog) { conf.setConfig('control.log', options.controlLog) } require('./index');//启动服务器 }) script.help(); script.argv 复制代码
在package.json中配置对应的bin字段,这样安装这个包的时候,这个文件就会被放到bin目录下了。
"bin": { "remote-monitor-server": "./dist/cli.js" } 复制代码
支持cosmiconfig风格的配置
因为服务端还是有很多地方需要配置的,比如截图的时间间隔、是否打印日志、是否允许客户端控制等,所以添加了对应的支持。
cosmiconfig是eslint还有stylelint实现配置文件查找的方式,你应该会很熟悉,就是如下的配置查找顺序
- a package.json property
- a JSON or YAML, extensionless "rc file"
- an "rc file" with the extensions .json, .yaml, .yml, or .js.
- a .config.js CommonJS module
然后在代码里面读取配置,我封装了一个Configuration类,因为全局唯一,所以做成单例:
const cosmiconfig = require('cosmiconfig'); import { get, set } from 'lodash'; const configFinder = cosmiconfig('remoteMonitorServer'); const defaultConfig = { monitor: { screenshotInterval: 500,// 截图的间隔 }, control: { enable: true,// 是否允许客户端控制 log: true// 是否打印日志 }, server: { port: 3000// 服务器端口号 } } let instance; class Configuration { config: Object; constructor() { if(instance) { return instance; } this.config = Object.assign({}, defaultConfig, configFinder.searchSync().config); instance = this; } static getInstance() { if (!instance) { instance = new Configuration(); } return instance; } getConfig(name) { return name ? get(this.config, name) : this.config; } setConfig(name, val) { set(this.config, name, val); } } module.exports = Configuration; 复制代码
用到配置的地方,通过单例的configuration来读取配置:
const configuration = require('./Configuration').getInstance(); configuration.getConfig('control.enable') 复制代码
这是配置文件的方式,当然我们命令行启动的的时候通过参数也可以配置,只需要参数处理的时候设置到configuration对象中就好了
if(options.monitorScreenshotInterval) { conf.setConfig('monitor.screenshotInterval', options.monitorScreenshotInterval) } 复制代码
客户端支持网页的方式
客户端只需要展示服务端传过来的图片,并且监听事件然后传递到服务端,其实并没有用到一些原生的api。使用electron打包成app的方式显的有些笨重了。所以我单独打包成了web下的文件,单独发到npm仓库,没有把electron的部分包括进去。
客户端支持命令行启动
打包后的客户端文件只是html还有关联的js和其他资源文件,只需要静态服务器启动起来就好,所以使用了 http-server 。
#!/usr/bin/env node const childProcess = require('child_process'); const path = require('path'); childProcess.spawnSync('http-server', [ __dirname ], { stdio: 'inherit' }); 复制代码
然后配置package.json的bin字段
"bin": { "remote-monitor-client-web": "index.js" } 复制代码
修改了键盘和鼠标不准的一些bug
之前是服务端直接使用了客户端传递过来的keycode来执行事件,但我发现执行的结果是不对的,后来我看robot-js的文档后,改成了取robot.KEY_XXX的方式
public executeKeyboardEvent(event: KeyboardEvent): void { let keyCode = robot['KEY_' + event.keyName.toUpperCase()]; if (!keyCode) { console.log('robot-js暂不支持' + event.keyName + '键'); return; } switch(event.type) { case 'keydown': this.keyboard.press(keyCode); break; case 'keyup': this.keyboard.release(keyCode); break; case 'keypress': this.keyboard.click(keyCode); break; default:break; } } 复制代码
但是有一些键,比如方向键,robot-js是没有对应的keyCode的,所以做了拦截,这里后续还会做优化,现在只是解决了按键不准的问题。
以上所述就是小编给大家介绍的《Node.js 实现远程桌面监控(二)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- nodejs实现远程桌面监控
- secret-performance-desktop v1.2.0 发布,桌面性能监控
- secret-performance-desktop v1.4.0 发布,桌面性能监控
- secret-performance-desktop v1.5.0 发布,桌面性能监控
- 云原生桌面:虚拟桌面的解构与重新定义
- 桌面安全缺陷多,盘点最常见的桌面漏洞
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。