Necesitando conectarme a un SFTP (SSH FTP) para una aplicación en C# o VB y dado que .NET no da soporte nativo para este tipo de conexión, me enfrasque en una tediosa busqueda de alguna clase en internet que me solucionase la papeleta y aunque no fuera de código libre, al menos si fuera gratuita.
Rápidamente lo primero que sale al buscar en internet son múltiples clases y componentes de pago, cuyos responsables postean en todos los blog y foros que traten el tema de un SFTP para poner publicidad de su componente, pero las más de las veces haciendose pasar cutremente por usuarios que informan desinteresadamente a otros.
Cansado de no ver mas que programas de pago, me acorde de el maravilloso Curl, así que lo primero que intente fue usar Libcurl para .Net, un wrapping de C# del programa Curl, el cual ya había utilizado para montar con éxito una funcionalidad para un FTP sobre TLS explicito anteriormente… el problema fue que LibCurl para C# no soporta el protocolo SFTP, mientras que para otros lenguages si.
Tras este primer intento fallido, opte por usar el componente gratuito de WinSCP para .NET, que si soporta SFTP, pero no en mi casi, pues únicamenete funciona si el sistema de claves publica/privada no tiene frase de paso (passphrase), en cuyo caso se puede hacer la ñapa de tener arrancado un programita llamado Pageant con la clave privada cargada… un engorro que no me era útil.
Seguí buscando y vi dos librerías más, SharpSSH que esta abandonada desde hace años, un fork o proyecto derivado del anterior, que aun se continuaba, otra llamada Granados que no tenía nada de documentación y finalmente, tras mucho buscar y ya desesperado, encontre una maravilla llamada SSH.NET.
Conectando a SFTP con SSH.NET.
A partir de aquí, fue coser y cantar, me descarge el código fuente del proyecto.
Lo compile y obtuve la librería, que puesta como referencia en mi aplicación me permitió conectarme al SFTP y realizar cualquier operación sin ningún tipo de problema.
Lo primero instanciamos la librería
Imports Renci.SshNet
A continuación pongo un refrito de como conectarme a un servidor SFTP a través de un proxy de tipo socks5 y mediante clave privada con frase de paso.
La clave privada no debe estar en formato ppk (PuTTY Private Key), pues de estarlo no funcionaría.
Dim RutaClavePrivada As String = "C:Rutaid_rsa_nombre" Dim FrasePaso As String = "xxxxxxxxxxxxxxxx" Dim ClavePrivada As Renci.SshNet.PrivateKeyFile = New Renci.SshNet.PrivateKeyFile(RutaClavePrivada, FrasePaso) Dim conexion = New PrivateKeyConnectionInfo("xxx.xxx.xxx.xxx", "xxxxxxxxx", ProxyTypes.Socks5, "socks.xxxx.es", 1080, "", "", ClavePrivada) Dim Ftp As Renci.SshNet.SftpClient = New Renci.SshNet.SftpClient(conexion) Ftp.Connect() ' Descargar un Fichero. Dim fsd As System.IO.Stream = New System.IO.FileStream("c:archivo.txt", System.IO.FileMode.Create) Ftp.DownloadFile("/.ssh/authorized_keys2", fsd) fsd.Close() ' Upload de fichero. Dim fs As System.IO.Stream = System.IO.File.OpenRead("c:archivo.txt") Ftp.UploadFile(fs, "/path/archivo.txt", True) fs.Close() ' Renombrar un fichero. Ftp.RenameFile("/path/archivo.txt", "/path/archivo_renombrado.txt") ' Eliminar un fichero. Ftp.DeleteFile("/path/archivo_renombrado.txt") Ftp.Disconnect() Ftp.Dispose()
El código está en Visual Basic (VB.NET), pero su conversión a C# es sencilla.
Espero con este post ahorrar las muchas horas y horas de pruebas y búsquedas que yo realice y de paso agradecer a los desarrolladores de SSH.NET su esfuerzo y también a los que dedicaron tiempo en las demás librerías.
21722 visitas.
Tienes la librearia lista para usarla?
es posible que la envias por mail?
saludos!!
Hola Mauricio.
Te paso un link a una versión ya compilada de la librería por mí.
Sino te funcionase, sólo tendrías que compilar el proyecto que viene en SSH.NET
Espero que te sea útil.
Saludos!
Genial el aporte loco, muchas gracias!
Pero cuando agrego el proyecto me dice que la hubicacion no es segura y despues no reconoce la referencia a Microsoft.csharp. ¿Tenes idea que puede ser?
Tengo instalados los frameworks desde el 3.0 al 4.0
Hola, saludos de san cristobal, chiapas.
Una duda, aparte del putty key..como se podria general la clave privada?
Hola Lean: estas agregando el poryecto que se baja desde ssh.net o la librería compilada que puse en otro comentario? No recuerdo con que framework compile la librería, puede qeu este con el 4.5 y opr eso te de problemas. El proyecto de ssh.net viene por defecto apuntando al framework 4, o cuando lo descarge yo así era.
Hola Adrian: Depende de si estás en Linux o en Window$… hay programitas para ello y clientes SSH que permiten lo mismo. Con OpenSSH se hace muy fácil, pero el problema es que para usar la librería de este artículo, deben ser claves en formato ppk, es decir, de Putty. Abrazos desde Madrid para todo chiapas!!
Hola
entiendo que esta libreria solo funciona con el framework 4 en adelante..
¿hay la posibilidad de usar esta libreria con framework 2.0?
En la web de SSH.NET dicen:
Así que usarla en el Framework 20 puede que no sea posible si han utilizado cosas únicas del 4.0
hola gente muy bueno el ejemplo, pero estos necesitando otro ejemplo para ejecutar comandos, es decir tipo Except.
Hola,
Me ha gustado mucho tu explicación pero no entiendo esto
Dim
RutaClavePrivada
As
String
=
"C:Rutaid_rsa_nombre"
que quieres decir con id_rsa_nombre ?? Que tiene que haber dentro de este archivo ?? y con que extensión ??
Muchas gracias
Hola Luis,
Esa ruta hace referencia al archivo que contendra la clave privada. En un sistema SFTP hace falta una clave privada y otra pública que tendrá el servidor donde te conectes. Ambas están conectadas por así decirlo y esta forma de conectar requiere usar el archivo que contiene tu parte privada.
Es verdad que el post da por hecho muchas cosas, como el protocolo SFTP, debería haberlo explicado mejor.
Muchas gracias por tu pregunta que quizás sirva para otra gente que tuviera la misma duda.
Salud.
Muy interesante tu explicación y creo que es justo lo que necesito. Solo tengo duda en el uso de la función PrivateKeyConnectionInfo
Tengo los siguiientes datos:
server: 192.168.1.76
user: usuarioprueba
password: 123456
puerto: 22
Y tengo un archivo de PrivateKey que esta en una carpeta C:\elecfac\key_10111391181.dat
Gracias por tu respuesta.
Buenas, mi problema es que tengo que conectarme a un servidor SFTP, descargar archivos online automaticamente, y subir otros automaticamente cada cierto tiempo, me han dado un archivo xxx.dat que supongo sera la llave privada lo que utilizas como RutaClavePrivada, pero no entiendo a que te refieres con FrasePaso.
¿A que te refieres con FrasePaso?
¿Podrias explicarme cada uno de los parametros de PrivateKeyConnectionInfo?
Tengo la misma duda, que es FrasePaso?
Saludos y Gracias.
Hola,
Me he descargado el proyecto tal y como tu indicas (ahora de github), pero no se muy bien como compilarlo y añadirlo a mi repositorio (soy nuevo con esto del VS) , nos puedes indicar mas o menos como?
Pd.
Con todos los archivos que hay no se que proyecto abrir y generar la librería y luego donde añadirla para que esté disponible en mi repositorio..
Muchísimas gracias,
Antoni.
Tengo un proyecto listo para usar, permiter subir y descargar archivos masivamente. Usa la libreria SHH con algunos acondicionamientos para que sea dinamico.
http://sistemaspla.blogspot.pe/2018/05/carga-y-descarga-masiva-de-ficheros.html