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

本文概述

  • 要求
  • 1.在你的Node.js项目中安装tar-fs和ssh2
  • 2.创建传递函数
  • 3.下载目录
如今, 大多数基于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 desiredif (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 URLhost: 'your.server.url.com', // The port, usually 22port: 22, // Credentialsusername: 'root', password: '*******'}; conn.on('ready', function () {// Use the transfer directory transferDirectory(// The SSH2 connectionconn, // 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 valuetrue, // A callback executed once the transference finishesfunction (err) {if (err){throw err; }; console.log('Remote directory succesfully downloaded!'); // Finish the connectionconn.end(); }); }).connect(connectionSettings);

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

脚本完成后, 你应该在脚本所在的同一文件夹中获得一个新文件夹(备份)。如果要从项目中创建备份, 特别是用户在WordPress或其他类型的CMS等项目中上传的文件, 则此脚本非常有用。
【如何在Node.js中使用SSH2从UNIX服务器下载整个目录】编码愉快!

    推荐阅读