elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problemas para conectar cliente/servidor tunneling SSH
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas para conectar cliente/servidor tunneling SSH  (Leído 2,985 veces)
Oscar34

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Problemas para conectar cliente/servidor tunneling SSH
« en: 14 Noviembre 2012, 13:27 pm »

Hola a todos,
Estoy intentando realizar un servidor SFTP de archivos mediante sockets y tunneling SSH... el tema es que al conectar el cliente con el servidor me da un problema en la conexion... a la hora de hacer el connect, y no se si es debido a algún problema con la forma de establecer el túnel, hacíendolo por labit301.. (una pagina de la universidad...)
Os dejo parte del código cliente y los pantallazos que me da...
El servidor únicamente queda a la escucha, pero nunca llega el cliente...
Si me podéis echar un cable, al menos para que tenga una idea de que puede fallar... muchas gracias.

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include<netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
//#include<strings.h>
#include <fcntl.h>
#include<getopt.h>

#define PUERTO 4000
#define MAX 1024

int main(int argc, char*argv[]){

// Declaracion de variables   
   int sockC,conexionSFTP;
   struct sockaddr_in serveraddr;
   char buffer[MAX];
   int opcion,get,put,i;
   char *modo=NULL;
   char *fichero_remoto=NULL;
   char *direccionIPsv=NULL;
   char *fichero_local=NULL;
   char cierre[22];
   FILE *archivo;
   pid_t hijo;

//Creamos el socket del cliente
   bzero(&serveraddr,sizeof(serveraddr));
   sockC=socket(AF_INET,SOCK_STREAM,0);
   if(sockC<0){
      printf("Error en la creacion del socket cliente.\n");
      exit(-1);
   }
   else{
      printf("Socket cliente creado.\n");
   }
   serveraddr.sin_family=AF_INET;
   serveraddr.sin_port=htons(PUERTO);
   serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");

   bzero(buffer,sizeof(buffer));


printf("ENTRA_1\n");


//Una vez crado el socket, recogemos los parametros de entrada de la linea de caracteres
   while(1){
      if((opcion=getopt(argc,argv,"m:r:h:l:"))==-1)
         break;
   printf("ENTRA_2\n");
      switch(opcion){
         case 'm':
            modo=optarg;
            break;
         case 'r':
            fichero_remoto=optarg;
            break;
         case 'h':
            direccionIPsv=optarg;
            break;
         case 'l':
            fichero_local=optarg;
            break;
         case '?':
            printf("Uno de los valores introducidos no es correcto.\n");
            printf("Recuerde: \n"
                  "\n"
                  "-m modo get o put\n"
                  "-r fichero remoto\n"
                  "-h direccion IP del servidor\n"
                  "-l fichero local\n"
                  "\n");
            break;
      }//swtich
   } //while
   if(optind<argc){
      printf("elementos de qrgv que no son opciones.\n");
      while(optind<argc)
         printf("%s",argv[optind++]);
      printf("\n");
   }

//Creamos el proceso hijo para ejecutar el SSH

   if((hijo=fork())==0){

printf("ENTRA_3\n");

      execl("/usr/bin/ssh","ssh","-L","4000:labit301.upct.es:3000",direccionIPsv,"-f","sleep","15",NULL);
   exit(-1);
   }

printf("ENTRA_4\n");

//esperamos para introduciir el password ssh
   sleep(10);
   printf("1\n");
//Conectamos con el servidor SFTP
   conexionSFTP=connect(sockC,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
   if(conexionSFTP<0){
      printf("Error al establecer la conexion con el servidor.\n");
      exit(-1);
   }

   write(sockC,modo,MAX);
   printf("3\n");
//Comprobamos si la accion introducida por el usuario es un GET o un PUT
   if((get=strcmp(modo,"get"))==0){
      write(sockC,fichero_remoto,MAX);
      while((read(sockC,buffer,MAX))!=0){      //para ver si el servidor nos envia el cierre...
         for(i=0;1<22;i++){
            cierre=buffer;
         }
         if((strcmp(cierre,"fin_de_la_transmision"))==0)
            break;
         else{
            archivo=fopen(fichero_local,"a+");
            fprintf(archivo, "%s\n",buffer);
            fclose(archivo);
         }
      }
   }

//Si por el contrario es un PUT
   if((put=strcmp(modo,"put"))==0){
      write(sockC,fichero_remoto,MAX);
      archivo=fopen(fichero_local,"r");
      if(archivo==NULL){
         printf("No se ha podido encontrar el fichero local de nombre: %s\n",fichero_local);
         write(sockC,"No existe ese fichero que ha solicitado.\n",MAX);
      }
      else{
         while((fscanf(archivo,"%s",buffer))!=EOF){
            write(sockC,buffer,MAX);
         }
      }
      fclose(archivo);
   }
   close(sockC);
}
      


y al ejecutar el cliente:

oscar@oscar-VirtualBox:~/Escritorio/PRUEBAS PRACTICAS$ ./client -m put -r prueba.txt -h lsc30@labit301.upct.es -l prueba1.txt
Socket cliente creado.
ENTRA_1
ENTRA_2
ENTRA_2
ENTRA_2
ENTRA_2
ENTRA_4
ENTRA_3
1
Error al establecer la conexion con el servidor.
oscar@oscar-VirtualBox:~/Escritorio/PRUEBAS PRACTICAS$ ssh: connect to host labit301.upct.es port 22: Connection timed out
..
Disculpar si no es la forma mas adecuada de preguntar... pero estoy empezando..
MUCHAS GRACIAS de antemano :)


En línea

C_1^N

Desconectado Desconectado

Mensajes: 13



Ver Perfil
Re: Problemas para conectar cliente/servidor tunneling SSH
« Respuesta #1 en: 14 Noviembre 2012, 20:59 pm »

Hola Oscar34!
te convendria usar la funcion perror para marcar los errores de creacion de socket, bind, conexion, etc ya que te devolveria el error detallado de lo que esta pasando, tal vez asi te des cuenta en que esta fallando.

Saludos!


En línea

La gestión manual de bloques de memoria en C es como hacer malabarismos con pastillas de jabón en la ducha de la prisión: todo diversión hasta que cometes un fallo
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Problemas para conectar cliente/servidor tunneling SSH
« Respuesta #2 en: 15 Noviembre 2012, 15:40 pm »

Hola Oscar34!
te convendria usar la funcion perror para marcar los errores de creacion de socket, bind, conexion, etc ya que te devolveria el error detallado de lo que esta pasando, tal vez asi te des cuenta en que esta fallando.

Saludos!

Si, es una buena costumbre poner comprobaciones despues de cada funcion para saber que esta fallando. Y tambien usar etiquetas GeSHi, para que el codigo sea legible  ;)
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
Oscar34

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Problemas para conectar cliente/servidor tunneling SSH
« Respuesta #3 en: 15 Noviembre 2012, 19:53 pm »

Hola,
1) Muchas gracias por contestar y por la ayuda  ;D

He aplicado lo que me decías del perror, ( y con las GeSHI ...mucho mas bonito, donde va a parar) ... modificado un poco el programa,creo que ahora reside en la conexion en si ...en el port-forwarding (bastante probable jeje) o en el servidor labit301, que es de mi universidad y no se si tiene que estar abierto o algo asi..,ya que  ahora me da el siguiente mensaje:

oscar@oscar-VirtualBox:~/Escritorio/PRUEBAS PRACTICAS/cl$ ./client -m get -r ejemplo.txt -h lsc4@labit301.upct.es -l ejm.txt
Socket cliente creado.
ENTRA_1
ENTRA_2
ENTRA_2
ENTRA_2
ENTRA_2
ENTRA_4
ENTRA_3
ENTRA_5
Error al establecer la conexion con el servidor.
connect: Connection refused
oscar@oscar-VirtualBox:~/Escritorio/PRUEBAS PRACTICAS/cl$ ssh: Could not resolve hostname labit301.upct.es: Name or service not known

 ...

y el servidor que lanzo no me reconoce como que llega ningun cliente, sigue esperando eternamente el pobre :)

otra duda que tengo, en cuanto a los ficheros remoto y local... si hago un get al servidor, se supone que estoy pidiendo "ejemplo.txt" (que debo tenerlo en mi servidor.. lo que puesto en la misma carpeta que este) y almacenandolo en el cliente como "ejm.txt"    ¿?
..
poco a poco :) muchas gracias por la ayuda.




