You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

  1. 全局安装打包工具:npm install -g pkg
  2. 在脚本目录执行打包命令:pkg client.js --targets node18-win-x64
    生成的client.exe就是用户运行的本地程序,已内置服务器地址。

关键注意事项

  • 权限要求:客户端EXE需要有读写临时目录的权限,目标EXE执行也需对应系统权限。
  • 安全防护:
    • 给服务器下载接口添加身份验证(如token校验)
    • 客户端下载后校验EXE的哈希值,防止文件被篡改
    • 改用HTTPS传输,避免下载过程被劫持
  • 版本优化:可在服务器端维护EXE版本号,客户端先请求版本信息,仅下载更新版本。

内容的提问来源于stack exchange,提问作者user20188099

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:45:41