En esta segunda entrega vamos a ir mucho más al grano. Como se dijo en la primera parte, se entiende que el lector tiene cierto nivel de programación, por lo que se da por sabido lo que es un objeto y cómo utilizarlo, y que el código expuesto será comprensible. De este modo, vamos a realizar una rápido vistazo a las capacidades de los objetos que nos aporta SecureCRT, y un ejemplo de uso aplicando estos objetos y otros propios de Office-Windows con un código comentado.
Objetos de SecureCrt:
No vamos a enumerar cada una de las propiedades y métodos de cada objeto del programa, principalmente porque dicha información es accesible desde la ayuda de la aplicación en: Contenido - ActiveX Scripting - Scripts Objets Reference. El nivel de inglés utilizado en dicha ayuda en bastante básico, aunque no descarto realizar mi propia versión de dicha ayuda en castellano.
Usaremos los objetos para interactuar con SecureCRT, y por medio de ellos podremos inciar sesión, pedir datos al usuario, enviar o leer datos a pantalla, y muchas cosas más que iremos viendo. Algo que no podemos hacer es acceder directamente a los datos que se transiferen, esto es: podremos leer y escribir de pantalla como el mismo texto que vería un operador accediendo manualmente, sin opción de aceder al propio flujo de datos que se está transmitiendo.
Una lista de objetos de uso común podría ser:
- crt.Session.Connect -> para iniciar una seisón Telnet o SSH. Siempre debemos tener una conexión activa en SecureCrt para poder escribir comandos, de este modo lo normal es que lo primero que hagamos sea conectar a un servido de gestión desde el cual a su vez conectaremos o lanzaremos comandos a los equipos administrados. Si la propia máquina que usamos puede hacer de servidor de gestión, podemos habilitar en ella el acceso por Telnet y abrir desde SecureCrt sesión Telnet a la IP local (127.0.0.1), para después lanzar los comandos.
- crt.Screen.Send -> para enviar texto a pantalla.
- crt.Screen.WaitForString -> para esperar texto de respuesta en pantalla
- crt.Screen.Get -> para capturar en una variable el texto en pantalla
Los métodos siguen la convención de llamada como procedimiento o función de Visual Basic, de forma que según expresemos los parametros entre parentesis o no, se devolverá un valor de retorno:
- crt.Screen.WaitForString "#",2 -> espera el carácter "#" en pantalla o dos segundos, y continua el código
- aux = crt.Screen.WairForString("#",2) -> devuelve True si aparece "#" antes de dos segundos, caso contrario devuelve False. Almacena el valor devuelto en la variable "aux" y continúa el código.
Pero vamos a lo que nos interesa: un código de ejemplo completo y útil. El siguiente código conecta a una base de datos Access y realiza ping a una lista de equipos contenidos en ella. Cuando termina muestra un fichero de texto con los equipos que no han respondido. El código estará comentado para una correcta comprensión de los objetos de SecureCRT utilizados.
Este código puede parecer de poca utilidad porque hay muchos programas como HostMonitor que realizan un ping periodico a las IP's que le indiquemos. Pero hay casos (como en mi trabajo) que no se dispone de una máquina en la red a administar en la que tengamos derechos para instalar nada, o solo tenemos acceso telnet al servidor de gestion, y la unica forma de automatizar tareas es realizar inventos como este.
El código supone la conexón SSH a un Sever de gestión Unix desde el cual lanzaremos los comandos Ping. Los datos de los equipos a los que probar ping están almacenados en una base de datos Access en una tabla llamada "equipos":
''''''''''''''''''''''INICIO DEL CODIGO (los comentarios en color Verde)
#$language = "VBScript" 'Siempre iniciaremos los scripts con estas dos lineas, o SecureCRT no podrá ejecutarlo.
#$interface = "1.0"
'No hay obligación de declarar constantes y variables ni se permite especificar el tipo, por lo que estas lineas realmente no hacen nada util. Se incluyen para especificar donde se usará cada variable y por hábitos de programación
Const ForReading = 1 'Constante para indicar apertura de fichero en modo lectura
Const ForWriting = 2 'Constante para indicar apertura de fichero en modo escritura
Const ForAppending = 8 'Constante para indicar apertura de fichero en modo apunte, es decir, escritura al final del fichero
dim fso,file,fsoerror,fileerror 'Variables para manejo de Ficheros
dim auxreadline,str,conterr 'Variables auxiliares y de control
Dim Rst, Cnn,sConn, sel 'Variables de manejo de BD
Dim shell 'Variables para manejo de shell de Windows
Sub main 'Inicio de rutina principal
'--------------------------------Conectar a servidor de gestión -------------------------------
Dim user, passwd, ip_ges
user = crt.Dialog.Prompt("Introduce tu usuario:", "Introducción de usuario", "", False) 'Muestra una ventana solicitando usuario
passwd = crt.Dialog.Prompt("Introduce tu Password:", "Introducción de password", "", True) 'Muestra una ventana solicitando password, y lo oculta gracias al parametro True
ip_ges = crt.Dialog.Prompt("Introduce IP:", "Introducción de IP", "", False) 'Muestra una ventana solicitando IP del servidor de gestión
On Error Resume Next 'Si hay un error, no interrumpe el Script
cmd = "/SSH1 /L " & user & " /PASSWORD " & passwd & " /C 3DES " & ip_ges 'Montamos la cadena que define la conexión
crt.Session.Connect cmd 'Ordenamos la conexión al Server de Gestión
if Err.Number <> 0 Then 'Si hay algún error se ejecuta el codigo a continuacion
MsgBox "No se puede conectar con gestiap: " & Err.Description 'Mostramos el error en pantalla
exit sub 'Salimos del Script
end if
crt.Screen.WaitForString "$" 'Esperamos el Prompt de escritura del Server, en Unix suele ser $
'--------------------------------Fin Conectar Server de Gestión-------------------------------
Set Cnn = CreateObject("ADODB.Connection") 'Creamos en memoria un objeto ADO de Base de datos
sConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\mibbdd.mdb;" 'Definimos la cadena de conexion a Base de Datos, indicando en Provider el driver de Base de datos (el de Acces en este caso) y en Data Source la ruta de dicha BBDD en nuestro disco duro
Cnn.Open(sConn) 'Abrimos la conexión con la BBDD
sel ="SELECT IP_Gestión,Equipo FROM equipos WHERE IP_Gestión<>''" 'Consulta SQL que vamos a filtrar a la BBDD. Capturamos IP y nombre de equipo de la tabla "equipos", excluyendo aquellos con la ip en blanco
Set Rst = Cnn.Execute(sel) 'Ejecutamos la consulta a BD y volcamos al objeto Rst el resultado
Set fsoerror = CreateObject("Scripting.FileSystemObject") 'Creamos un objeto de Fichero de texto
set fileerror = fsoerror.CreateTextFile("C:\errorlogping.txt", True) 'Abrimos un flujo a fichero en modo sobreeescritura y lo asignamos al objeto fileerror
Rst.MoveFirst 'Nos situamos en el primer registro de la consulta a BBDD
conterror = 0 'Inicializamos contador de equipos fallidos
Do While Not (Rst.BOF Or Rst.EOF) 'Comienzo del bucle para recorrer los registros de la consulta
str=trim(Rst.Fields("IP_Gestión").Value) 'Capturamos valor del campo IP_Gestion en variable auxiliar str
crt.Screen.Synchronous = True 'Comenzamos sincronizacion con pantalla. Esto sólo sirve para evitar agunos errores en la captura de datos de pantalla de SecureCRT
crt.Screen.Send "ping " & str & VbCr 'Enviamos a pantalla el ping a la IP capturada + Intro
if (crt.Screen.WaitForString(str & " is alive",3)=False) then 'Condicion1 - Caso de que no se produzca el ping en 3 seg. Hay que tener en cuenta que en el server de gestión que contemplamos, la respuesta a un ping correcto contiene la cadena "is alive" . Si esto no es asi el codigo dará siempre todos los ping por fallidos salvo que se modifique este codigo.
crt.Screen.Send Chr(3) & VbCr 'Enviamos Ctrl + C + Enter a pantalla para cortar el intento de ping y volver al prompt de Unix
fileerror.Write trim(Rst.Fields("Equipo").Value) & VbCrLf 'Volcamos al fichero de texto abierto el nombre del equipo fallido. Si se quiere volcar la IP en lugar del nombre, cambiar el campo en Rst.Fields
conterror = conterror + 1 'Incrementamos contador de equipos fallidos
end if 'Fin de condicion1
crt.Screen.WaitForString "$",2 'Esperamos al Prompt o 2 segundos
crt.Screen.Synchronous = False 'Terminamos sincronizacion con pantalla
Rst.MoveNext 'Avanzamos al siguiente registro de la consulta a BBDD
Loop 'Fin de vuelta del bucle
fileerror.Close 'Cerramos flujo a fichero
if conterror<>0 then 'Condicion2 - Si existe algun equipo fallido se ejecuta el código a continuacion
if (msgbox("No se ha podido conectar a " & conterror & " equipos" & VbCrLf & "¿Desea comprobar qué equipos no tienen acceso?",276,"No se ha podido conectar a algunos equipos")=6) then ' Condicion3 - Si se responde SI al mensaje en pantalla se ejecutará el coigo a continuacion, que muestra el fichero con equipos fallidos
Set shell = CreateObject("WScript.Shell") 'Creamos instancia del Shell de Windows
shell.Run """%systemroot%\notepad"" C:\errorlogping.txt" 'Ejecutamos Bloc de notas para mostrar el contenido del fichero de log de errores donde habiamos volcado los equipos fallidos
end if 'Fin de condicion3
else 'Condicion2 - Caso de que no fallara ningún equipo
msgbox "Todos los equipos responden a la prueba de ping",64,"Proceso finalizado" 'Mostramos en pantalla mensaje de fin de Script
end if 'Fin de condicion3
Rst.Close 'Cerramos objeto de consulta para liberarlo de memoria
Cnn.Close 'Cerramos conexion a BDpara liberarlo de memoria
End Sub 'Fin de rutina principal del Script
''''''''''''''''''''''FIN DEL CODIGO
Esto es todo por ahora, en la siguiente entrega mostraremos una función recursiva para hacer Telnet a equipos Cisco de forma recursiva y uso de ficheros excel desde el Script
Saludos!
Suscribirse a:
Enviar comentarios (Atom)
Muy buena data!
ResponderEliminarGracias.
Hola...
ResponderEliminarGracias por la explicacion, estaba buscando otras cosas pero igual de aqui aprendi muchas cosas que no sabia.
Buenas tardes, me gustaria saber como puedo obtener la hora del sistema mediante VBSCRIPT Muchas graicas
ResponderEliminarmuy bien buen articulo !!!!!!
ResponderEliminarGracias muy buena idea si se puede armar un grupo para intercambiar info adelante
ResponderEliminar