我无法在以下代码中获得任何输出:
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中。
问题是我在数据事件中什么都没有,似乎没有触发这些事件。
答案 0 :(得分:3)
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
答案 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