如何通过Node.js从服务器触发客户端执行EXE文件?
实现方案与代码示例
核心逻辑是:客户端从服务器下载目标EXE到本地临时目录,再启动执行该文件——服务器上的EXE无法直接在客户端桌面运行,必须先完成本地落地。以下是Node.js实现的完整方案:
1. 服务器端(托管并提供EXE下载)
用Express搭建简单文件服务,托管目标EXE并提供下载接口:
const express = require('express'); const path = require('path'); const app = express(); const PORT = 3000; // 目标EXE存放目录(提前把要分发的EXE放到这个文件夹) const EXE_STORE_DIR = path.join(__dirname, 'exe-repo'); // 静态文件托管,开放下载路径 app.use('/exe', express.static(EXE_STORE_DIR)); // 可选:添加权限校验接口(防止非法下载) app.get('/api/verify', (req, res) => { // 这里可加token/IP校验逻辑 res.json({ allow: true, downloadUrl: '/exe/target.exe' }); }); app.listen(PORT, () => { console.log(`服务器运行于 http://localhost:${PORT}`); });
2. 客户端(下载并执行EXE)
编写Node.js脚本,打包成本地EXE后供用户运行:
客户端核心脚本(client.js)
const http = require('http'); const fs = require('fs'); const path = require('path'); const { execFile } = require('child_process'); // 硬编码服务器地址(打包前替换为你的服务器地址) const SERVER_BASE = 'http://你的服务器IP:3000'; const TARGET_EXE = 'target.exe'; // 本地临时存储目录(用系统临时文件夹) const LOCAL_TEMP = process.env.TEMP || path.join(__dirname, 'temp'); // 确保临时目录存在 if (!fs.existsSync(LOCAL_TEMP)) { fs.mkdirSync(LOCAL_TEMP, { recursive: true }); } const localExePath = path.join(LOCAL_TEMP, TARGET_EXE); // 下载文件工具函数 function downloadExe(url, savePath, callback) { const fileStream = fs.createWriteStream(savePath); http.get(url, (res) => { if (res.statusCode !== 200) { return callback(new Error(`下载失败,状态码:${res.statusCode}`)); } res.pipe(fileStream); fileStream.on('finish', () => fileStream.close(callback)); }).on('error', (err) => { fs.unlink(savePath, () => {}); // 删除不完整文件 callback(err); }); } // 主流程:下载→执行 downloadExe(`${SERVER_BASE}/exe/${TARGET_EXE}`, localExePath, (err) => { if (err) { console.error('下载出错:', err.message); return; } // 启动本地EXE execFile(localExePath, (execErr) => { if (execErr) { console.error('执行失败:', execErr.message); return; } console.log('目标程序已启动'); }); });
打包客户端为EXE
- 全局安装打包工具:
npm install -g pkg - 在脚本目录执行打包命令:
pkg client.js --targets node18-win-x64
生成的client.exe就是用户运行的本地程序,已内置服务器地址。
关键注意事项
- 权限要求:客户端EXE需要有读写临时目录的权限,目标EXE执行也需对应系统权限。
- 安全防护:
- 给服务器下载接口添加身份验证(如token校验)
- 客户端下载后校验EXE的哈希值,防止文件被篡改
- 改用HTTPS传输,避免下载过程被劫持
- 版本优化:可在服务器端维护EXE版本号,客户端先请求版本信息,仅下载更新版本。
内容的提问来源于stack exchange,提问作者user20188099
相关产品推荐
相关产品推荐

