Integrantes

Miguel Olave
molavec[^_~]gmail.com
Francisco Rojas
fjrojasb[^_~]gmail.com

 

 

Descarga

Presentación

Introducción

 

  SSH (Secure SHell), es un interprete de ordenes que sirve para acceder a servidores remotos de manera segura, encriptando la información tranmisida en la conexión, por lo que muchos administradores de servidores y dispositivos con conexion LAN han definido este mecanismo para permitir a los clientes acceder a los servicios que estos ofrecen.

  Usualmente, no se requiere más de una conexión para realizar una tarea rutinaria, como modificar un archivo, realizar un cambios de permisos o de algún parametro en un servidor. Sin embargo, algunos servidores ofrecen servicios, como la ejecución de programas de manera remota, la entrega o almacenamiento de datos adquiridos mediante sensores, etc.

  En ocaciones, las operaciones en un servidor resultan ser repetivas, es nesesario realizar modificaciones de manera automáticao simplemente se requieren hacer multiples conexiones a uno o distintos servidores, por lo que puede resultar más conveniente el uso de un script que ayude en estas tareas. La siguiente aplicación se permite automatizar este proceso.

 

 

Origen de la idea

 

  El robot IrmabotII necesita ejecutar diversos procesos (moverse, reconocer objetos,etc) para funcionar. Cada proceso ejecutado en el robot es iniciado desde un computador externo mediante ssh. Es necesario iniciar los procesos en un orden estricto. Se espera hasta que el proceso \"longRangenavigator\" termine y luego se cierran todos los demás proceso y se guardan algunos archivos en un computador externo. En la actualidad todos estos pasos se realiza manualmente ejecutando los comandos de conexión consolas separadas. Cada programa entrega resultados en pantalla (salida estándar).

 

Imagen 1: Robot IrmabotII.

 

 

 

Bosquejo de solución

 

  Realizar un programa, en lenguaje C, que realice este proceso automáticamente usando hebras y/o creación de procesos, iniciando los procesos externamente mediante conexiones ssh. Además, usar algún método de comunicación de procesos o memoria compartida para desplegar o guardar los resultados.

 

 

Descripción de la aplicación

 

  La siguiente aplicación entrega las herramientas para realizar multiples conexiones a uno o distintos servidores ssh ejecutar un comando y desplegar los resultados en consolas separadas para cada conexión y guardar toda la información desplegada en el pantalla en un archivo de texto plano con extensión '.log'

 

Requisitos de operación

  La aplicación está diseñada para operar en sistemas Unix y su funcionamiento depende de que las siguientes aplicaciones estén instaladas:

  • Cliente Open SSH
  • gnome-teminal

 

funcionamiento del programa

  el programa inicia el cliente ssh por cada conexion que sea requerida.

 

Imagen 2: Esquema general de funcionamiento.

 

  Para realizar la comunicación entre el programa principal y los diversos procesos se hace uso de FIFOs . Además, se hace uso de hebras para manejar la salida de las conexiones SSH.

 

Imagen 3: esquema de comunicación del programa principal con los procesos SSH.

 

  En la Imagen 3 se aprecia estructura de comunicación entre los procesos y las hebras. Notar que la entrada de comandos se realizan desde la hebra principal a través de descriptores de archivo que apuntan a los fifos de entrada a la conexión ssh, lo que entrega la ventaja de sólo tener que modificar el programa pincipal para generar una secuencia distinta en la ejecución de instrucciones (incluso generar más hebras que manejen dichas entradas para una ejecución concurrente).

  En la Imagen 4 se puede observar de mejor forma la comunicación de los datos desde que se lanza una instrucción en el programa principal hasta que es desplegada en un terminal y guardada en un archivo

 

Imagen 4: Diagrama de bloques de comunicación entre las partes del programa.

 

 

