0


nodejs脚本中执行shell命令

nodejs脚本中执行shell命令


官方文档

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


**
Node.js中使用内置的

child_process

模块来执行shell命令。该模块提供了

exec

execFile

spawn

等方法来启动子进程并执行命令
**


一:exec 方法执行shell命令

1. _注意:

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

第2点_举例:

npm run dev

**该命令会

一直运行

,而 exec 方法的

回调函数

只有在命令运行

完成后

才会被调用,

导致

你的回调函数一直

没有返回

**


2. _优点特性:

  1. 优点是简单易用,方便地执行简单的命令,并且可以直接获取命令输出;
  2. 阻塞式调用的,当命令输出很时,可能会导致阻塞程序的执行,甚至会导致程序崩溃

3. _语法格式:

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

4. _option对象属性:

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

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}`);});

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

error

stdout

stderr

:

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对象属性:

  • cwd``````<string> 子进程的当前工作目录。
  • env<Object>环境变量键值对。
  • argv0 <string> 显式地设置要发给子进程的 argv[0] 的值。 如果未指定,则设为 command。
  • stdio<Array> | <string>子进程的 stdio 配置。 (详见 options.stdio)
  • detached <boolean> 准备将子进程独立于父进程运行。 具体行为取决于平台。(详见 [options.detached])
  • uid <number> 设置该进程的用户标识。(详见 setuid(2))
  • gid <number> 设置该进程的组标识。(详见 setgid(2))
  • shell``````<boolean> | <string> 如果为 true,则在一个 shell 中运行 command。 在 UNIX 上使用 '/bin/sh',在 - Windows 上使用 process.env.ComSpec。 一个不同的 shell 可以被指定为字符串。 See [Shell Requirements][] and [Default Windows Shell][]. 默认为 false(没有 shell)。
  • windowsVerbatimArguments <boolean> 决定在Windows系统下是否使用转义参数。 在Linux平台下会自动忽略,当指令 shell 存在的时该属性将自动被设置为true。默认值: false。
  • windowsHide 是否隐藏在Windows系统下默认会弹出的子进程控制台窗口。 默认为: false。

【4.1 】 .stdio 属性详解 :配制在父进程和子进程之间建立的管道

  • 配制在父进程和子进程之间建立的管道
  • 影响到 shell 命令,或者 node 命令 在控制台上的输出

** 【属性值格式

<Array> | <string> 

】**

  • **['pipe', 'pipe', 'pipe'] (默认值)**数组元素按位置分别对应: - stdin [命令的标准输入] - stdout [命令的标准输出] - stderr [执行命令时出现的错误]

  • 'pipe', 'ignore', 'inherit
    值作用
    pipe
    
    父进程中通过
    child_process.spawn.stdout.on(“data”, () => {})
    
    等获取
    ignore
    
    父进程通过管道得到的是
     null
    
inherit

子进程将使用父进程的标准输入输出

    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}`);});

5. _示例:

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

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}`);});

**如果需要执行一个复杂的shell命令:
可以使用

sh

命令,并将命令字符串作为参数传递给

sh

命令;
例如:**

const{ spawn }=require('child_process');const command ='ls -la | grep "example"';const sh =spawn('sh',['-c', command]);

sh.stdout.on('data',(data)=>{
  console.log(`stdout: ${data}`);});

sh.stderr.on('data',(data)=>{
  console.error(`stderr: ${data}`);});

sh.on('close',(code)=>{
  console.log(`子进程退出码:${code}`);});

**示例中:
我们使用

sh命令

执行了一个包含管道的

shell命令

,并将该命令字符串作为参数传递给sh命令。

spawn

方法中,我们使用

['-c', command]

作为参数来启动

sh

命令**

标签: linux unix 服务器

本文转载自: https://blog.csdn.net/weixin_43101443/article/details/129143317
版权归原作者 Amber.Li 所有, 如有侵权,请联系我们删除。

“nodejs脚本中执行shell命令”的评论:

还没有评论