2011-02-15 40 views
16

Necesito conectarme a través de TCP a un puerto que está detrás de un firewall, accesible a través de un túnel SSH. Puedo lograr la conexión abriendo un túnel y golpeando ese puerto, pero quiero construir este túnel en mi aplicación.Cómo crear mediante programación el túnel ssh en C/C++ multiplataforma?

Además, quiero ser capaz de proporcionar la conexión automática mediante el uso de tener llaves autorizadas en el servidor

Esto debe trabajar en las plataformas siguientes (en orden de importancia)

  • IOS (más delicada porque no puedo tenedor de un túnel SSH como puedo en otras plataformas)
  • OS X
  • Linux
  • de Windows

¿Cuál es la manera más fácil de hacer esto? No quiero gastar una gran cantidad de esfuerzo, obviamente, ya que este no es el objetivo de mi solicitud. Pero voy a volver a utilizarlo, así que puede cuidar lo suficiente como para "hacer las cosas bien"

+0

¿Ha consultado: http://stackoverflow.com/questions/992374/object-oriented-c-library-for-ssh-and-scp? Esto se ve bastante cerca de un duplicado exacto ... –

+2

@Jerry Coffin: Bueno, Nektarios está pidiendo un túnel SSH, mientras que el otro solo está pidiendo una biblioteca SSH. :) – Teekin

Respuesta

6

pero libssh2 es de licencia BSD y parece tener la funcionalidad necesaria

se parece a: libssh2_channel_direct_tcpip_ex habrá la llamada

Nota que el LGPL'd libssh es un problema porque en las aplicaciones de iOS DEBE vincular estáticamente y NO PUEDE vincular dinámicamente a las bibliotecas. Por lo tanto, usar una biblioteca LGPL significa que mi fuente se convierte en fuente abierta.

+0

Si nos fijamos en la comparación (probablemente parcial) (http://www.libssh2.org/libssh2-vs-libssh.html), libssh2 podría ser una mejor opción. – sstn

+0

También estoy de acuerdo en que libssh2 incluso para no bloquear es lo mejor. – Nektarios

+0

El problema LGPL es correcto. Sin embargo, la página libssh2 vs libssh está desactualizada y es tan incorrecta. libssh tiene muchas más funciones que libssh2 como ECDSA, ECDH kex, GSSAPI, etc. http: //www.libssh.org/features/ – asn

-1

¿La LGPL diferencia entre vincular dinámicamente y estáticamente? No lo creo.

El código de la biblioteca (es decir, la incrustación de su propia implementación SSH) parece más versátil para mí. Excepto el hecho de que podrías heredar problemas de seguridad.

En MacOSX/Linux/Unix, puede simplemente invocar 'ssh' y asumir que existe (o hacerlo como una condición previa). En Windows, dependería de masilla y amigos. No creo que sea una buena idea.

+2

LPGL * does * diferencia entre vincular dinámicamente y estáticamente. –

+0

@ Jörgen - Ah, ya veo, no estaba al tanto de eso y podría haber jurado lo contrario: no soy especialista en licencias GPL/LGPL. Por lo tanto, las bibliotecas LGPL no suelen ser un problema (en una computadora de escritorio/servidor) porque la mayoría de los programas se utilizan dinámicamente. – sstn

+2

Bueno, la LGPL no lo dice en voz alta, pero si junta las piezas, lo insinúa. Además, aquí hay algunas palabras de Moglen (el mejor perro legal de FSF): http://www.spinics.net/lists/xf/msg02311.html (desplácese un poco hacia abajo o busque "Código estático vinculado a otro"). Él dice "El código estático vinculado a otro código es un trabajo derivado del código con el que está vinculado, en lo que a nosotros respecta". Esto me da escalofríos, porque la LGPL requiere que divulgues trabajos derivados. –

0

Hay una LIB comercial si desea verla, www.chilkatsoft.com/, es una genérica C++ lib para todos los idiomas, en ella hay un soporte para túnel SSH para IOS.

3

Libssh es una implementación de cliente muy buena para el protocolo SSH. He escrito a blog en esto. También hay una aplicación de muestra que demuestra lo mismo. Usamos la misma técnica en MONyog (monitor MySQL).

Cuestiones relacionadas