个性化阅读
专注于IT技术分析

如何在Node.js中使用SSH2从UNIX服务器下载整个目录

点击下载

本文概述

如今, 大多数基于UNIX的系统都带有几个基本的备份软件选项, 包括dd, cpio, tar和dump。如果服务器的基本备份软件无法满足你的需求, 那么你可以考虑签出Internet上许多备份软件选项。但是, 你仍然可以是老式的程序员(可能会更加谨慎), 并通过从Web服务器下载整个文件夹并将其存储在家庭或办公室的硬盘中, 来使用Node.js创建自制备份。

要求

在本文中, 我们将不处理目录中每个文件夹的下载, 主要是因为这会增加传输的处理时间, 而且棘手且痛苦, 因此比较麻烦。为了使备份尽可能简单, 我们将直接远程压缩文件夹。为此, 我们将需要:

  • 命令行实用程序tar, 用于将许多文件收集到一个归档文件中(默认情况下, 在任何基于UNIX的服务器上都可用)。

注意

该脚本可以在Windows Server上运行, 但是tar实用程序应该可用, 而不是将输出重定向到2> / dev / null, 而应该是NUL。

显然, 你需要安装Node.js并耐心等待。让我们开始吧 !

1.在你的Node.js项目中安装tar-fs和ssh2

在计算机中打开一个新终端, 然后切换到项目目录。然后使用以下命令继续安装SSH2模块:

npm install ssh2

如果你需要有关SSH2模块的更多信息, 请在此处访问Github中的官方存储库。

一旦安装了SSH2模块, 你现在将需要tar-fs模块, tar-fs允许你将目录打包到tarball中并将tarball提取到目录中。使用以下命令安装模块:

npm install tar-fs

如果你需要有关tar-fs模块的更多信息, 请访问Github上的官方存储库。

安装模块后, 你可以编写一些代码, 这些代码将从本地服务器上下载整个目录作为备份。

2.创建传递函数

为了测试脚本, 请创建一个演示文件, 即backup.js, 并将以下脚本保存在其中。以下功能的工作方式如下:使用SSH2库中的连接对象, 命令将在远程终端中执行(类似于tar cf-/ folder / to / download 2> / dev / null, 如果使用压缩tar cf -/ folder / to / download 2> / dev / null | gzip 6 -c 2> / dev / null), 此命令会将所有压缩文件和文件夹流式传输到我们的连接(将标准输出(stdout)重定向到/ dev / null(将其丢弃)(在Linux / Unix中被视为黑洞), 并借助tar-fs模块, 你将能够将流式数据提取到某个本地目录中。

请注意, 你之前需要使用tar-fs和zlib模块:

var tar = require('tar-fs');
var zlib = require('zlib');

/**
 * Transfers an entire directory locally by compressing, downloading and extracting it locally.
 * 
 * @param {SSH} conn A ssh connection of the ssh2 library
 * @param {String} remotePath 
 * @param {String} localPath 
 * @param {Integer|Boolean} compression 
 * @param {Function} cb Callback executed once the transfer finishes (success or error)
 * @see http://stackoverflow.com/questions/23935283/transfer-entire-directory-using-ssh2-in-nodejs
 */
function transferDirectory(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;
    }

    // Apply compression if desired
    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);
    });
}

使用此单个代码段, 你就可以下载目录了。

3.下载目录

要从服务器开始备份整个目录, 你将需要使用ssh2模块创建一个新的SSH连接。要求模块并创建它的新实例, 然后配置设置对象(凭证, 服务器的URL等)并添加就绪的侦听器。在回调内部, 你需要执行上一步中创建的传递函数。根据需要设置参数并验证脚本:

var SSH = require('ssh2');

var conn = new SSH();

var connectionSettings = {
    // The host URL
    host: 'your.server.url.com', // The port, usually 22
    port: 22, // Credentials
    username: 'root', password: '*******'
};

conn.on('ready', function () {
    // Use the transfer directory 
    transferDirectory(
        // The SSH2 connection
        conn, // The remote folder of your unix server that you want to back up
        '/var/www/vhosts/yourproject.com/some-folder-to-backup', // Local path where the files should be saved
        __dirname + '/backup', // Define a compression value (true for default 6) with a numerical value
        true, // A callback executed once the transference finishes
        function (err) {
            if (err){
                throw err;
            };

            console.log('Remote directory succesfully downloaded!');

            // Finish the connection
            conn.end();
        }
    );
}).connect(connectionSettings);

然后将更改保存到文件中, 并使用以下命令执行脚本:

node backup.js

脚本完成后, 你应该在脚本所在的同一文件夹中获得一个新文件夹(备份)。如果要从项目中创建备份, 特别是用户在WordPress或其他类型的CMS等项目中上传的文件, 则此脚本非常有用。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Node.js中使用SSH2从UNIX服务器下载整个目录

评论 抢沙发

评论前必须登录!