2016-01-25 12 views
7

Desidero automatizzare la creazione e l'estrazione del keystore. Il problema che sto affrontando è come unire i comandi usando '| 'simbolo o soluzione simile.Nodo child_process.spawn comandi multipli

//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

La mia risposta ti ha aiutato? – Chev

risposta

5

La | simbolo sulla riga di comando si chiama "piping" perché è come flussi di tubazioni di dati insieme. Quello che vuoi è ottenere i flussi stdin (Standard In) e stdout (Standard Out) per i comandi che stai eseguendo.

Ad esempio, questo è come è possibile generare il comando echo tubo è output 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); 

L'esempio sopra genera entrambe le "eco" e comandi "grep". Canalizza qualsiasi output dal flusso stdout del processo al flusso stdin del processo grep. Infine canalizziamo lo stream stdout del processo grep nel flusso del processo genitore (processo del nodo) stdin in modo da poter vedere l'output nel terminale.

L'output sarebbe "The quick brown fox" perché ho inserito un carattere di nuova riga nel mezzo e il grep ha trovato solo la prima riga che contiene "brown".

È possibile utilizzare la funzione exec per ottenere lo stesso risultato. Potrebbe essere più difficile da mantenere in futuro, ma se tutto ciò di cui hai bisogno è eseguire rapidamente una serie di comandi in pipe, puoi inserire l'intera stringa della riga di comando (compresi i simboli pipe) e passarla a 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); 
}); 

O invece di passare nella funzione di callback si poteva solo inviare l'output a process.stdin se tutto ciò che interessa è vedere l'output del comando.

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

Ecco un rapido esempio di quello che io credo il codice dovrebbe essere simile utilizzando spawn. Può richiedere modifiche poiché sembra specifico per quello che stai facendo.

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.')); 
}); 

o utilizzando 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

Da Node.js v6 è possibile specificare l'opzione shell in spawn metodo che verrà eseguito comando utilizzando shell e quindi è possibile comandi a catena con il metodo di spawn. risultato

Error: spawn ls && ls && ls ENOENT 

Ma in versione 6 e superiori sarà rendimento atteso::

Per esempio, questo:

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

attiverà un errore sulla versione node.js meno di 6

node app.js 
STDOUT: app.js 

STDOUT: app.js 
app.js 

Child exited with code: 0 
Problemi correlati