Capture input in the child process after spawn in node












1















I'm working on a small cli tool that can automatically deploy Google Home actions based on the projects that are setup in a directory.



Basically my script checks the directories and then asks which project to deploy. The actual command that should run is coming from Google's cli gactions



To run it with arguments I setup a spawned process in my node-script:



const { spawn } = require('child_process')
const child = spawn('./gactions', [
'update',
'--action-package',
'<PATH-TO-PACKAGE>',
'--project',
'<PROJECT-NAME>'
])

child.stdout.on('data', data => {
console.log(data)
}


However, the first time a project is deployed, the gactions cli will prompt for an authorization code. Running the code above, I can actually see the prompt, but the script won't proceed when actually entering that code.



I guess there must be some way in the child process to capture that input? Or isn't this possible at all?










share|improve this question

























  • The child process's stdin, stdout, and stderr are streams, so you can manipulate them as you like. The node documentation gives you a very simple example as a starting point.

    – lependu
    Nov 19 '18 at 15:00











  • Ok. But how do I capture that input when prompted for?

    – Maarten
    Nov 19 '18 at 16:03
















1















I'm working on a small cli tool that can automatically deploy Google Home actions based on the projects that are setup in a directory.



Basically my script checks the directories and then asks which project to deploy. The actual command that should run is coming from Google's cli gactions



To run it with arguments I setup a spawned process in my node-script:



const { spawn } = require('child_process')
const child = spawn('./gactions', [
'update',
'--action-package',
'<PATH-TO-PACKAGE>',
'--project',
'<PROJECT-NAME>'
])

child.stdout.on('data', data => {
console.log(data)
}


However, the first time a project is deployed, the gactions cli will prompt for an authorization code. Running the code above, I can actually see the prompt, but the script won't proceed when actually entering that code.



I guess there must be some way in the child process to capture that input? Or isn't this possible at all?










share|improve this question

























  • The child process's stdin, stdout, and stderr are streams, so you can manipulate them as you like. The node documentation gives you a very simple example as a starting point.

    – lependu
    Nov 19 '18 at 15:00











  • Ok. But how do I capture that input when prompted for?

    – Maarten
    Nov 19 '18 at 16:03














1












1








1


1






I'm working on a small cli tool that can automatically deploy Google Home actions based on the projects that are setup in a directory.



Basically my script checks the directories and then asks which project to deploy. The actual command that should run is coming from Google's cli gactions



To run it with arguments I setup a spawned process in my node-script:



const { spawn } = require('child_process')
const child = spawn('./gactions', [
'update',
'--action-package',
'<PATH-TO-PACKAGE>',
'--project',
'<PROJECT-NAME>'
])

child.stdout.on('data', data => {
console.log(data)
}


However, the first time a project is deployed, the gactions cli will prompt for an authorization code. Running the code above, I can actually see the prompt, but the script won't proceed when actually entering that code.



I guess there must be some way in the child process to capture that input? Or isn't this possible at all?










share|improve this question
















I'm working on a small cli tool that can automatically deploy Google Home actions based on the projects that are setup in a directory.



Basically my script checks the directories and then asks which project to deploy. The actual command that should run is coming from Google's cli gactions



To run it with arguments I setup a spawned process in my node-script:



const { spawn } = require('child_process')
const child = spawn('./gactions', [
'update',
'--action-package',
'<PATH-TO-PACKAGE>',
'--project',
'<PROJECT-NAME>'
])

child.stdout.on('data', data => {
console.log(data)
}


However, the first time a project is deployed, the gactions cli will prompt for an authorization code. Running the code above, I can actually see the prompt, but the script won't proceed when actually entering that code.



I guess there must be some way in the child process to capture that input? Or isn't this possible at all?







javascript node.js spawn google-home






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 26 '18 at 16:35









mihai

23.7k74068




23.7k74068










asked Nov 19 '18 at 14:37









MaartenMaarten

270417




270417













  • The child process's stdin, stdout, and stderr are streams, so you can manipulate them as you like. The node documentation gives you a very simple example as a starting point.

    – lependu
    Nov 19 '18 at 15:00











  • Ok. But how do I capture that input when prompted for?

    – Maarten
    Nov 19 '18 at 16:03



















  • The child process's stdin, stdout, and stderr are streams, so you can manipulate them as you like. The node documentation gives you a very simple example as a starting point.

    – lependu
    Nov 19 '18 at 15:00











  • Ok. But how do I capture that input when prompted for?

    – Maarten
    Nov 19 '18 at 16:03

















The child process's stdin, stdout, and stderr are streams, so you can manipulate them as you like. The node documentation gives you a very simple example as a starting point.

– lependu
Nov 19 '18 at 15:00





The child process's stdin, stdout, and stderr are streams, so you can manipulate them as you like. The node documentation gives you a very simple example as a starting point.

– lependu
Nov 19 '18 at 15:00













Ok. But how do I capture that input when prompted for?

– Maarten
Nov 19 '18 at 16:03





Ok. But how do I capture that input when prompted for?

– Maarten
Nov 19 '18 at 16:03












1 Answer
1






active

oldest

votes


















0














Simply pipe all standard input from the parent process to the child and all output from the child to the parent.



The code below is a full wrapper around any shell command, with input/output/error redirection:



const { spawn } = require('child_process');
var child = spawn(command, args);

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
process.stdin.pipe(child.stdin);

child.on('exit', () => process.exit())


Note that if you pipe stdout you don't need handle the data event anymore.






share|improve this answer


























  • That worked. I probably need to read-up some more about piping data in node. Any recommendations by any chance for good documentation on this subject?

    – Maarten
    Nov 26 '18 at 16:12











  • you should read about working with streams, that's the wider topic. The official node docs about Stream is a good starting point, but you can always google for more

    – mihai
    Nov 26 '18 at 16:18











  • Cool. Thanks mihai!

    – Maarten
    Nov 26 '18 at 16:24











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53376908%2fcapture-input-in-the-child-process-after-spawn-in-node%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









0














Simply pipe all standard input from the parent process to the child and all output from the child to the parent.



The code below is a full wrapper around any shell command, with input/output/error redirection:



const { spawn } = require('child_process');
var child = spawn(command, args);

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
process.stdin.pipe(child.stdin);

child.on('exit', () => process.exit())


Note that if you pipe stdout you don't need handle the data event anymore.






share|improve this answer


























  • That worked. I probably need to read-up some more about piping data in node. Any recommendations by any chance for good documentation on this subject?

    – Maarten
    Nov 26 '18 at 16:12











  • you should read about working with streams, that's the wider topic. The official node docs about Stream is a good starting point, but you can always google for more

    – mihai
    Nov 26 '18 at 16:18











  • Cool. Thanks mihai!

    – Maarten
    Nov 26 '18 at 16:24
















0














Simply pipe all standard input from the parent process to the child and all output from the child to the parent.



The code below is a full wrapper around any shell command, with input/output/error redirection:



const { spawn } = require('child_process');
var child = spawn(command, args);

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
process.stdin.pipe(child.stdin);

child.on('exit', () => process.exit())


Note that if you pipe stdout you don't need handle the data event anymore.






share|improve this answer


























  • That worked. I probably need to read-up some more about piping data in node. Any recommendations by any chance for good documentation on this subject?

    – Maarten
    Nov 26 '18 at 16:12











  • you should read about working with streams, that's the wider topic. The official node docs about Stream is a good starting point, but you can always google for more

    – mihai
    Nov 26 '18 at 16:18











  • Cool. Thanks mihai!

    – Maarten
    Nov 26 '18 at 16:24














0












0








0







Simply pipe all standard input from the parent process to the child and all output from the child to the parent.



The code below is a full wrapper around any shell command, with input/output/error redirection:



const { spawn } = require('child_process');
var child = spawn(command, args);

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
process.stdin.pipe(child.stdin);

child.on('exit', () => process.exit())


Note that if you pipe stdout you don't need handle the data event anymore.






share|improve this answer















Simply pipe all standard input from the parent process to the child and all output from the child to the parent.



The code below is a full wrapper around any shell command, with input/output/error redirection:



const { spawn } = require('child_process');
var child = spawn(command, args);

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
process.stdin.pipe(child.stdin);

child.on('exit', () => process.exit())


Note that if you pipe stdout you don't need handle the data event anymore.







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 22 '18 at 14:22

























answered Nov 22 '18 at 14:08









mihaimihai

23.7k74068




23.7k74068













  • That worked. I probably need to read-up some more about piping data in node. Any recommendations by any chance for good documentation on this subject?

    – Maarten
    Nov 26 '18 at 16:12











  • you should read about working with streams, that's the wider topic. The official node docs about Stream is a good starting point, but you can always google for more

    – mihai
    Nov 26 '18 at 16:18











  • Cool. Thanks mihai!

    – Maarten
    Nov 26 '18 at 16:24



















  • That worked. I probably need to read-up some more about piping data in node. Any recommendations by any chance for good documentation on this subject?

    – Maarten
    Nov 26 '18 at 16:12











  • you should read about working with streams, that's the wider topic. The official node docs about Stream is a good starting point, but you can always google for more

    – mihai
    Nov 26 '18 at 16:18











  • Cool. Thanks mihai!

    – Maarten
    Nov 26 '18 at 16:24

















That worked. I probably need to read-up some more about piping data in node. Any recommendations by any chance for good documentation on this subject?

– Maarten
Nov 26 '18 at 16:12





That worked. I probably need to read-up some more about piping data in node. Any recommendations by any chance for good documentation on this subject?

– Maarten
Nov 26 '18 at 16:12













you should read about working with streams, that's the wider topic. The official node docs about Stream is a good starting point, but you can always google for more

– mihai
Nov 26 '18 at 16:18





you should read about working with streams, that's the wider topic. The official node docs about Stream is a good starting point, but you can always google for more

– mihai
Nov 26 '18 at 16:18













Cool. Thanks mihai!

– Maarten
Nov 26 '18 at 16:24





Cool. Thanks mihai!

– Maarten
Nov 26 '18 at 16:24


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53376908%2fcapture-input-in-the-child-process-after-spawn-in-node%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

How to change which sound is reproduced for terminal bell?

Title Spacing in Bjornstrup Chapter, Removing Chapter Number From Contents

Can I use Tabulator js library in my java Spring + Thymeleaf project?