Código
  1.  
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <sys/socket.h>
  5. #include<netinet/in.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <unistd.h>
  9. #include <string.h>
  10. #include <fcntl.h>
  11. #include<getopt.h>
  12.  
  13. #define PUERTO 4000
  14. #define MAX 1024
  15.  
  16. int main(int argc, char*argv[]){
  17.  
  18. // Declaracion de variables
  19. int sockC,conexionSFTP;
  20. struct sockaddr_in serveraddr;
  21. char buffer[MAX];
  22. int opcion,get,put,i;
  23. char *modo=NULL;
  24. char *fichero_remoto=NULL;
  25. char *direccionIPsv=NULL;
  26. char *fichero_local=NULL;
  27. char cierre[22];
  28. FILE *archivo;
  29. pid_t hijo;
  30.  
  31. //Creamos el socket del cliente
  32. bzero(&serveraddr,sizeof(serveraddr));
  33. sockC=socket(AF_INET,SOCK_STREAM,0);
  34. if(sockC<0){
  35. printf("Error en la creacion del socket cliente.\n");
  36. perror("socket");
  37. exit(-1);
  38. }
  39. else{
  40. printf("Socket cliente creado.\n");
  41. }
  42. serveraddr.sin_family=AF_INET;
  43. serveraddr.sin_port=htons(PUERTO);
  44. serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
  45.  
  46. bzero(buffer,sizeof(buffer));
  47.  
  48.  
  49. printf("ENTRA_1\n");
  50.  
  51.  
  52. //Una vez crado el socket, recogemos los parametros de entrada de la linea de caracteres
  53. while(1){
  54. if((opcion=getopt(argc,argv,"m:r:h:l:"))==-1)
  55. break;
  56. printf("ENTRA_2\n");
  57. switch(opcion){
  58. case 'm':
  59. modo=optarg;
  60. break;
  61. case 'r':
  62. fichero_remoto=optarg;
  63. break;
  64. case 'h':
  65. direccionIPsv=optarg;
  66. break;
  67. case 'l':
  68. fichero_local=optarg;
  69. break;
  70. case '?':
  71. printf("Uno de los valores introducidos no es correcto.\n");
  72. printf("Recuerde: \n"
  73. "\n"
  74. "-m modo get o put\n"
  75. "-r fichero remoto\n"
  76. "-h direccion IP del servidor\n"
  77. "-l fichero local\n"
  78. "\n");
  79. break;
  80. }//swtich
  81. } //while
  82. if(optind<argc){
  83. printf("elementos de qrgv que no son opciones.\n");
  84. while(optind<argc)
  85. printf("%s",argv[optind++]);
  86. printf("\n");
  87. }
  88.  
  89. //Creamos el proceso hijo para ejecutar el SSH
  90.  
  91. if((hijo=fork())==0){
  92.  
  93. printf("ENTRA_3\n");
  94.  
  95. execl("/usr/bin/ssh","ssh","-L","4000:labit301.upct.es:3000",direccionIPsv,"-f","sleep","30",NULL);
  96. exit(-1);
  97. }
  98.  
  99. printf("ENTRA_4\n");
  100.  
  101. //esperamos para introduciir el password ssh
  102. sleep(25);
  103. printf("ENTRA_5\n");
  104. //Conectamos con el servidor SFTP
  105. conexionSFTP=connect(sockC,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr));
  106. if(conexionSFTP<0){
  107. printf("Error al establecer la conexion con el servidor.\n");
  108. perror("connect");
  109. exit(-1);
  110. }
  111.  
  112. write(sockC,modo,MAX);
  113. printf("ENTRA_6\n");
  114. //Comprobamos si la accion introducida por el usuario es un GET o un PUT
  115. if((get=strcmp(modo,"get"))==0){
  116. printf("Entra en buble get\n");
  117. write(sockC,fichero_remoto,MAX);
  118. printf("ENTRA_7\n");
  119. while((read(sockC,buffer,MAX))!=0){ //para ver si el servidor nos envia el cierre...
  120.  
  121. printf("ENTRA_8\n");
  122.  
  123.  
  124. for(i=0;1<22;i++){
  125. cierre[i]=buffer[i];
  126.  
  127. }
  128. if((strcmp(cierre,"fin_de_la_transmision"))==0)
  129. break;
  130. else{
  131. printf("ENTRA_9\n");
  132. archivo=fopen(fichero_local,"a+");
  133. fprintf(archivo, "%s\n",buffer);
  134. fclose(archivo);
  135. }
  136. }
  137. }
  138.  
  139. //Si por el contrario es un PUT
  140. if((put=strcmp(modo,"put"))==0){
  141. printf("Entra en bucle put\n");
  142. write(sockC,fichero_remoto,MAX);
  143. printf("ENTRA_10\n");
  144. archivo=fopen(fichero_local,"r");
  145. printf("ENTRA_11\n");
  146. if(archivo==NULL){
  147. printf("No se ha podido encontrar el fichero local de nombre: %s\n",fichero_local);
  148. write(sockC,"No existe ese fichero que ha solicitado.\n",MAX);
  149. }
  150. else{
  151. printf("ENTRA_12\n");
  152. while((fscanf(archivo,"%s",buffer))!=EOF){
  153. write(sockC,buffer,MAX);
  154. }
  155. }
  156. fclose(archivo);
  157. }
  158. close(sockC);
  159. }
  160.  
En línea

Oscar34

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Problemas para conectar cliente/servidor tunneling SSH
« Respuesta #4 en: 16 Noviembre 2012, 20:52 pm »

Hola, sigo poco a poco avanzando con mi pequeño pograma, me da el siguiente error..

channel 3: open failed: connect failed: Connection refused

¿Alguien podria decirme donde esta el fallo?.. que significa channel 3?..el problema es que el servidor del tunneling no este conectado?
Gracias de antemamo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines