Ответить на запрос пароля в child_process spawn nodejs - PullRequest
0 голосов
/ 11 января 2019

Нужна помощь в выяснении этого.

Я пытаюсь вызвать внешнее приложение через дочерний процесс spawn и после вызова приложения запрашивает пароль. Затем я получаю фатальную ошибку, и дочерний процесс завершается. Я пробовал несколько различных комбинаций, где разместить child.stdin.write ('somepassword \ n'), но я получаю ту же ошибку. Я думаю, что это связано с тем, что приложение не воспринимается ребенком как терминал.

Пример кода:

const { spawn } = require('child_process');

const child = spawn('./some-app',[arguments],{shell:true});

// process.stdin.pipe(child.stdin)

child.stdin.write('testpw\n'); // has no effect

child.stdout.on('data', (data) => {
    console.log(`child stdout:\n${data}`);
    //child.stdin.write('testpw\n'); // no effect here either
});

child.stdin.end(); 

child.stderr.on('data', (data) => {
    console.error(`child stderr:\n${data}`);
});

child.on('exit', function (code, signal) {
    console.log('child process exited with ' +
                `code ${code} and signal ${signal}`);
});

Terminal Output

> node spawn.js

child stdout:
Enter password: Fatal error:
  Unix.Unix_error(Unix.ENOTTY, "tcgetattr", "")

child process exited with code 1 and signal null

Ошибка заставляет меня поверить, что окружение, которое видит child_process, не tty, а поиск того, как заставить ребенка видеть его таким образом, отправляет меня в глубокую кроличью нору unix и не выделяется связанными с узлом ответы. Я запускаю это на Ubuntu 16.04 и с nodejs V10.15

Редактировать Если я изменю потоки stdio для child.stdin, у процесса больше не будет фатальной ошибки, а теперь просто будет сидеть и ждать ввода с клавиатуры пользователя. Но на экране отобразится запись в process.stdin.write (), но ребенок не ответит, если я физически не наберу на клавиатуре.

const { spawn } = require('child_process');

const child = spawn('./some-app',
                    [arguments],
                    {
                     shell:true,
                     stdio:['inherit','pipe','pipe']
                    });


child.stdout.on('data', (data) => {
    console.log(`child stdout:\n${data}`);
    process.stdin.write('testpw\n'); // displays but not handled by the 
                                     // process
}); 

child.stderr.on('data', (data) => {
    console.error(`child stderr:\n${data}`);
});

child.on('exit', function (code, signal) {
    console.log('child process exited with ' +
                `code ${code} and signal ${signal}`);
});

Terminal Output

> node spawn.js

child stdout:
Enter password:
testpw         <-- process sits here waiting for real keyboard input
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...