Как загрузить весь каталог с сервера UNIX с SSH2 в Node.js

В настоящее время большинство систем на основе UNIX поставляются с несколькими базовыми вариантами программного обеспечения для резервного копирования, включая dd, cpio, tar и dump. Если базовое программное обеспечение для резервного копирования на вашем сервере не соответствует вашим потребностям, существует множество вариантов резервного копирования в Интернете, которые вы можете попробовать. Тем не менее, вы все еще можете быть старомодным программистом (возможно, более осторожным) и создавать домашнюю резервную копию с Node.js, загрузив всю папку с вашего веб-сервера и сохранив ее на жестком диске вашего дома или офиса.

Требования

В этой статье мы не будем обрабатывать загрузку каждой отдельной папки в каталоге, в первую очередь потому, что это увеличит время обработки передачи и потому что это довольно сложно и мучительно. Чтобы сделать резервное копирование настолько простым, насколько это возможно, мы собираемся напрямую сжать папку. Для этого нам понадобится:

  • Утилита командной строки tar для сбора множества файлов в один архивный файл (доступно по умолчанию на любом сервере под управлением UNIX).

Заметка

Сценарий может работать на серверах Windows, однако утилита tar должна быть доступна, а не перенаправлять вывод на 2>/dev/null, так должно быть NUL вместо.

Очевидно, вам нужно установить Node.js и немного терпения. Давайте начнем !

1. Установите tar-fs и ssh2 в свой проект Node.js.

Откройте новый терминал на вашем компьютере и перейдите в каталог вашего проекта. Затем перейдите к установке модуля SSH2 с помощью следующей команды:

npm install ssh2

Если вам нужна дополнительная информация о модуле SSH2, посетите официальный репозиторий в Github здесь.

После установки модуля SSH2 вам потребуется модуль tar-fs, tar-fs позволяет упаковывать каталоги в tar-архивы и извлекать tar-архивы в каталоги. Установите модуль с помощью следующей команды:

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), эта команда будет передавать все сжатые файлы и папки в наше соединение (перенаправляет стандартный вывод (стандартный вывод) на /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 /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. Скачать каталог

Чтобы начать резервное копирование всего каталога с вашего сервера, вам нужно будет создать новое SSH-соединение с модулем ssh2. Требуйте модуль и создайте его новый экземпляр, затем настройте объект настроек (учетные данные, 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

Как только скрипт завершится, вы должны получить новую папку (backup) в той же папке, где находится скрипт. Этот скрипт действительно полезен, если вы хотите создавать резервные копии из ваших проектов, в частности, файлов, которые пользователь загружает в такие проекты, как WordPress или другие виды CMS.

Ссылка на основную публикацию
Adblock
detector