本文概述
- 要求
- 1.在你的Node.js项目中安装tar-fs和ssh2
- 2.创建传递函数
- 3.下载目录
要求在本文中, 我们将不处理目录中每个文件夹的下载, 主要是因为这会增加传输的处理时间, 而且棘手且痛苦, 因此比较麻烦。为了使备份尽可能简单, 我们将直接远程压缩文件夹。为此, 我们将需要:
- 命令行实用程序tar, 用于将许多文件收集到一个归档文件中(默认情况下, 在任何基于UNIX的服务器上都可用)。
显然, 你需要安装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服务器下载整个目录】编码愉快!
推荐阅读
- 如何使用Node.js关闭和重启Linux
- 找不到相对于目录的预设”es2015″和”react”
- Golang中用到的的Websocket库
- 超简单五步实现Linux虚拟机CentOS 7系统Root密码忘记重置
- Java技术指南「OpenJDK专题」想不想编译属于你自己的JDK呢((Windows环境))
- 从源码分析创建线程池的4种方式
- wait_event()和wait_event_interruptible()的介绍
- Greenplum EXPLAIN 详解
- linux部署项目,验证码不显示