在Node.js中使用ssh2传输整个目录

And*_*ley 2 javascript sftp scp node.js

我只是想知道是否可以使用node.js中的ssh2模块将目录从Unix服务器传输到我的本地计算机。我已连接到远程主机,可以读取目录以及传输单个文件,但是目录中有28个文件夹,每个文件夹包含文件和子目录。我想做的是将主目录的精确副本从服务器复制到本地计算机。

我曾经在单个文件中使用fastGet,但是传输目录会给出:Error: EISDIR, open __dirname/../localdirectory/我认为这意味着我无法使用fastGet来获取整个目录。我也尝试使用exec命令尝试将其结束,但是我无法计算出本地目录的语法:

// c is an active connection
c.exec('scp filethatexists.extension /../filepath/newname.extension', function(err, stream) {
    if (err) {
        console.log("error: " + err);
        stream.end;
    };
    stream.on('data', function(data, extended) {
        console.log((extended === 'stderr' ? 'STDERR: ' : 'STDOUT: ') + data);
    });
    stream.on('end', function() {
        console.log('Stream :: EOF');
    });
    stream.on('close', function() {
        console.log('Stream :: close');
    });
    stream.on('exit', function(code, signal) {
        console.log('Stream :: exit :: code: ' + code + ', signal: ' + signal);
        c.end();
    });
});
Run Code Online (Sandbox Code Playgroud)

这只会导致EOF调用。这段代码仅供我测试,是否可以传输单个文件。

谁能为我提供任何帮助?先感谢您。

msc*_*dex 5

几个解决方案:

  1. 您可以使用以下sftp方法递归遍历目录(创建目录并根据需要传输文件)

  2. 将目录Tar(如果需要,也压缩)到stdout(例如tar cf - mydir),然后data使用tar模块(如果最终压缩目录,则首先处理内置的zlib模块)处理传入的stdout 。

    // Requires:
    //   * `npm install tar-fs`
    //   * `ssh2` v0.5.x or newer
    var tar = require('tar-fs');
    var zlib = require('zlib');
    
    function transferDir(conn, remotePath, localPath, compression, cb) {
      var cmd = 'tar cf - "' + remotePath + '" 2>/dev/null';
    
      if (typeof compression === 'function')
        cb = compression;
      else if (compression === true)
        compression = 6;
    
      if (typeof compression === 'number'
          && compression >= 1
          && compression <= 9)
        cmd += ' | gzip -' + compression + 'c 2>/dev/null';
      else
        compression = undefined;
    
      conn.exec(cmd, function(err, stream) {
        if (err)
          return cb(err);
    
        var exitErr;
    
        var tarStream = tar.extract(localPath);
        tarStream.on('finish', function() {
          cb(exitErr);
        });
    
        stream.on('exit', function(code, signal) {
          if (typeof code === 'number' && code !== 0) {
            exitErr = new Error('Remote process exited with code '
                                + code);
          } else if (signal) {
            exitErr = new Error('Remote process killed with signal '
                                + signal);
          }
        }).stderr.resume();
    
        if (compression)
          stream = stream.pipe(zlib.createGunzip());
    
        stream.pipe(tarStream);
      });
    }
    
    // USAGE ===============================================================
    var ssh = require('ssh2');
    
    var conn = new ssh();
    conn.on('ready', function() {
      transferDir(conn,
                  '/home/foo',
                  __dirname + '/download',
                  true, // uses compression with default level of 6
                  function(err) {
        if (err) throw err;
        console.log('Done transferring');
        conn.end();
      });
    }).connect({
      host: '192.168.100.10',
      port: 22,
      username: 'foo',
      password: 'bar'
    });
    
    Run Code Online (Sandbox Code Playgroud)