在Nodejs中使用ssh2传输整个目录

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

我使用fastGet与单个文件,但传输目录给出: Error: EISDIR, open __dirname/../localdirectory/我认为暗示我不能使用fastGet获取整个目录。 我也尝试使用exec命令来尝试scp它,但我无法解决本地目录的语法:

 // 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(); }); }); 

这只会导致EOF调用。 这个代码只是我testing如果我可以得到一个单一的文件传输。

任何人都可以提供任何帮助吗? 先谢谢你。

几个解决scheme:

  1. 您可以使用sftp方法recursion遍历目录(根据需要制作目录和传输文件)

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

     // 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' });