Funciones utilizadas por multisshconnection

 

  void add_date(char* nombre, char* prefix)

 

  • Definición:

  LLena el buffer "nombre" del tipo prefix_YY-MM-DD_HH:MM:SS.log La fecha y hora corresponden al momento en que se llama la función.

      YY: Año en dos digitos.

      MM: Mes en dos digitos.

      DD: Dia en dos digitos.

      HH: Hora en formato 24h.

      MM: Minutos en dos digitos.

 

  • Ejemplo:

  add_date(filename, ejemplo);

La salida del ejemplo es el buffer "filename" llenado con ejemplo_10-12-03_20:01.log

 

  • Argumentos necesarios:

      nombre: Nombre del buffer a llenar.

      prefix: Prefijo del string guardado en el buffer.

 

 

  void* read_fifo(void *ptr)

 

  • Definición:

  Lee la salida por consola a través del fifo con el nombre de la consola. Crea un archivo .log con el nombre de la consola mediante un llamado a add_date(), donde se almacena todo lo desplegado en esa consola.

 

  • Argumentos necesarios:

       ptr: Puntero a una estructura de tipo ot.

 

 

  • Descripción de la estructura ot:

  Estructura que sirve para que la función 'read_fifo' obtenga los descriptores de archivo desde donde leer y donde desplegar.

      typedef struct outThread {
            int fd_input;
            char *fifo_console_name;
            char *namelog;
      } ot;

 

 

  int start_connection(pthread_t *tid1, char *userName, char *hostName, char *fifoIn, char *fifoOut, char *consoleTitle, char *consoleGeometry, char* namelog)

 

  • Definición:

  Crea todas las conexiones haciendo llamados a sshComunicator(), getconsole(), read_fifo() y creando hebras.

      Crea una hebra y un fifo para recibir los datos enviados por el servidor ssh.

      Crea un fifo para enviar a un terminal los datos recibidos por la hebra.

      Crea un fifo para enviar comandos al servidor ssh

      Retorna un descriptor de archivo para enviar comandos al servidor ssh.

 

  • Argumentos necesarios:

      

      tid1: Puntero a una hebra.

      userName: Nombre del usuario para conectarse al servidor ssh.

      hostName: Dirección IP del servidor ssh.

      fifoIn: Puntero a un fifo para recibir datos.

      fifoOut: Puntero a un fifo para enviar datos.

      consoleTitle: Nombre de la consola.

      consoleGeometry: Detalles del aspecto de la consola

      namelog: Prefijo para un archivo .log

 

 

  void sshComunicator(char *userName, char *hostName, char *finputname, char *foutputname)

 

  • Definición

 Crea un proceso que realiza la conexión ssh. Crea dos fifos, uno para lectura, otro para escritura al servidor ssh.

 

  • Argumentos necesarios:

      userName: Nombre del usuario para conectarse al servidor ssh.

      hostName: Dirección IP del servidor ssh.

      finputname: Nombre del fifo usado para lectura.

      foutputname: Nombre del fifo usado para escritura.

 

  char* getconsole(char *title, char *geometry)

 

  • Definición

  Crea un proceso para "gnome-terminal" y establece el nombre del terminal. Retorna un puntero a un fifo con el nombre del terminal.

 

  • Argumentos necesarios:

      title: Nombre del terminal.

      geometry: Especificaciones del aspecto visual del terminal. (ver opción --geometry en "man gnome-terminal")

 

 

Modo de uso de la aplicación msshc

 

Este proyecto realiza cuatro conexiones ssh.
Luego abre un terminal por cada conexion para mostrar la ejecución remota de comandos enviados por el programa.
Se envía un comando simple a cada conexión: 'ls -la', 'ps aux', 'netstat' y 'hostname'.
Lo que se muestra en cada terminal es guardado en un archivo .log.
El programa queda en espera de un ENTER en el terminal donde es ejecutado.

Pasos para ejecutar este programa:

  • Generar llaves RSA para que no se pida password al realizar las conexiones ssh. Para realizar esto seguir los pasos del 'Instructivo_conexion_ssh_sin_pass.txt' que se encuentra en la documentación.
  • Hacer un 'make'.
  • Llamar el programa de la forma './msshc usuario host'.