Javascript 在Nodejs中使用ssh2传输整个目录
我只是想知道是否可以使用node.js中的ssh2模块将目录从unix服务器传输到本地机器。我已连接到远程主机,可以读取目录以及传输单个文件,但目录中有28个文件夹,每个文件夹包含文件和子目录。我要做的是将主目录的精确副本从服务器复制到本地计算机 我对单个文件使用fastGet,但传输目录时会出现以下错误:Javascript 在Nodejs中使用ssh2传输整个目录,javascript,node.js,sftp,scp,Javascript,Node.js,Sftp,Scp,我只是想知道是否可以使用node.js中的ssh2模块将目录从unix服务器传输到本地机器。我已连接到远程主机,可以读取目录以及传输单个文件,但目录中有28个文件夹,每个文件夹包含文件和子目录。我要做的是将主目录的精确副本从服务器复制到本地计算机 我对单个文件使用fastGet,但传输目录时会出现以下错误:错误:EISDIR,open.\u dirname/./localdirectory/,这意味着我无法使用fastGet获取整个目录。我还尝试使用exec命令尝试并将其转换为scp,但无法计算
错误:EISDIR,open.\u 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调用。这段代码只是我在测试是否可以进行单文件传输
有人能帮我吗?提前感谢您。一些解决方案:
sftp
方法递归遍历目录(根据需要创建目录和传输文件)tarcf-mydir
),然后使用模块处理传入的stdout数据(如果压缩目录,则先处理内置模块)
//需要:
//*`npm安装tar fs`
//*`ssh2`v0.5.x或更新版本
var tar=要求(“tar-fs”);
var zlib=需要('zlib');
函数transferDir(conn、remotePath、localPath、compression、cb){
var cmd='tar cf-“'+remotePath+'“2>/dev/null';
if(压缩类型===‘函数’)
cb=压缩;
else if(压缩===true)
压缩=6;
如果(压缩类型==='number'
&&压缩>=1
&&压缩我如何使用tar模块处理数据
?这方面的文档相当缺乏。在对ssh2
进行了一些更改后,我更新了我的答案,以提供一个tarring/gzip的解决方案。@mscdex我想知道远程路径是如何设置的。我的服务器上有一个名为dev的文件夹,我想转换它我想remotePath变量就是我应该设置为dev的变量,但我不完全确定这是怎么回事set@JoshuaDeshazerremotePath
是您希望下载的ssh服务器上的目录。@mscdex那么在您的情况下,remotePath是否设置为/dev/null?
// 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'
});