Node.js中的child_process模块详解
简介
child_process 模块提供了以编程方式和 shell (进程的环境)交互的能力。这个模块包含了派生子进程所需的所有功能:
child_process.spawn()
:派生新的进程并与它进行交互。child_process.exec()
:执行 shell 命令,等待完成,并且buffer存储完整的结果。child_process.execFile()
:类似于 child_process.exec(),不过默认执行文件而不是 shell 命令。child_process.fork()
:特殊的 spawn(),用于在子进程中运行的模块,如 fork('./script') 对于 spawn('node', ['./script']) 是有用的。返回一个 ChildProcess 对象。 除了这些,这个模块还包含了几个同步方法,供使用 POSIX fork(2)系统调用的操作系统使用。
引入方式:
const child_process = require('child_process');
子进程的使用
spawn()
spawn()
可以用来开启一个新进程,并与其进行交互。这里是一个简单的例子,演示如何在 Node.js 中运行一个 shell 命令:
const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);
child.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
child.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
child.on('close', (code) => {
console.log(`子进程退出码:${code}`);
});
这个例子将新建一个子进程,运行 ls
命令,参数为 ['-lh', '/usr']
,并且将其标准输出和标准错误流连接到父进程的控制台。
exec()
exec()
方法可以执行任意的 shell 命令,等待命令执行完成后返回并存储完整的输出结果。这里是一个例子:
const { exec } = require('child_process');
exec('cat test.txt', (err, stdout, stderr) => {
if (err) throw err;
console.log(stdout);
});
这个例子将打开一个子进程,执行 cat test.txt
命令,等待命令执行完成,然后将完整的输出结果以字符串形式存储到 stdout 变量中。
shell 命令和参数
当你使用 child_process 模块的时候,你需要格外小心输入的参数是否来自用户输入。如果你不确定参数的来源,请不要直接将它们传递给派生的子进程,否则可能会受到 shell 注入攻击。
为了避免这种情况,你需要将命令和参数分别作为参数传递给 spawn()
、exec()
或 execFile()
,而不是将它们作为一整个字符串传递。下面是一个示例:
// 防注入
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr'], {
stdio: 'inherit'
});
// 易受注入漏洞攻击
const { exec } = require('child_process');
exec(`ls -lh /usr`, (err, stdout, stderr) => {
if (err) throw err;
console.log(stdout);
});
小结
以上是对 child_process 模块的详细介绍和示例。需要注意的是,在使用子进程的时候,参数的输入来源非常重要,需要格外小心,防止 shell 注入攻击。好了,以上就是本文介绍的所有内容。有兴趣的读者可以查阅官方文档深入了解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js中的child_process模块详解 - Python技术站