Не удается получить вывод child_process.spawn с помощью интерактивных скриптов.

Я не могу получить вывод в следующем коде:

var spawn = require('child_process').spawn,
    script = 'ftp',
    child = spawn(script);

child.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

child.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

child.on('close', function (code) {
  console.log('child process exited with code ' + code);
});

Он работает для обычных сценариев, таких как «ls», «pwd» и т. д. Но не для интерактивных программ, таких как «ftp», «telnet». Какие-либо предложения?


Редактировать:

Возьмем, к примеру, другой скрипт:

#!/usr/bin/env python
name = raw_input("your name>")
print name

При запуске этого скрипта я хочу получить подсказку «ваше имя>» с событием данных, чтобы позже я мог ввести что-то в стандартный ввод.

Проблема в том, что я ничего не получил в событии данных, и казалось, что ни одно из этих событий не срабатывает.


person Dong    schedule 11.12.2013    source источник
comment
В основном это сводится к тому, что telnet и ftp обрабатывают ввод и вывод самостоятельно. Попробуйте найти настройки этих программ, где они могли бы выполнять свои задачи в некоем автономном режиме.   -  person TheHippo    schedule 11.12.2013
comment
В противном случае я бы предложил использовать для задач определенные пакеты узлов: npmjs.org/package/telnet и github.com/mscdex/node-ftp   -  person TheHippo    schedule 11.12.2013
comment
@TheHippo Я думаю, что вывод связан с child.stdout.   -  person Dong    schedule 11.12.2013


Ответы (2)


ls, cat управляются через ввод-вывод и поток ошибок.

ftp, telnet управляются косвенно через tty.

Протокол также основан на потоке ввода/вывода, но он более сложен. Вы можете использовать доступный пакет для обработки этого протокола.

https://github.com/chjj/pty.js

var pty = require('pty.js');
var term = pty.spawn('ftp', [], options);

term.on('data', function(data) {
  console.log(data);
});

term.write(ftpCmd + '\r');

У автора pty есть несколько интересных примеров, он пересылает pty в сеть через веб-сокет, включая терминальные игры: https://github.com/chjj/tty.js

person damphat    schedule 11.12.2013

В интерактивном режиме имеется интерпретатор команд, который считывает пользовательский ввод со стандартного ввода, а затем соответствующим образом выводит вывод. Поэтому вам нужно написать на стандартный ввод, чтобы что-то сделать. Например, добавьте следующие строки в свой код с помощью команды telnet:

child.stdin.write('?\n');
child.stdin.write('quit\n');

Выход:

stdout: Commands may be abbreviated.  Commands are:

!               cr              mdir            proxy           send
$               delete          mget            sendport        site
account         debug           mkdir           put             size
append          dir             mls             pwd             status
ascii           disconnect      mode            quit            struct
bell            form            modtime         quote           system
binary          get             mput            recv            sunique
bye             glob            newer           reget           tenex
case            hash            nmap            rstatus         trace
ccc             help            nlist           rhelp           type
cd              idle            ntrans          rename          user
cdup            image           open            reset           umask
chmod           lcd             passive         restart         verbose
clear           ls              private         rmdir           ?
close           macdef          prompt          runique
cprotect        mdelete         protect         safe

child process exited with code 0
person user568109    schedule 11.12.2013
comment
На самом деле, если вы запускаете команду ftp в оболочке Linux, появляется приглашение: ftp›. Могу ли я получить это приглашение из события данных stdout? - person Dong; 11.12.2013
comment
Я думаю, что это не относится к telnet или ftp. Подсказка для tty. Все, что он делает, это изменяет переменную PS1 среды tty, которая содержит ваше приглашение. Если вам нужна функциональность, подобная интерпретатору командной строки, вы должны использовать readline. У него есть подсказка. - person user568109; 11.12.2013
comment
Просто создайте экземпляр readline и подключите его к процессу ftp или telnet, установив приглашение. - person user568109; 11.12.2013