jueves, 8 de octubre de 2009

Acceso remoto automatizado por telnet

Aunque el método común de logarse en una máquina de manera remota (y en modo texto) es ssh, en alguna ocasión puede que nos toque administrar sistemas antiguos que usan telnet para las labores de administración remota.

En este caso, permitir que un script se pueda logar por telnet en una máquina remota y ejecutar algunos comandos puede resultar tarea dificil (telnet no permite especificar por linea de comandos usuario y contraseña). A simple vista nos parecería que el logado por telnet requiere hacerse por una persona. No obstante, este proceso se puede automatizar (y por tanto, usarlo en nuestros scripts).

La idea es la siguiente: "teclear" los comandos o textos necesarios cuando las aplicaciones nos las van pidiendo. Cuando ejecutamos el comando telnet $IP_SERVIDOR, en un segundo o menos nos aparece el típico "Login: "; en este momento nuestro script tecleará el login correspondiente. Tras dos segundos (o algo menos) se nos pide "Password: "; a lo que nuestro script responderá. Y así con el resto de comandos o textos que una persona que se logase fuese introduciendo (con las temporizaciones correctas).

Os pongo un ejemplo:

#!/bin/sh

SERVIDOR=192.168.1.100
USUARIO=admin
PASSWORD=istrador
(sleep 1;echo $USUARIO; sleep 2; echo $PASSWORD; sleep 3; echo "xterm"; sleep 3;echo "bdf"; sleep 2; echo "exit" ) | telnet $SERVIDOR >salida 2> /dev/null

Si omitimos la redirección de la salida estándar a fichero, podremos ver cómo se va ejecutando todo y se van escribiendo los comandos en los tiempos establecidos. Si no dejásemos una pausa de 2 segundos entre la introducción del login y del password, el password se escribiría en pantalla antes de que el demonio telnet imprima el texto "Password: ", y muchos demonios telnet (si no todos) olvidan lo tecleado antes de solicitar el password. Lo mismo para el resto de comandos; necesitamos esperar a que "bdf" (df de HP-UX) termine de ejecutarse y nos aparezca el prompth del shell para poder meter el siguiente comando: exit.