2016-01-25 19 views
7

Chcę zautomatyzować tworzenie i wyodrębnianie magazynu kluczy. Problem, przed którym stoję, polega na tym, w jaki sposób dołączyć do poleceń, używając "| "symbol lub podobne rozwiązanie.Węzeł child_process.spawn wielu poleceń

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

Czy moja odpowiedź Ci pomogła? – Chev

Odpowiedz

5

| symbol w wierszu poleceń jest nazywany „orurowanie”, bo to jak strumienie danych rurociągowych razem. To, czego potrzebujesz, to pobranie strumieni stdin (Standard In) i stdout (Standard Out) dla wykonywanych poleceń.

Na przykład, to jak byś tarło echa polecenie i rurę To wyjście do 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); 

Powyższy przykład ikra zarówno „Echo” i „grep” poleceń. Przetwarza dowolne wyjście ze strumienia echo procesu na strumień do strumienia . Na koniec przesyłamy strumień grep procesu stdout do strumienia macierzystego (proces twojego węzła) stdin, aby można było zobaczyć wyjście w terminalu.

Na wyjściu pojawi się "Szybki brązowy lis", ponieważ umieszczam znak nowego wiersza w środku, a grep pasuje tylko do pierwszej linii zawierającej "brązowy". Aby uzyskać taki sam wynik, można użyć funkcji exec. Może być trudniej utrzymać w przyszłości, ale jeśli potrzebujesz tylko szybkiego uruchomienia zestawu poleceń potokowych, możesz wprowadzić pełny ciąg linii komend (w tym symbole potoków) i przekazać go do 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); 
}); 

Albo zamiast przechodzącą w funkcji zwrotnej może po prostu rura wyjście do process.stdin jeśli wszystko obchodzi widzi wyjście polecenia.

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

Oto krótki przykład co wierzę Twój kod powinien wyglądać użyciu spawn. Może wymagać poprawek, ponieważ wydaje się to charakterystyczne dla tego, co robisz.

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

lub używając 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

Od node.js V6 można określić opcję w spawn metody, które będą uruchamiane przy użyciu polecenia powłoki, a zatem możliwe jest poleceń łańcucha stosując metodę odradzania shell.

Na przykład w ten sposób:

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

wywoła błąd na wersji node.js mniej niż 6:

Error: spawn ls && ls && ls ENOENT 

Ale w wersji 6 lub wyższej powróci oczekiwany wynik:

node app.js 
STDOUT: app.js 

STDOUT: app.js 
app.js 

Child exited with code: 0 
Powiązane problemy