nodejs脚本中执行shell命令

这篇具有很好参考价值的文章主要介绍了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 <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}`);
});

回调函数有三个参数:
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对象属性:

  • 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命令
文章来源地址https://www.toymoban.com/news/detail-809890.html

到了这里,关于nodejs脚本中执行shell命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Shell脚本——流量探测(自动化运维)

    目的    自动  捕获 指定IP或端口 的流量 生成日志,实现 流量 探测功能 准备    Root 用户权限下才能运行tcpdump脚本 优势   Liunx系统自带,无需安装其他组件,捕获准确度高 缺点   不能同时检测多个IP流量,效率低 重点         日志文件   touch  /home/node1/scripts/t

    2024年02月16日
    浏览(41)
  • shell自动化脚本,启动、停止应用程序

    准确的讲/etc下的rc.local文件是rc.d文件中rc.local文件的软链接,找到rc.d下的rc.local文件,添加可执行选项。如果没有该文件可以自己创建。 要想你的脚本文件开机自启动还需要用到rc-local.service这个服务。

    2024年02月03日
    浏览(53)
  • Postman-脚本自动化及定时执行脚本(7)

    一.postman脚本自动化 ( 从postman至Newman可以一键执行脚本并生成报告: ) Postman Newman 是一个 CLI(命令行界面)工具,可以使用它来运行 Postman 中的集合(Collection)和环境(Environment)进行自动化测试。postman使用newman插件完成命令执行postman脚本。**(1)newman按装** 1.Newman安

    2024年01月21日
    浏览(42)
  • shell脚本——服务器巡检(自动化运维)

     目的   自动 获取集群内 多个主机 的内存、磁盘、cpu等信息 生成日志  准备    VMware虚拟主机IP在同一个网段(互相能ping通)             虚拟主机都有公钥免登录            修改主机IP  vi/etc/sysconfig/netwoek-scripts/ifcfg-ens160            设置主机名 hostnamectl set-ho

    2024年02月15日
    浏览(52)
  • ansible相比shell脚本自动化有什么优势

    Ansible自动化与Shell脚本自动化相比,具有以下几个显著的优势: 轻量级与无需代理 :Ansible的一个关键优势在于其轻量级和无需在被控制服务器上安装任何代理或客户端的特点。这极大地简化了部署和维护的流程,降低了复杂性和出错的可能性。而Shell脚本通常需要在每台服

    2024年04月25日
    浏览(46)
  • Shell脚本入门实战:探索自动化任务与实用场景

    引言 Shell脚本作为一种强大的自动化工具,在现代操作系统中具有广泛的应用。无论是简单的文件操作,还是复杂的系统管理,Shell脚本都能提供高效、快速的解决方案。在本文中,我们将探索Shell脚本的基础知识,并通过实战场景示例,一起深入了解Shell脚本编程。 1. Shell脚

    2024年02月02日
    浏览(45)
  • 【Linux编程Shell自动化脚本】03 shell四剑客(find、sed、grep、awk)

    语法格式 参数说明 : path 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。 expression 是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。 1. 常用expression 以下列出

    2024年02月09日
    浏览(51)
  • 【Web自动化测试】(七)Selenium中执行JavaScript脚本

    相关文章链接: 【Web自动化测试】(一)Selenium介绍及安装部署说明 【Web自动化测试】(二)使用selenium编写测试用例 【Web自动化测试】(三)Selenium中控件定位方法 【Web自动化测试】(四)Selenium中WEB控件交互的方法 【Web自动化测试】(五)Selenium中的三种等待方式 【We

    2024年02月04日
    浏览(41)
  • 简单的Shell脚本实现自动化构建部署-适合前后端分离的小网站

    大家在生活中经常会自己写一点小代码。然后部署在公有云的服务器上。但是一般像阿里,腾讯等服务商,提供的机器内存并不是很大。如果想装入一个jenkins之类的服务,会比较占用CPU和内存的资源。但是人手的部署又是比较麻烦的。所以我这里提供了一个思路,使用shell脚

    2023年04月16日
    浏览(66)
  • python脚本——selenium自动化执行一些网页上的操作

    通过python的selenium模块,自动化执行一些网页上的重复的无聊的工作。 chromdriver下载地址

    2024年02月13日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包