node ssh2 比较快速的目录下载和上传实现
【摘要】 下载逻辑参考:https://gist.github.com/mscdex/c1a7199af2af9d3ceb1chttps://ourcodeworld.com/articles/read/428/how-to-download-an-entire-directory-from-an-unix-server-with-ssh2-in-node-js 依赖ssh2和tar-fs,如果采用t...
下载逻辑参考:
https://gist.github.com/mscdex/c1a7199af2af9d3ceb1c
依赖ssh2和tar-fs,如果采用ts开发则还要添加@type/tar-fs;
流程就是远端采用tar把目录压缩打包到标准输出中,本地的对应tar管道接收并解压;
如果不想解压后的路径保留远端机器的绝对路径的完整嵌套结构,可以在tar之前cd 到待打包目录的上层目录执行打包;
可以在tar.extract传入map选项用于获取执行细节;
相似的,对应的上传逻辑参考:
即本地压到远端的标准输入,tar从标准输入中解压到目标路径;
transferLocalDirectory(client: Client, remotePath: string, localPath: string, compression: any, cb: any) {
remotePath = remotePath.replace(/[\/]$/, "") + '/';
let folderName = remotePath.match(/([^\/]*)\/$/)![1];
let remotePath0 = remotePath.replace(folderName + '/', "");
var cmd = 'cd ' + remotePath0 + ';tar xzvf -';// 2>/dev/null
client.exec(cmd, function (err, stream) {
if (err) {
return cb(err);
}
var exitErr: any = null;
var tarStream = tar.pack(localPath,{finish:(pack:tar.Pack)=>{console.log("finish");}})
tarStream.finalize = function(){
cb(exitErr);
};
stream.on('data', function (data: any) {
console.log(data.toString());
}).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.on('data', function (data) {
console.log(data.toString());
});
if (compression) {
tarStream = tarStream.pipe(zlib.createGzip()) as any;
}
tarStream.pipe(stream);
});
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)