无法使用交互式脚本获取child_process.spawn的输出

时间:2013-12-11 09:26:11

标签: node.js spawn child-process

我无法在以下代码中获得任何输出:

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

当产生这个脚本时,我希望获取提示“你的名字>”使用数据事件,以便我可以将后者输入到stdin中。

问题是我在数据事件中什么都没有,似乎没有触发这些事件。

2 个答案:

答案 0 :(得分:3)

lscat可通过输入输出和错误流进行控制。

ftptelnet可通过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

答案 1 :(得分:2)

在交互模式下,有一个命令解释器,它从stdin读取用户输入,然后依次打印输出。所以你必须写stdin做某事。例如,使用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