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)