Capture input in the child process after spawn in node
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
add a comment |
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
The child process'sstdin
,stdout
, andstderr
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
add a comment |
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
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
javascript node.js spawn google-home
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'sstdin
,stdout
, andstderr
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
add a comment |
The child process'sstdin
,stdout
, andstderr
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
add a comment |
1 Answer
1
active
oldest
votes
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.
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
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
add a comment |
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.
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
add a comment |
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.
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.
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
The child process's
stdin
,stdout
, andstderr
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