如何对“process.platform”的程序撒谎?

2024-01-16

有一个在 Node 上运行的 CLI,可以通过以下方式执行command在命令行上。在其代码中,通过以下方式对 Windows 用户停用了某些功能if (process.platform === 'win32') { process.exit(1); }。现在我想禁用此检查,并允许 Windows 用户使用“隐藏”功能(通常 Windows 上没有安装所需的软件,但我有一个特殊的设置)。

有没有什么方法可以欺骗这个 CLI 并模拟它正在运行,例如Linux 还是 macOS?

当然,我可以分叉 CLI,删除检查并使用我自己的版本 - 但这需要为每个版本重复此过程。由于此功能也应该可供其他用户使用,因此我必须发布分叉和修改后的 CLI,这可能是其用户经常感到困惑的原因(版本号怎么样?我是否使用相同的 CLI)command?) - 99.9% 的代码将保持不变。

我可以编写自己的 CLI,它会“伪造”环境,然后执行已安装的原始 CLI,然后进行清理吗?


我创建了一个示例包,其工作方式与 CLI 相同,但仅执行我正在研究的部分:

  • https://github.com/janpio/nodejs-cli-nowin https://github.com/janpio/nodejs-cli-nowin
  • https://www.npmjs.com/package/nodejs-cli-nowin https://www.npmjs.com/package/nodejs-cli-nowin

安装通过npm i -g nodejs-cli-nowin.


基本上,应该使用包装器包而不是原始包来提供入口点。process.platform在原始包运行之前应该用新值进行模拟。

包装器包/index.js

Object.defineProperty(process, 'platform', { value: 'linux' });

require('original-package/bin/entry-point.js');

如果原始包生成子进程,这不会影响子进程。

这并不能保证该包能够在模拟平台上按预期工作,很可能不会。即使包本身工作正常,这也可能会导致依赖于包依赖项的不可预测的行为process.platform.

为了影响process.platform仅适用于特定模块,platform全局变量应该被局部变量遮蔽。为此,应修改模块包装函数:

const Module = require('module')

const escapedPatchedModulePath = require.resolve('original-package/module-to-patch.js')
  .replace(/\\/g, '\\\\');

Module.wrapper[0] += `
const isPatchedModule = __filename === "${escapedPatchedModulePath}";
let process = isPatchedModule
  ? Object.create(global.process, { platform: { value: 'linux' } })
  : global.process;
`;

require('original-package/bin/entry-point.js');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对“process.platform”的程序撒谎? 的相关文章

