簡體   English   中英

節點child_process.spawn多個命令

[英]Node child_process.spawn multiple commands

我想自動創建和提取密鑰庫。 我面臨的問題是如何使用' |來加入命令 '符號或類似的解決方案。

//Original Command    
var command='keytool -exportcert -storepass mypass -keypass mypass  
-alias myalias -keystore mykey.keystore | openssl sha1 -binary | openssl base64';

//Arguments for the spawn    
var keyArgs = [
      '-exportcert',
      '-storepass','mypass',
      '-keypass','mypass',
      '-alias','myalias',
      '-keystore',"myjey.keystore",


      'openssl','sha1',
      '-binary',
      'openssl','base64',


  ];
exec('keytool',keyArgs,{cwd:appCreateFolder+"/"+opt.id+"/Certificates"},function(e){
    console.log(chalk.cyan('Key created'));
      })

從Node.js v6中,您可以在spawn方法中指定一個shell選項,它將使用shell運行命令,因此可以使用spawn方法鏈接命令

例如:

var spawn = require('child_process').spawn;
var child = spawn('ls && ls && ls', {
  shell: true
});
child.stderr.on('data', function (data) {
  console.error("STDERR:", data.toString());
});
child.stdout.on('data', function (data) {
  console.log("STDOUT:", data.toString());
});
child.on('exit', function (exitCode) {
  console.log("Child exited with code: " + exitCode);
});

將在node.js版本小於6時觸發錯誤:

Error: spawn ls && ls && ls ENOENT

但是在版本6及更高版本上它將返回預期結果:

node app.js
STDOUT: app.js

STDOUT: app.js
app.js

Child exited with code: 0

| 命令行上的符號稱為“管道”,因為它就像管道數據流一樣。 你想要的是獲得你正在執行的命令的stdin (標准輸入)和stdout (標准輸出)流。

例如,這是如何生成echo命令並將其輸出傳遞給grep:

var spawn = require('child_process').spawn;
var echo = spawn('echo', ['The quick brown fox\njumped over the lazy dog.']);
var grep = spawn('grep', ['brown']);

echo.stdout.pipe(grep.stdin);
grep.stdout.pipe(process.stdin);

上面的例子產生了“echo”和“grep”命令。 它將echo進程的stdout流的任何輸出傳遞給grep進程的stdin流。 最后,我們將grep進程的stdout流傳stdout父進程(您的節點進程) stdin流,以便您可以在終端中看到輸出。

輸出將是“快速棕色狐狸”,因為我在中間放置了換行符,而grep只匹配包含“brown”的第一行。

您可以使用exec函數來實現相同的結果。 可能在將來可能更難維護,但如果您只需快速運行一組管道命令,則可以輸入完整的命令行字符串(包括管道符號)並將其傳遞給exec

var exec = require('child_process').exec;
var cmdString = 'grep "The quick brown fox\njumped over the lazy dog." | grep "brown"';
exec(cmdString, (err, stdout, stderr) => {
  console.log(stdout);
});

或者,如果您只關心命令輸出,則可以將輸出傳遞給process.stdin而不是傳入回調函數。

exec(cmdString).stdout.pipe(process.stdin);

這是一個簡單的例子,我相信你的代碼應該像使用spawn 可能需要調整,因為它似乎特定於你正在做的事情。

var keyArgs = [
  '-exportcert',
  '-storepass','mypass',
  '-keypass','mypass',
  '-alias','myalias',
  '-keystore',"myjey.keystore",
  'openssl','sha1',
  '-binary',
  'openssl','base64',
];
var keyOpts = {
  cwd: `${appCreateFolder}/${opt.id}/Certificates`
};

var spawn = require('child_process').spawn;
var keytool = spawn('keytool', keyArgs, keyOpts);
var opensslBinary = spawn('openssl', ['sha1', '-binary']);
var opensslBase64 = spawn('openssl', ['base64']);

keytool.stdout.pipe(opensslBinary.stdin);
opensslBinary.stdout.pipe(opensslBase64.stdin);
opensslBase64.stdout.pipe(process.stdin);

opensslBase64.on('close', () => {
  console.log(chalk.cyan('Key created.'));
});

或者使用exec

var exec = require('child_process').exec;
var cmdString = 'keytool -exportcert -storepass mypass -keypass mypass -alias myalias -keystore mykey.keystore | openssl sha1 -binary | openssl base64';
var cmdOpts = {
  cwd: `${appCreateFolder}/${opt.id}/Certificates`
};
exec(cmdString, cmdOpts, () => {
  console.log(chalk.cyan('Key created.'));
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM