NodeJS. Child_process.spawn. Manejar el post de input del process

Actualmente estoy trabajando en mi interfaz web para git. Accediendo a git por child_process.spawn. Todo está bien mientras hay un mecanismo simple de "command -> respuesta", pero no puedo entender qué debo hacer con los commands (por ejemplo, git fetch pide una contraseña). Hipotéticamente, hay algún evento disparado, pero no sé qué escuchar. Todo lo que veo es " [email protected]'s password: _ " en la command-line donde se está ejecutando el process node.js.

Sería genial networkingirigir esta request a mi aplicación web, pero ¿es posible?

Intenté escuchar message , data , pipe , end , close , readable en todas las transmisiones (stdout, stdin, stderr), pero nadie dispara la request de contraseña.

Aquí está mi solución de trabajo (sin experimentos mencionados):

 var out=""; var err=""; var proc=spawn(exe,cmd); proc.on("exit",function(exitCode){ }); proc.stdout.on("data",function(data){ out+=data; }); proc.stderr.on("data",function(data){ err+=data; }); proc.on("close",function(code){ if(!code)func(out); else return errHandler(err); }); 

¿Puedes ayudarme con mis investigaciones?

ACTUALIZAR

Situación actual: en mi interfaz web de GIT, hay un button "FETCH" (como un ejemplo, para un simple "git fetch"). Cuando lo presiono, la request http se genera y se envía al server node.js creado por http.createServer(callback).listen(8080) . callback function de callback recibe mi request y crea child_process.spawn('git',['-C','path/to/local/repo','fetch']) . Todo este time veo solo la pantalla de carga en mi interfaz web, pero si cambio a la window de línea de command donde se ejecuta la secuencia de commands del nodo, veré una request de contraseña. Ahora pretendamos que no puedo cambiar de window a console, porque trabajo de forma remota.

Deseo ver la request de contraseña en mi interfaz web. Sería muy fácil de lograr si, por ejemplo, child_process emitiera algún evento en child.stdin (o en otro lugar) cuando se child.stdin la input del usuario. En ese caso, enviaría un string "Vamos, amigo, ¡Git quiere saber tu contraseña! Introdúcela aquí: _______" de vuelta al cliente web (por response.end(str) ), y seguirá esperando la siguiente connection http con la respuesta del cliente, que contiene la contraseña deseada. Luego simplemente child.stdin.write(pass) a process de git).

¿Es posible esta solución? O algo que NO implica línea de command con el process principal.

ACTUALIZACIÓN2

Solo intenté adjuntar oyentes a todos los events posibles descritos en la documentation oficial: stdout y stderr (legible, datos, final, cerrar, error), stdin (drenar, finalizar, canalizar, eliminar, error), hijo (post, salir, cerrar, desconectar, post).

Probé con los mismos oyentes en process.stdout, process.stderr luego de que la tubería git se transmite a él.

No se dispara nada en la request de contraseña …

La razón principal por la cual su código no funciona es porque usted solo descubre qué sucedió con su process de Git después de que fue ejecutado.

La principal razón para usar spawn es porque el process generado se puede configurar, y stdout y stderr son transmisiones legibles en el process principal.

Acabo de probar este código y funcionó bastante bien. Aquí hay un ejemplo de un process de desove para realizar un empuje de git. Sin embargo, como sabrás, git te pedirá tu nombre de usuario y contraseña.

 var spawn = require('child_process').spawn; var git = spawn('git', ['push', 'origin', 'master']); git.stderr.on('data', function(data) { // do something with it }); git.stderr.pipe(process.stderr); git.stdout.pipe(process.stdout); 
  1. Haga un repository de git local y configure las cosas para que pueda hacer el command de inserción anterior. Sin embargo, realmente puedes hacer cualquier command git.
  2. Copie esto en un file llamado git_process.js.
  3. Ejecutar con el nodo git_process.js

No sé si esto ayudaría pero encontré que la única forma de interceptar las requestes de los processs secundarios era establecer la opción separada en verdadero cuando genera un nuevo process secundario.

Al igual que usted, no pude encontrar información sobre las requestes del process hijo en el nodo en las networkinges internas. Uno podría sospechar que debería ir a stdout y luego tendría que escribir en stdin. Si recuerdo correctamente, es posible que el post se envíe a stderr.

Es un poco sorprendente para mí que otros no hayan tenido este problema. Tal vez solo lo estamos haciendo mal.

    Intereting Posts