Cómo crear un cliente SFTP usando SSH2 con Electron Framework

Cómo crear un cliente SFTP usando SSH2 con Electron Framework

Con la librería SSH2 podrás crear una conexión SSH con tu servidor para la transferencia de archivos fácilmente (subir y descargar). SSH2 es un modulo de cliente SSH escrito en JavaScript para Node.js. Como Electron Framework se basa en Node podrás usar este plugin para crear tu propio cliente SFTP fácilmente.

Requisitos

Para implementar la utilidad de SFTP en tu aplicación híbrida necesitarás:

  • Node.js
  • SSH2 (para Node.js)
  • Patience

Así que comencemos !

Instalación

Agrega SSH2 como una dependencia en tu proyecto de Electron usando el siguiente comando en la consola de Node.js:

npm install ssh2 --save

Luego podrás requerir el módulo con Javascript usando require("ssh2");

Creando un cliente SFTP

El cliente SFTP puede ser iniciado facilmente despues de la instalación de la librería SSH2, como primer paso necesitarás crear el cliente (nota que SHH2 soporta no solamente SFTP sino tambien más tipos SSH, FTP etc) usando:

var Client = require('ssh2').Client;
var connection = new Client();

Con una conexión sucederá la magia, para iniciar una conexión usa el siguiente código. Un objeto de conexión será preparado y conectado usando la configuración mínima, luego en caso de que la conexión sea un exito, podrá ser usado para llevar a cabo diferentes tareas:

var Client = require('ssh2').Client;
var connSettings = {
     host: 'miservidor-direccion.com',
     port: 22, // Normalmente se usa el puerto 22
     username: 'miUsuario',
     password: 'miContrasena'
     // Puedes usar un archivo key si lees la documentación
};

var conn = new Client();
conn.on('ready', function() {
    conn.sftp(function(err, sftp) {
         if (err) throw err;
         // Podrás usar las funciones de SFTP con el objeto sftp
         // Por ejemplo funciones como .unlink ó chmod etc
    });
}).connect(connSettings);

Listar un directorio

Para listar un directorio, usa el método readdir:

var Client = require('ssh2').Client;
var connSettings = {
     host: 'miservidor-direccion.com',
     port: 22, // Normalmente se usa el puerto 22
     username: 'miUsuario',
     password: 'miContrasena'
     // Puedes usar un archivo key si lees la documentación
};
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;
                // Listar el directorio en la consola 
                console.dir(list);
                // No olvides cerrar la conexión de otra manera habrá problemas
                conn.end();
         });
    });
}).connect(connSettings);

La variable list es un array con objetos, cada objeto contiene información acerca de cada carpeta y archivo dentro del directorio remoto. La estructura del archivo debería lucir así.

Subir un archivo

Para subir un archivo, necesitarás usar el método createWriteStream .Este creara un archivo con el nombre dado en el directorio remoto con el contenido del archivo local. Para usar el archivo local necesitarás usar el sistema de archivos local (require("fs")) y usa el método createReadStream.

var Client = require('ssh2').Client;
var connSettings = {
     host: 'miservidor-direccion.com',
     port: 22, // Normalmente se usa el puerto 22
     username: 'miUsuario',
     password: 'miContrasena'
     // Puedes usar un archivo key si lees la documentación
};

var conn = new Client();
conn.on('ready', function() {
    conn.sftp(function(err, sftp) {
         if (err) throw err;
         
        var fs = require("fs"); // Usar el módulo de sistema de archivos
        var readStream = fs.createReadStream( "path-de-archivo-remoto.txt" );
        var writeStream = sftp.createWriteStream( "path-de-archivo-remoto.txt" );

        writeStream.on('close',function () {
            console.log( "Archivo satisfactoriamente transferido" );
        });

        writeStream.on('end', function () {
            console.log( "Conexión SFTP cerrada" );
            conn.close();
        });

        // Iniciar transferencia de archivo
        readStream.pipe( writeStream );
    });
}).connect(connSettings);

Eliminar un archivo remoto

Para eliminar un archivo, usa el método unlink. Este método recibe como primer argumento el directorio remoto del archivo que necesita ser eliminado y un callback.

var Client = require('ssh2').Client;
var connSettings = {
     host: 'miservidor-direccion.com',
     port: 22, // Normalmente se usa el puerto 22
     username: 'miUsuario',
     password: 'miContrasena'
     // Puedes usar un archivo key si lees la documentación
};

var conn = new Client();
conn.on('ready', function() {
    conn.sftp(function(err, sftp) {
         if (err) throw err;
         
         sftp.unlink("path-de-archivo-remoto.txt", function(err){
            if ( err ) {
                console.log( "Error, problema con eliminacion de archivo: %s", err );
            }
            else
            {
                console.log( "Archivo eliminado" );
            }

            conn.close();
        });
    });
}).connect(connSettings);

Cambiar permisos

Para cambiar los permisos de un archivo remoto, usa el método chmod. Este método recibe como primer argumento el directorio del archivo remoto y el identificador del permiso como segundo parametro, finalmente el callback como tercer argumento.

var Client = require('ssh2').Client;
var connSettings = {
     host: 'miservidor-direccion.com',
     port: 22, // Normalmente se usa el puerto 22
     username: 'miUsuario',
     password: 'miContrasena'
     // Puedes usar un archivo key si lees la documentación
};

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, problema al cambiar los permisos: %s", err );
                }
                else
                {
                    console.log( "Permisos cambiados" );
                }
          });
    });
}).connect(connSettings);

Con el ejemplo anterior el archivo tendrá los permisos 777 (rwxrwxrwx). Nada de restricciones en los permisos, cualquiera podría hacer cualquier cosa. No es deseable, pero es solo un ejemplo.

Conclusión

Hay un par de detalles acerca del plugin que necesitas saber:

  • La documentación puede ser encontrada en el archivo README.MD pero solamente con código de ejemplo.
  • El plugin no tiene ningun tipo de test (unit o tests de integración), sin embargo funciona de manera excepcional y eso es lo importante.

Que te diviertas !

Esto podría ser de tu interes

Conviertete en un programador más sociable