С библиотекой SSH2 вы сможете создать ssh-соединение с вашим сервером для простой передачи (загрузки и выгрузки) файлов. ssh2 — это клиентский модуль SSH2, написанный на чистом JavaScript для node.js. Поскольку электронная платформа может использовать node.js, вы можете использовать этот плагин для простого создания собственного клиента sftp.
Требования
Для реализации функции sftp в нашем гибридном приложении нам понадобится:
- Node.js
- SSH2 (написано для Node.js)
- Терпение
Теперь давайте начнем!
Установка и настройка
Добавьте ssh2 в качестве зависимости вашего электронного проекта, добавьте его, выполнив следующую строку в командной строке Node.js:
npm install ssh2 --save
Тогда вы сможете потребовать это с помощью Javascript, используя require("ssh2");
Создание клиента SFTP
Клиент sftp будет легко настроить после установки библиотеки ssh2, сначала вам нужно создать клиент (обратите внимание, что ssh2 поддерживает не только sftp, но и больше типов, ssh, ftp и т. Д.), Используя:
var Client = require('ssh2').Client;
var connection = new Client();
С подключением теперь происходит волшебство, чтобы запустить соединение sftp, используйте следующий фрагмент кода. Объект соединения будет подготовлен и подключен с использованием минимальной конфигурации, затем, если соединение ssh успешно, откройте соединение sftp!
var Client = require('ssh2').Client;
var connSettings = {
host: 'myserver-direction.com',
port: 22, // Normal is 22 port
username: 'myUsername',
password: 'myPassword'
// You can use a key file too, read the ssh2 documentation
};
var conn = new Client();
conn.on('ready', function() {
conn.sftp(function(err, sftp) {
if (err) throw err;
// you'll be able to use sftp here
// Use sftp to execute tasks like .unlink or chmod etc
});
}).connect(connSettings);
Список каталога
Для просмотра каталога используйте метод readdir:
var Client = require('ssh2').Client;
var connSettings = {
host: 'myserver-direction.com',
port: 22, // Normal is 22 port
username: 'myUsername',
password: 'myPassword'
// You can use a key file too, read the ssh2 documentation
};
var remotePathToList = '/var/www/ourcodeworld';
var conn = new Client();
conn.on('ready', function() {
conn.sftp(function(err, sftp) {
if (err) throw err;
sftp.readdir(remotePathToList, function(err, list) {
if (err) throw err;
// List the directory in the console
console.dir(list);
// Do not forget to close the connection, otherwise you'll get troubles
conn.end();
});
});
}).connect(connSettings);
Переменная list — это массив с объектами, каждый объект содержит информацию о каждой папке и файле внутри удаленного пути. Структура должна выглядеть так:
Скачивание файла
Чтобы загрузить удаленный файл, используйте fastGet
метод:
var Client = require('ssh2').Client;
var connSettings = {
host: 'myserver-direction.com',
port: 22, // Normal is 22 port
username: 'myUsername',
password: 'myPassword'
// You can use a key file too, read the ssh2 documentation
};
var conn = new Client();
conn.on('ready', function() {
conn.sftp(function(err, sftp) {
if (err) throw err;
var moveFrom = "/remote/file/path/file.txt";
var moveTo = "/local/file/path/file.txt";
sftp.fastGet(moveFrom, moveTo , {}, function(downloadError){
if(downloadError) throw downloadError;
console.log("Succesfully uploaded");
});
});
}).connect(connSettings);
Загрузка файла
Чтобы загрузить файл, вам нужно использовать createWriteStream
метод. Он создаст файл с предоставленным именем с содержимым локального файла. Для предоставления локального файла мы будем использовать локальную файловую систему (require("fs")
) и использовать createReadStream
метод.
var Client = require('ssh2').Client;
var connSettings = {
host: 'myserver-direction.com',
port: 22, // Normal is 22 port
username: 'myUsername',
password: 'myPassword'
// You can use a key file too, read the ssh2 documentation
};
var remotePathToList = '/var/www/ourcodeworld';
var conn = new Client();
conn.on('ready', function() {
conn.sftp(function(err, sftp) {
if (err) throw err;
var fs = require("fs"); // Use node filesystem
var readStream = fs.createReadStream( "path-to-local-file.txt" );
var writeStream = sftp.createWriteStream( "path-to-remote-file.txt" );
writeStream.on('close',function () {
console.log( "- file transferred succesfully" );
});
writeStream.on('end', function () {
console.log( "sftp connection closed" );
conn.close();
});
// initiate transfer of file
readStream.pipe( writeStream );
});
}).connect(connSettings);
Удалить удаленный файл
Чтобы удалить файл, мы будем использовать метод unlink. Этот метод ожидает путь к удаленному файлу в качестве первого параметра и обратный вызов.
var Client = require('ssh2').Client;
var connSettings = {
host: 'myserver-direction.com',
port: 22, // Normal is 22 port
username: 'myUsername',
password: 'myPassword'
// You can use a key file too, read the ssh2 documentation
};
var remotePathToList = '/var/www/ourcodeworld';
var conn = new Client();
conn.on('ready', function() {
conn.sftp(function(err, sftp) {
if (err) throw err;
sftp.unlink("remote-filepath.txt", function(err){
if ( err ) {
console.log( "Error, problem starting SFTP: %s", err );
}
else
{
console.log( "file unlinked" );
}
conn.close();
});
});
}).connect(connSettings);
Изменение разрешений
Чтобы изменить права доступа к удаленному файлу, мы будем использовать метод chmod. Этот метод ожидает путь к удаленному файлу в качестве первого параметра и разрешения в качестве второго параметра, и, наконец, обратный вызов в качестве третьего параметра.
var Client = require('ssh2').Client;
var connSettings = {
host: 'myserver-direction.com',
port: 22, // Normal is 22 port
username: 'myUsername',
password: 'myPassword'
// You can use a key file too, read the ssh2 documentation
};
var remotePathToList = '/var/www/ourcodeworld';
var conn = new Client();
conn.on('ready', function() {
conn.sftp(function(err, sftp) {
if (err) throw err;
sftp.chmod( "remote-file-path.txt", 777, function(err){
if ( err ) {
console.log( "Error, problem starting SFTP: %s", err );
}
else
{
console.log( "Mode changed" );
}
});
});
}).connect(connSettings);
В предыдущем примере файл будет иметь разрешения 777. (rwxrwxrwx) Нет ограничений на разрешения. Кто угодно может сделать что угодно. Вообще не желательная настройка, просто пример.
Финальные заметки
Есть пара деталей о плагине, которые вам, возможно, нужно знать:
- Документацию можно найти в файле README.md, но только с исходным кодом.
- У него нет каких-либо тестов (модульных или интеграционных тестов), однако он работает как шарм, и это важно.
Повеселись