一种从 Node.js 调用 execl、execle、execlp、execv、execvP 或 execvp 的方法
A way to call execl, execle, execlp, execv, execvP or execvp from Node.js
POSIX 系统公开了一系列 exec
函数,允许将可能不同的内容加载到当前进程中,保持打开的文件描述符、进程标识符等。
这可以出于多种原因完成,在我的例子中,这是自举——我想更改我自己进程的命令行选项,然后在现有进程上重新加载它,这样就没有子进程了。
不幸的是,令我惊讶的是,我找不到调用 Node.js 中任何 exec*
函数的方法。那么,用其他图像替换当前 运行 Node.js 进程的正确方法是什么?
我最终使用了 ffi
模块,并从 libc
导出了 execvp
。
我创建了一个模块来从 NodeJS 调用 execvp 函数:https://github.com/OrKoN/native-exec
它是这样工作的:
var exec = require('native-exec');
exec('ls', {
newEnvKey: newEnvValue,
}, '-lsa'); // => the process is replaced with ls, which runs and exits
由于它是本机节点插件,因此需要安装 C++ 编译器。在 Docker、Mac、OS 和 Linux 中工作正常。可能不适用于 Windows。使用节点 6、7 和 8 进行测试。
这是一个使用节点 v10 的 node-ffi 的示例。 (唉,不是 v12)
#!/usr/bin/node
"use strict";
const ffi = require('ffi');
const ref = require('ref');
const ArrayType = require('ref-array');
const stringAry = ArrayType('string');
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Login: ', (username) => {
username = username.replace(/[^a-z0-9_]/g, "");
rl.close();
execvp("/usr/bin/ssh", "-e", "none", username+'@localhost');
});
function execvp() {
var current = ffi.Library(null,
{ execvp: ['int', ['string',
stringAry]],
dup2: ['int', ['int', 'int']]});
current.dup2(process.stdin._handle.fd, 0);
current.dup2(process.stdout._handle.fd, 1);
current.dup2(process.stderr._handle.fd, 2);
var ret = current.execvp(arguments[0], Array.prototype.slice.call(arguments).concat([ref.NULL]));
}
POSIX 系统公开了一系列 exec
函数,允许将可能不同的内容加载到当前进程中,保持打开的文件描述符、进程标识符等。
这可以出于多种原因完成,在我的例子中,这是自举——我想更改我自己进程的命令行选项,然后在现有进程上重新加载它,这样就没有子进程了。
不幸的是,令我惊讶的是,我找不到调用 Node.js 中任何 exec*
函数的方法。那么,用其他图像替换当前 运行 Node.js 进程的正确方法是什么?
我最终使用了 ffi
模块,并从 libc
导出了 execvp
。
我创建了一个模块来从 NodeJS 调用 execvp 函数:https://github.com/OrKoN/native-exec
它是这样工作的:
var exec = require('native-exec');
exec('ls', {
newEnvKey: newEnvValue,
}, '-lsa'); // => the process is replaced with ls, which runs and exits
由于它是本机节点插件,因此需要安装 C++ 编译器。在 Docker、Mac、OS 和 Linux 中工作正常。可能不适用于 Windows。使用节点 6、7 和 8 进行测试。
这是一个使用节点 v10 的 node-ffi 的示例。 (唉,不是 v12)
#!/usr/bin/node
"use strict";
const ffi = require('ffi');
const ref = require('ref');
const ArrayType = require('ref-array');
const stringAry = ArrayType('string');
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Login: ', (username) => {
username = username.replace(/[^a-z0-9_]/g, "");
rl.close();
execvp("/usr/bin/ssh", "-e", "none", username+'@localhost');
});
function execvp() {
var current = ffi.Library(null,
{ execvp: ['int', ['string',
stringAry]],
dup2: ['int', ['int', 'int']]});
current.dup2(process.stdin._handle.fd, 0);
current.dup2(process.stdout._handle.fd, 1);
current.dup2(process.stderr._handle.fd, 2);
var ret = current.execvp(arguments[0], Array.prototype.slice.call(arguments).concat([ref.NULL]));
}