在节点子进程中读取stdin的问题

时间:2015-11-12 14:04:30

标签: node.js process stdin

我正在尝试使用节点child_process模块​​在Windows中执行命令。问题是有问题的应用程序(Windows中的ftp命令行)会提示输入用户名和密码。我试图通过以下方式向命令提供所询问的信息:

var ftp = spawn('ftp',['<<ip of server>>']); 
var authenticated = false;
var commandsSended = false;

ftp.stdin.write("debug\n");
ftp.stdin.write(os.EOL);

ftp.stdout.on("data", function(data) {
    console.log("FTPService: " + data.toString());
    if(data.toString().indexOf("226 Transfer complete") > -1) {
        ftp.stdin.write('bye\n');
    } else if(data.toString().indexOf("Gebruiker") > -1) {
        ftp.stdin.write("<<username of server>>");
        ftp.stdin.write(os.EOL);
    } else if(data.toString().indexOf("Wachtwoord") > -1) {
        ftp.stdin.write("<<password of server>>");
        ftp.stdin.write(os.EOL);
        authenticated = true;
    }
    if(authenticated && !commandsSended) {
        ftp.stdin.write("put " + filePath + " " + newName + "\n");
        commandsSended = true;
    }
});

ftp.on('exit', function(code) {
    if(code > 0) {
        console.log("FTPService closed with error " + code);
    } else {
        console.log("FTPService closed without error");
    }
});

这不会导致错误,但根本不起作用。在linux中我没有问题,因为我可以使用命令将登录信息作为参数发送。我知道nodejs有它自己的模块,但我需要让它使用命令行(还需要执行其他命令,这也会导致需要填写的提示)。

1 个答案:

答案 0 :(得分:0)

开发Node应用程序的一个好习惯是尽可能使您的应用程序成为混合应用程序。当我说混合时,我的意思是它应该在它支持的各种操作系统上以相同和无缝的方式运行。在您的情况下,这意味着放弃对内置于Windows或Linux的第三方FTP的支持,并使用专门为Node构建的FTP客户端软件包。

Node有很多FTP客户端软件包,这里有一个积极开发的软件包:node-ftp。 另一个有更多年的背后是jsftp,它允许你挂钩到原始的FTP套接字连接,并将任意FTP命令写入服务器。