nodejs执行显示控制台进度的scp

时间:2015-04-08 18:20:22

标签: node.js scp spawn

我在节点应用程序中使用scp命令将文件传输到服务器; 我无法在控制台中显示传输过程中的进度,因为“scp”通常会在shell中手动使用它; 这是我的代码:

//require system modules
var spawn = require('child_process').spawn;

console.log("copy begins...");

var executor = spawn("scp", ["-r", ".tmp/app.tar.gz", "user@server:/home/user"]);

executor.stderr.on('data', function(data) {
    console.log(data.toString());
});

executor.stdout.on('data', function(data) {
    console.log(data.toString());
});

executor.stdout.on('end', function(data) {
    console.log("copied");
});

executor.on('close', function(code) {
    if (code !== 0) {
        console.log('Failed: ' + code);
    }
});

这只是登录控制台“复制开始...”和“复制”,但没有别的; 是否可以在执行期间获取scp命令的输出并将其发送到控制台?

1 个答案:

答案 0 :(得分:3)

如果标准输出为TTY,

scp仅输出所谓的“进度表”:

$ scp localhost:/etc/passwd . 
passwd                                        100% 5253     5.1KB/s   00:00    
$ scp localhost:/etc/passwd . | cat
$ 

所以你的程序必须安排scp进程的标准输出为TTY或PTY(伪tty)。

我不是节点程序员,因此我无法为您提供如何执行此操作的完整示例。您可以尝试通过scp计划运行expect。它能够分配PTY并通过它们运行子进程。或者,似乎节点有一个'tty'模块,它可能能够做你想要的。 This question讨论了从节点到tty运行vim的问题。你也许可以使用相同的方法。