node ssh2 比较快速的目录下载和上传实现

举报
Amrf 发表于 2020/08/06 18:53:36 2020/08/06
【摘要】 下载逻辑参考: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

https://ourcodeworld.com/articles/read/428/how-to-download-an-entire-directory-from-an-unix-server-with-ssh2-in-node-js

依赖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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。