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.
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).
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.
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'
La aplicación está diseñada para operar en sistemas Unix y su funcionamiento depende de que las siguientes aplicaciones estén instaladas:
el programa inicia el cliente ssh por cada conexion que sea requerida.
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.
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
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.
add_date(filename, ejemplo);
La salida del ejemplo es el buffer "filename" llenado con ejemplo_10-12-03_20:01.log
nombre: Nombre del buffer a llenar.
prefix: Prefijo del string guardado en el buffer.
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.
ptr: Puntero a una estructura de tipo 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)
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.
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
Crea un proceso que realiza la conexión ssh. Crea dos fifos, uno para lectura, otro para escritura al servidor ssh.
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.
Crea un proceso para "gnome-terminal" y establece el nombre del terminal. Retorna un puntero a un fifo con el nombre del terminal.
title: Nombre del terminal.
geometry: Especificaciones del aspecto visual del terminal. (ver opción --geometry en "man gnome-terminal")
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: