文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

nodejs脚本中执行shell命令

2023-08-31 21:21

关注

nodejs脚本中执行shell命令


官方文档

Node.js v8.x 中文文档: child_process - 子进程



Node.js中使用内置的child_process模块来执行shell命令。该模块提供了execexecFilespawn等方法来启动子进程并执行命令


一:exec 方法执行shell命令



1. _注意:

  1. exec 方法是将整个命令输出缓存到内存中,当执行完成后一次性返回,所以适合执行较小的命令
  2. exec 方法的回调函数只有在命令执行完成后才会被调用[持续性命令会导致回调函数不执行]

第2点_举例:

npm run dev

该命令会一直运行,而 exec 方法的回调函数只有在命令运行完成后才会被调用,导致你的回调函数一直没有返回



2. _优点特性:

  1. 优点是简单易用,方便地执行简单的命令,并且可以直接获取命令输出;

  2. 阻塞式调用的,当命令输出很时,可能会导致阻塞程序的执行,甚至会导致程序崩溃


3. _语法格式:

exec( '命令',option对象, 回调函数callback);

4. _option对象属性:

  1. cwd 子进程的当前工作目录。
  2. env 环境变量键值对。
  3. encoding 默认为 ‘utf8’。
  4. shell 执行命令的 shell。在 UNIX 上默认为 ‘/bin/sh’,在 Windows 上默认为 process.env.ComSpec。详见Shell的要求与Windows默认的Shell。
  5. timeout 默认为 0。
  6. maxBuffer stdout 或 stderr 允许的最大字节数。默认为 200*1024。如果超过限制,则子进程会被终止。详见 maxBuffer与Unicode。
  7. killSignal | 默认为 ‘SIGTERM’。
  8. uid设置进程的用户标识,详见 setuid(2)。
  9. gid设置进程的组标识,详见 setgid(2)。
  10. windowsHide 隐藏子进程的控制台窗口,常用于 Windows 系统。默认为 false。


  11. 5. _示例:

    Nodejs–标识Node.js进程运行其上的操作系统平台: process.platform

    const { exec } = require('child_process'); // 就是进行简单`判断`在执行环境下应该使用`哪个命令行`执行命令; // process.platform : 标识Node.js进程运行其上的操作系统平台 // 返回值:‘aix’,‘darwin’,‘freebsd’,‘linux’,‘openbsd’,‘sunos’,‘win32’ exec('ls -la',{shell:process.platform === 'win32'}, (error, stdout, stderr) => {  if (error) {    console.error(`执行出错: ${error}`);    return;  }  console.log(`stdout: ${stdout}`);  console.error(`stderr: ${stderr}`);});

    回调函数有三个参数:
    errorstdoutstderr:

    error表示执行命令时出现的错误;
    stdout表示命令的标准输出;
    stderr表示命令的标准错误输出;




    二:spawn 方法 执行shell命令


    1. _注意:

    • spawn方法执行的命令参数应该是一个Array。这样可以避免shell注入攻击.
    // 命令参数应该是一个`数组`  ['-la']const ls = spawn('ls', ['-la'],{shell:process.platform === 'win32'},);

    2. _优点特性:

    1. spawn 方法则是实时返回子进程的标准输出和标准错误流,适合执行大量数据或者长时间运行的命令[ 例如 npm run dev ];
    2. 异步执行的,可以在命令输出时即时处理数据,阻塞程序的执行;
    3. 可以灵活地配置子进程的输入输出环境变量等选项



    3. _语法格式:

    const ls = spawn(命令String, 命令参数Array,option对象);ls.stdout.on('data', (data) => {  console.log(`stdout: ${data}`);});ls.stderr.on('data', (data) => {  console.error(`stderr: ${data}`);});ls.on('close', (code) => {  console.log(`子进程退出码:${code}`);});



    4. _option对象属性: