Página 1 de 1

Script de comprobación de SNMP

NotaPublicado: 2015-01-19 15:58 @707
por jero2528
Hola a todos.

Tengo problemas con la siguiente sentencia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Ejecutando el comando: snmpwalk -v 2c -c localpublic $IPDEVICE\n";
  2.  
  3. #$salidaComando=system("snmpwalk -v 2c -c localpublic $IPDEVICE | head -5");
  4. #$salidaComando=`snmpwalk -v 2c -c localpublic $IPDEVICE | head -5 2>&1`; ##### Si uso este se queda procesando...
  5. #print `snmpwalk -v 2c -c localpublic $IPDEVICE | head -5`;
  6. #print "Salida: $salidaComando\n";
  7. system "snmpwalk -v 2c -c localpublic $IPDEVICE | head -5";
  8. print $?;
  9. print $? >> 8;
  10.  
  11. #print "Salida: $?\n";
  12. if ( ( $salidaComando =~ m/Timeout: No Response from $IPDEVICE/is ) ) {
  13.     $mensaje .= "No funciona el SNMP en ese equipo contra mi servidor\n";
  14. }
  15.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

¿Podrían ayudarme, por favor? Al ejecutarlo se queda procesando y solo puedo terminar la ejecución del script al hacer Ctrl+C.

Sé que algunas cosas están comentadas. En realidad son los intentos que he realizado para obtener la salida de la ejecución del comando :) Lo raro es que no obtengo nada. La única forma en que veo en la CLI la salida es usando system("cmd") pero no sé cómo capturarlo.

De antemano les agradezco si me pueden ayudar con otra idea o a mejorar alguna de las plasmadas en el script.


Gracias. :oops:

Re: Script de comprobación de SNMP

NotaPublicado: 2015-01-19 17:08 @755
por explorer
Yo no veo problemas en la parte de Perl, así que sospecho que el programa se para al ejecutar snmpwalk.

Por otra parte, si lo que quieres es ejecutar la salida del comando, no debes usar system(), sino qx():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $cmd = "snmpwalk -v 2c -c localpublic $IPDEVICE | head -5";
  2.  
  3. print "Ejecutando el comando: [$cmd]\n";
  4.  
  5. $salidaComando = qx($cmd);
  6.  
  7. if ($salidaComando =~ m/Timeout: No Response from $IPDEVICE/is ) {
  8.     $mensaje .= "No funciona el SNMP en ese equipo contra mi servidor\n";
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Otro tema distinto es que snmpwalk se cuelgue... Si es así, hay que tomar otras medidas, como puede ser alarm() para que se mate el proceso arrancado, y que el programa Perl continúe.

Re: Script de comprobación de SNMP

NotaPublicado: 2015-01-20 09:01 @417
por jero2528
Hola, explorer.

Gracias por tu ayuda, sigo teniendo el problema :( A continuación te dejo la salida usando el script y luego aplicando el comando directamente desde la CLI:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@server scripts]# ./scripts_pruebas/reporte_snmp_devices.pl
  2. Ejecutando el comando: [snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5]
  3. [root@server scripts]# snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5
  4. SNMPv2-MIB::sysDescr.0 = STRING: Cisco IOS Software, C181X Software (E181X-ADVIPSERVICESK8-M), Version 12.4(4)T1, RELEASE SOFTWARE (fc4)
  5. Technical Support: http://www.cisco.com/techsupport
  6. Copyright (c) 1986-2005 by Cisco Systems, Inc.
  7. Compiled Wed 21-Dec-05 15:55 by ccai
  8. SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.9.1.641
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

La idea de mi script es desde el servidor ejecutar el comando con la IP de cada uno de los equipos de red, y verificar que si no funciona el SNMP se debe enviar un mensaje de alerta, por esto es tan importante la salida que requiero del comando ejecutado, pero por alguna razón no la está capturando :( y se queda mucho tiempo como lo que muestra la línea 3 de la salida anterior, y para detenerlo simplemente hago un Ctrl+C y se detiene la ejecución, ya probé esperando hasta 1 hora pero no pasa nada :?

Gracias

Re: Script de comprobación de SNMP

NotaPublicado: 2015-01-20 12:25 @559
por explorer
Pues sí que es raro.

En situaciones anteriores, una cosa así me pasaba hasta que me di cuenta de que la salida del comando no estaba saliendo por la salida estándar, sino por la salida estándar de error. Claro: si ejecutas el comando por la terminal, las dos salidas van a parar al mismo sitio (la terminal), y no te das cuenta de que el comando lo está enviado por otro canal.

La forma de darte cuenta de esto es ejecutar
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5 > prueba.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Si prueba.txt no contiene nada (o no toda la salida), entonces es que toda (o parte de) la salida va por la salida estándar de error. En ese caso hay que usar otro módulo, como open2 u open3.

Pero no creo que sea este el caso... en la página de manual de snmpwalk no dice nada de que la salida sea por la salida estándar de error (excepto los log, que sí pueden redireccionarse por ahí).

Puedes probar este código (sacado de perldoc -f alarm):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $IPDEVICE = '200.65.3.229';
  2. my $cmd = "snmpwalk -v 2c -c localpublic $IPDEVICE | head -5";
  3. print "Ejecutando el comando: [$cmd]\n";
  4. eval {
  5.     local $SIG{ALRM} = sub { die "timeout\n" }; # Nota: \n es requerido
  6.     alarm 10;                                   # ajustamos una alarma a los 10 segundos
  7.     $salidaComando = qx($cmd);                  # ejecutamos el comando. Debe terminar antes de 10 s
  8.     alarm 0;                                    # todo bien, desactivamos alarma
  9. };
  10. if ($@) {                                                               # si hubo errores...
  11.     die unless $@ eq "timeout\n";                                       # Propagar los errores inesperados
  12.     die "ERROR: Se produjo un error al ejecutar [$cmd]: [$@]\n";        # paramos el programa informando del error
  13. }
  14. print "Salida: [$salidaComando]\n";                                     # no hubo problemas: sacamos la salida del comando
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con la ayuda de alarm(), creamos un tiempo límite de ejecución. Si se llega a ese tiempo, se ejecuta el $SIG{ALRM}, que contiene un die(), que es capturado por el eval{}, y podemos seguir con el resto del programa.

Otra cosa... en CPAN hay unos cuántos módulos para gestionar SNMP... ¿no les quieres dar una oportunidad? ;)

Re: Script de comprobación de SNMP

NotaPublicado: 2015-01-21 11:45 @531
por jero2528
La primera prueba funcionó dejando el registro de las líneas de respuesta, pero en el segundo caso sucedió lo mismo, solo que esta vez me generó este error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@server ~]# ./scripts_pruebas/reporte_snmp_devices.pl
  2. Ejecutando el comando: [snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5]
  3. ERROR: Se produjo un error al ejecutar [snmpwalk -v 2c -c localpublic 200.65.3.229 | head -5]: [timeout
  4. ]
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Intentaré con los módulos de SNMP; lo que sucede es que no los he usado, tendré que estudiarlos primero.

Muchas gracias por tu ayuda, explorer.

Re: Script de comprobación de SNMP

NotaPublicado: 2015-01-21 16:02 @710
por explorer
Vale, el problema está justo en la ejecución del comando.

Yo haría una prueba quitando la parte " | head -5 ", no sea que esté influyendo.

Segundo, haría una prueba con solo

snmpwalk --version

para estar seguros de que no se trata de un retraso producido por el propio comando y no por los argumentos que le estamos pasando.

Tercero, si no funciona, en el shell ejecutaría un which snmpwalk para averiguar la ruta completa al comando. Por ejemplo, podría estar instalado en /usr/local/bin/. En ese caso, modificamos $cmd con esa ruta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cmd = "/usr/local/bin/snmpwalk -v 2c -c localpublic $IPDEVICE";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si con eso funciona, entonces le ponemos el head...

Prueba, y dinos.

Re: Script de comprobación de SNMP

NotaPublicado: 2015-01-21 17:11 @758
por jero2528
Quitando el head:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@server ~]# /home/eherrera/scripts_pruebas/reporte_snmp_devices.pl
  2. Ejecutando el comando: [snmpwalk -v 2c -c localpublic 200.62.0.230]
  3. ERROR: Se produjo un error al ejecutar [snmpwalk -v 2c -c localpublic 200.62.0.230]: [timeout]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Probando con solo snmpwalk --version:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Ejecutando el comando: [snmpwalk --version]
  2. NET-SNMP version: 5.3.2.2
  3. Salida: []
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Me muestra en pantalla el resultado pero no lo captura en la variable de salida :?

Y con la tercera y cuarta opción me genera el error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Ejecutando el comando: [snmpwalk -v 2c -c localpublic 200.62.0.230]
  2. ERROR: Se produjo un error al ejecutar [snmpwalk -v 2c -c localpublic 200.62.0.230]: [timeout]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Realicé pruebas con la librería Net::SNMP:HostInfo parece que funciona bien, lo único es que no he podido encontrar algún equipo que no esté respondiendo al SNMP :) :lol: para saber cómo se está recibiendo la respuesta.

Relaciono el código usado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Net::SNMP::HostInfo;
  2. $host = shift || '200.62.0.230';
  3.         $password = shift || 'localpublic';
  4.          
  5.         $hostinfo = Net::SNMP::HostInfo->new(Hostname => $host,
  6.                                              Community => $password);
  7.          
  8.         print "Packets Received = ", $hostinfo->ipInReceives, "\n";
  9.         print "Output Requests = ", $hostinfo->ipOutRequests, "\n";
  10.          
  11.         print "TCP Segments Received = ", $hostinfo->tcpInSegs, "\n";
  12.         print "TCP Segments Sent = ", $hostinfo->tcpOutSegs, "\n";
  13.          
  14.         print "UDP Datagrams Received = ", $hostinfo->udpInDatagrams, "\n";
  15.         print "UDP Datagrams Sent = ", $hostinfo->udpOutDatagrams, "\n";
  16.  
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Gracias por la ayuda, explorer, espero que esto le sirva de ayuda a otros perleros :).

Re: Script de comprobación de SNMP

NotaPublicado: 2015-01-21 20:08 @881
por explorer
Me he instalado el paquete snmp y ya sé lo que pasa: que los comandos snmp envían su resultado a la salida estándar de error, que es lo que te comentaba en una de mis primeras respuestas.

Lo que muestras de la salida de snmpwalk --version ha sido la clave: si vemos que sale algo en pantalla, pero Perl no lo ha capturado, es que está saliendo por la salida estándar de error.

Haz una prueba con esta línea, y nos cuentas.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cmd = "/usr/local/bin/snmpwalk -v 2c -c localpublic $IPDEVICE 2>&1 | head -5";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo que hace es redirigir la salida estándar de error a la salida estándar normal, por lo que head ya recibe algo.

Re: Script de comprobación de SNMP

NotaPublicado: 2015-01-22 09:29 @437
por jero2528
explorer, realicé la prueba y aun no funciona :(

Aquí el código usado. Decidí aumentar los 10 segundos a 20 a ver si era por eso, pero pasa igual:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $row_r_query01 (@$r_query01) {
  2.         ($IDHOST, $IPDEVICE, $TIPO, $LOCATION, $COMPLETENAME, $DEVICE, $MANUFACTURER) = @$row_r_query01;
  3.         $cmd = "/usr/bin/snmpwalk -v 2c -c localpublic $IPDEVICE 2>&1 | head -5";
  4.         print "Ejecutando el comando: [$cmd]\n";
  5.         eval {
  6.             local $SIG{ALRM} = sub { die "timeout\n" }; # Nota: \n es requerido
  7.             alarm 20;                                   # ajustamos una alarma a los 20 segundos
  8.             $salidaComando = qx($cmd);                  # ejecutamos el comando. Debe terminar antes de 10 s
  9.             alarm 0;                                    # todo bien, desactivamos alarma
  10.         };
  11.         if ($@) {                                                               # si hubo errores...
  12.             die unless $@ eq "timeout\n";                                       # Propagar los errores inesperados
  13.             die "ERROR: Se produjo un error al ejecutar [$cmd]: [$@]\n";        # paramos el programa informando del error
  14.         }
  15.         print "Salida: [$salidaComando]\n";
  16.         sleep(5);
  17.         if(($salidaComando=~m/Timeout: No Response from $IPDEVICE/is)){
  18.                 $mensaje.= "no estoy obteniendo respuesta de SNMP por parte del Equipo $IPDEVICE";
  19.                 $contador++;
  20.         }
  21. }
  22.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ese foreach se hace porque los equipos provienen de una consulta a una base de datos. La salida obtenida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@server ~]# ./scripts_pruebas/reporte_snmp_devices.pl
  2. Ejecutando el comando: [/usr/bin/snmpwalk -v 2c -c localpublic 200.62.0.230 2>&1 | head -5]
  3. ERROR: Se produjo un error al ejecutar [/usr/bin/snmpwalk -v 2c -c localpublic 200.62.0.230 2>&1 | head -5]: [timeout
  4. ]
  5.  
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



:cry:

Re: Script de comprobación de SNMP

NotaPublicado: 2015-01-22 14:06 @629
por explorer
Pues... se me están acabando las ideas.

Mira, en mi equipo, si ejecuto esto desde la línea de comandos, no sale nada
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -E '$salida = qx(snmpwalk --version  | wc ); say "[$salida]"'
  2. NET-SNMP version: 5.4.3
  3. [      0       0       0
  4. ]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Mejor dicho: sale el mensaje que se espera, pero por la salida de error. El comando wc no recibe nada.

Si pongo la redirección, entonces sí que lo capturo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -E '$salida = qx(snmpwalk --version  2>&1 | wc ); say "[$salida]"'
  2. [      1       3      24
  3. ]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Humm... creo que podrías quitar el head porque no creo que te influya en el resto del programa. Menos problemas si lo quitas.

Pero el problema sigue siendo que snmpwalk no regresa, y no sé el motivo.

Bueno, si te funciona el módulo, mejor. Así no tienes que pelearte con las expresiones regulares.