2016-01-25 3 views
7

Я хочу автоматизировать создание и извлечение хранилища ключей. Проблема, с которой я сталкиваюсь, - это как присоединиться к командам с помощью '| 'или аналогичное решение.Узел 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')); 
     }) 
+0

Помог ли мой ответ? – Chev

ответ

5

| символ в командной строке называется «трубопровод», потому что это, как трубопроводные потоки данных вместе. Вы хотите получить столы stdin (Standard In) и stdout (Standard Out) для команд, которые вы выполняете.

Например, это то, как вы породит эхо команды и свирели его вывод к 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); 

Приведенный выше пример порождает оба «эхо» и команды «Grep». Он передает любой вывод из потока echo процесса stdout в поток grep процесса stdin. Наконец, мы передаем поток grep процесса stdout в процесс родительского процесса (ваш узел) stdin, чтобы вы могли видеть результат в своем терминале.

Выход будет «Быстрая коричневая лиса», потому что я положил символ новой строки в середине, и grep только соответствовал первой строке, содержащей «коричневый».

Вы можете использовать функцию 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.')); 
}); 
10

С Node.js v6 можно указать 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