随机推荐

  • SQL高效调度生成算法

    The idea 想象一下教育中心有branches Courses该教育中心的信息对所有分支机构都是通用的 Branches CREATE TABLE Branch id int 10 unsigned NOT NULL AUTO INC
  • 升级到 Xcode 6.3 后,在启动时我收到错误:“无法解析 Bonjour 服务。” [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 升级到 Xcode 6 3 后 我现在收到一个带有错误的警报面板 The Bonjour service could not be res
  • HasActivityInjector 无法在 android dagger 2 中解决

    我试图实施有活动注入器在我的 Android 应用程序中 但它显示 HasActivityInjector 无法解析 下面是我在项目中使用的依赖项和插件 apply plugin kotlin kapt and implementation
  • Tomcat:查找目录时不附加尾随“/”

    我在 Tomcat 7 0 22 Java 1 6 MacOS Lion 中部署了 war 存档 战争称为 myapp war 因此 Tomcat 正在服务http localhost myapp http localhost myapp
  • 程序运行时间

    我如何 从程序 我的意思是在我这次要打印 最终返回 之前 找出我的程序运行的时间 提前致谢 edited 非常感谢您的所有回答 但我的程序很短 有没有其他方法可以找出微秒或纳秒的时间 因为使用下面的方法我收到 0 当程序启动时 你会这样做
  • 表单模型绑定 laravel 5.1 多个模型

    我想要 Laracollective 的 Form 包中的多个对象的 Form 模型绑定 如下所示 Form model user vendors array route gt array user update user gt id 我可
  • 为什么主键会自动创建聚集索引

    当我在oracle表中创建主键时 为什么它默认创建 聚集 索引 创建主键时自动创建聚集索引的原因是什么 难道Oracle设计者这样设计Oracle只是他的喜好吗 Oracle 将创建一个索引来管理没有预先存在的索引适用的唯一约束 如果没有索
  • Android - 以编程方式检查开发人员选项?

    我有一个使用意图用相机拍摄照片的应用程序 但最近我遇到了使用 后台进程限制 等开发人员选项的用户遇到的问题 他们关闭了所有后台应用程序 所以除了调用 onPause 和 onResume 之外 我的应用程序也被杀死了 我希望是否有可能检查此
  • SqlServer处于脚本升级模式

    Vista 刚刚完成了众多更新之一 重新启动计算机后 我尝试使用 Sql Server Management Studio 连接到 Sql Server 2008 实例 但收到此错误 连接到 MSSQLSERVER2008 时出错 附加信息
  • 使用 Jabber 发送网络消息

    也问过服务器故障 https serverfault com questions 19586 using jabber to send network messages 我也被建议将其发布在这里 我们需要在其他用户在线提交报告内容时通过网络
  • 如何在 TcxExtLookupComboBox 中使用 TcxCustomDataSource?

    我使用 Devexpress 的 TcxExtLookupComboBox 并尝试实现自定义数据源 我已经像这样设置了自定义数据源 procedure TMainForm FormCreate Sender TObject begin fD
  • 使用 R 将数据从 PDF 导入到 HTML

    有没有办法使用 R 将数据从 pdf 文件导入为 HTML 格式 我尝试使用以下代码 library tm filename file pdf doc lt readPDF control list text layout elem lis
  • Android NFC <技术列表> - 问题

    我想在 Android 上编写我的第一个 NFC 应用程序 为此 我使用 Android 开发人员链接 http developer android com guide topics nfc index html http develope
  • 如何将 FlowDocument 添加到 StackPanel?

    我创建了以下内容class为了有一个easy way显示格式化的WPF 文档中的文本 然而这个解决方案返回一个流程文件 我遇到了麻烦整合我当前应用程序中的这个 FlowDocument 只是添加文本块StackPanels WrapPane
  • 如何在 Python OpenCV 中读取 TIFF 图像的 Alpha 通道?

    我想使用 Python OpenCV 从 tiff 图像中读取 alpha 通道 我正在使用 Enthought Canopy 和 OpenCV 2 4 5 3 模块 我按照 OpenCV 网站的教程使用 cv2 imread 但它似乎不起
  • 通过函数链创建节点和边时,在命令末尾使用 Iterate() 步骤。这一步有什么用呢?

    在 Tinkerpop 3 3 Gremlin 中通过函数链创建节点和边时 在命令末尾使用 Iterate 步骤 这个 iterate 步骤的意义是什么 我在解释其功能的文档中找不到任何提及 iterate 步骤的内容 有人可以向我指出文档
  • 第二次在 foreach 时未在函数内定义变量

    考虑所有这些文件 vars php if local var var foo foo var1 var1 foo1 foo1 else var foo var1 foo1 remote vars remote php is the same
  • Facebook 与 API 版本 2.9 共享自定义参数

    我需要在 Facebook 上分享测验结果 其中包含自定义标题 图片和说明 效果完美4月18日更新至2 9版本之前 但它不适用于 2 9 版本 那我是不是错过了什么 或者 Facebook 不希望我们在 2017 年分享我们网站的自定义 F
  • 高尔夫代码:Mandelbrot 集

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 代码高尔夫的通常规则 下面以Python中的实现为例 from PIL import Imag
  • 如何对“process.platform”的程序撒谎?

    有一个在 Node 上运行的 CLI 可以通过以下方式执行command在命令行上 在其代码中 通过以下方式对 Windows 用户停用了某些功能if process platform win32 process exit 1 现在我想禁用