【问题标题】:How do I stream large files over ssh in Node?如何在 Node 中通过 ssh 流式传输大文件?
【发布时间】:2015-08-14 10:13:39
【问题描述】:

我正在尝试使用 ssh2 模块流式传输 cat 命令,但它只是在执行的某个时间点挂起。我正在执行cat there.txt where.txt 大约 10 MB 左右。

例如:

local = fs.createWriteStream('here.txt');
conn.exec('cat there.txt', function(err, stream) {
     if (err) throw err;
     stream.pipe(local).on('finish, function() { console.log('Done'); });
}

这只是在某一时刻完全停止。我什至将流通过管道传输到本地标准输出,但它会在一段时间后挂起。在我的实际代码中,我将它通过一堆其他转换流传输,所以我认为这比先将文件传输到本地系统更好(文件可能会大于 200MB)。

【问题讨论】:

  • 我知道这并不能完全回答你的问题,但你不能直接scp 吗?
  • 我应该提到我还想将它用于我在远程服务器上执行的命令,这些命令不一定输出文件(仅输出到标准输出)。我不确定什么会更快:1)将命令的输出写入远程文件,将该文件传输到本地服务器,然后对其进行转换,然后将其写入本地文件。或 2) 让它们像它们一样输出到标准输出并将其流式传输到本地服务器,对其进行转换,然后将其写入本地文件。
  • “挂起”是什么意思?你的意思是本地进程还在运行吗?如果是这样,您需要在 exec 流关闭时(或者当您的可写 fs 流完成时,无论哪种方式)结束连接。 FWIW 我已经用一个 10MB 的文件反复尝试了你的代码,它每次都对我有用。
  • 另外,您能说说您使用的 ssh2 模块版本和 node/io.js 版本吗?
  • 我刚刚更新到 0.4.8,我也遇到了同样的问题。通过挂起,我的意思是一些数据被传输到我的本地 fs 流,但是 ssh 流在传输 25% 的数据后不再通过管道传输任何东西。即使远程服务器上的进程仍在运行。

标签: node.js ssh stream


【解决方案1】:

试用 createReadStream 来提供大文件:

fs.exists(correctfilepath, function(exists) {
  if (exists) {
    var readstream = fs.createReadStream(correctfilepath);

    console.log("About to serve " + correctfilepath);

    res.writeHead(200);
    readstream.setEncoding("binary");

    readstream.on("data", function (chunk) {
        res.write(chunk, "binary");
    });

    readstream.on("end", function () {
        console.log("Served file " + correctfilepath);
        res.end();
    });

    readstream.on('error', function(err) {
        res.write(err + "\n");
        res.end();
        return;
    });
  } else {
    res.writeHead(404);
    res.write("No data\n");
    res.end();
  }
});

【讨论】:

  • 我试图避免这样做。而且,这个文件在另一台服务器上。
【解决方案2】:

我最近才开始使用流,所以当我通过各种转换流传输 ssh 流时,我并没有像在我的示例中那样以可写流结束(我应该包含我的实际代码,对不起!)。这导致它挂起。这最初是为了让我可以远程执行多个命令并将它们的输出排序到一个文件中。

所以,我的原始代码是stream.pipe(transformStream),然后在完成后将 transformStream 推送到一个数组。然后使用mergesort-stream npm 模块对其进行排序。而不是这样,我只是将多个 ssh 命令(转换后的)的结果写入临时文件,然后一次将它们全部排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2012-04-05
    • 2015-04-18
    • 2016-10-27
    相关资源
    最近更新 更多