本文最后更新于 2024-08-27T14:59:49+00:00
Node.js执行Shell
在 Node.js 中执行 Shell 命令有多种方法。以下是几种常用的方法:
child_process
模块:
使用 exec 方法执行 Shell 命令
1 2 3 4 5 6 7 8 9 10
| const { exec } = require('child_process');
exec('ls -a', (error, stdout, stderr) => { if (error) { console.error(`执行命令出错: ${error}`); return; } console.log(`标准输出: ${stdout}`); console.error(`错误输出: ${stderr}`); });
|
使用 spawn 方法执行 Shell 命令
1 2 3 4 5 6 7 8 9 10 11 12
| const { spawn } = require('child_process');
const ls = spawn('ls', ['-a']); ls.stdout.on('data', (data) => { console.log(`标准输出: ${data}`); }); ls.stderr.on('data', (data) => { console.error(`错误输出: ${data}`); }); ls.on('close', (code) => { console.log(`子进程退出码: ${code}`); });
|
execSync
方法:
1 2 3 4 5 6 7 8
| const { execSync } = require('child_process');
try { const stdout = execSync('ls -a'); console.log(`标准输出: ${stdout}`); } catch (error) { console.error(`执行命令出错: ${error}`); }
|
shelljs
模块:
1 2 3 4 5 6 7 8 9
| const shell = require('shelljs');
const result = shell.exec('ls -a'); if (result.code !== 0) { console.error(`执行命令出错: ${result.stderr}`); return; } console.log(`标准输出: ${result.stdout}`);
|
execa
模块
提供了一个简单且强大的接口来执行外部命令
1 2 3 4 5 6 7 8 9 10
| const execa = require('execa');
(async () => { try { const { stdout } = await execa('ls', ['-a']); console.log(`标准输出: ${stdout}`); } catch (error) { console.error(`执行命令出错: ${error}`); } })();
|
node-pty
模块
这是一个伪终端的库,允许你与 Shell 进行交互式通信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const os = require('os'); const pty = require('node-pty');
const shell = os.platform() === 'win32' ? 'cmd.exe' : 'bash'; const ptyProcess = pty.spawn(shell, [], { name: 'xterm-color', cols: 80, rows: 30, cwd: process.cwd(), env: process.env });
ptyProcess.on('data', (data) => { console.log(`输出: ${data}`); });
ptyProcess.write('ls -a\r');
|
shelljs-exec-proxy
模块
这是一个对 shelljs
的封装,提供了更简洁的方式来执行 Shell 命令并处理输出。
1 2 3 4 5 6 7 8
| const shell = require('shelljs-exec-proxy');
const { code, stdout, stderr } = shell('ls -a'); if (code !== 0) { console.error(`执行命令出错: ${stderr}`); return; } console.log(`标准输出: ${stdout}`);
|
simple-git
模块
这是一个用于管理 Git 仓库的库,它也提供了执行 Shell 命令的功能。
1 2 3 4 5 6 7 8 9 10
| const simpleGit = require('simple-git');
const git = simpleGit(); git.raw(['ls-files', '-z'], (error, result) => { if (error) { console.error(`执行命令出错: ${error}`); return; } console.log(`标准输出: ${result}`); });
|
ssh2
模块
这是一个用于通过 SSH 执行 Shell 命令的库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const Client = require('ssh2').Client;
const conn = new Client(); conn.on('ready', () => { conn.exec('ls -a', (error, stream) => { if (error) { console.error(`执行命令出错: ${error}`); return; } stream.on('close', (code, signal) => { console.log(`子进程退出码: ${code}`); conn.end(); }).on('data', (data) => { console.log(`标准输出: ${data}`); }).stderr.on('data', (data) => { console.error(`错误输出: ${data}`); }); }); }).connect({ host: 'example.com', username: 'username', password: 'password' });
|
cross-spawn
模块
这是一个跨平台的库,可以在 Windows 和 Unix 系统上执行 Shell 命令。
1 2 3 4 5 6 7 8 9 10 11 12
| const spawn = require('cross-spawn');
const ls = spawn('ls', ['-a']); ls.stdout.on('data', (data) => { console.log(`标准输出: ${data}`); }); ls.stderr.on('data', (data) => { console.error(`错误输出: ${data}`); }); ls.on('close', (code) => { console.log(`子进程退出码: ${code}`); });
|
shell-exec
模块
这是另一个对 Shell 命令的封装,它提供了一个简单的接口来执行命令并处理输出。
1 2 3 4 5 6 7 8 9 10
| const shellExec = require('shell-exec');
(async () => { const result = await shellExec('ls -a'); if (result.code !== 0) { console.error(`执行命令出错: ${result.stderr}`); return; } console.log(`标准输出: ${result.stdout}`); })();
|
当然,还有一些其他的方法:
node-pty
模块
这是一个能够让你生成一个伪终端并与其中运行 Shell 命令的库。它在计算机和服务器上都可以工作,并使你能够与 Shell 交互。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const os = require('os'); const pty = require('node-pty');
const term = pty.spawn(os.platform() === 'win32' ? 'cmd.exe' : 'bash', [], { name: 'xterm-color', cwd: process.env.HOME, env: process.env });
term.onData((data) => { console.log(`输出: ${data}`); });
term.write('ls\r');
|
runas
模块
这个库允许你在 Windows 系统上以管理员身份运行 Shell 命令。
1 2 3 4 5 6 7 8 9 10
| const runas = require('runas');
try { runas('%windir%\\system32\\ipconfig.exe /all', { admin: true, hide: true }); } catch (error) { console.error(`执行命令出错: ${error}`); }
|
node-cmd
模块
这是一个能够在 Node.js 中执行 Shell 命令的简单库,它提供了简洁的接口。
1 2 3 4 5 6 7 8 9 10
| const cmd = require('node-cmd');
cmd.get('ls -a', (error, stdout, stderr) => { if (error) { console.error(`执行命令出错: ${error}`); return; } console.log(`标准输出: ${stdout}`); console.error(`错误输出: ${stderr}`); });
|