• Publicidad

Ejecución de comandos shell en Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-13 10:40 @486

Buenas a todos,
Tengo una duda sobre la ejecución de comandos shell en Perl.
¿Podría alguien completar el siguiente código?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach (`COMANDO`)
{
    if (RETORNO DEL COMANDO CONTIENE /Asterisk/)
    {
      $output=RETORNO DEL COMANDO;
    }
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Publicidad

Re: Ejecución de comandos shell en Perl

Notapor salva » 2010-01-13 11:20 @514

davidin073 escribiste:¿Podría alguien completar el siguiente código?

Es difícil adivinar lo que quieres hacer exactamente con la información que nos das. ¿Por qué no tratas de describirnos tu problema con un poco más de detalle, qué es lo que quieres conseguir y cuál es el contexto?
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Ejecución de comandos shell en Perl

Notapor explorer » 2010-01-13 11:23 @516

Bienvenido a los foros de Perl en Español, davidin073.

Yo me voy a arriesgar...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach (qx(COMANDO)) {
    if (/Asterisk/) {
        $output = $_;
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


:lol:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-13 14:18 @637

Buenas de nuevo,
Lo que pretendo hacer es ejecutar un comando y si el retorno de dicho comando empieza o contiene un string determinado, retornar una variable, por ejemplo.

Lo que no entiendo es cómo se ejecutan comandos en Perl dentro de un foreach(), concretamente dónde queda guardado lo que retorna dicho comando.

Probaré lo que me has puesto, explorer, y mañana te comento.

Gracias.
Última edición por explorer el 2010-01-14 08:42 @404, editado 1 vez en total
Razón: Ortografía
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Re: Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-13 14:31 @647

Exactamente el códido que no me funcionaba bien era el siguiente:

El comando es : /usr/bin/sudo /usr/sbin/asterisk -rx 'show version'
Esta distribuido en tres variables:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $a = "/usr/bin/sudo /usr/sbin/asterisk";
my $b = "-rx";
my $c = "show version";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y el código que tengo y no me funciona es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach (`$a $b \"$c\"`) {
    if (/Asterisk/) {
      $return=0;
      $output=$_;
   }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Debería retornar la variable $return==0 y no lo hace porque no entra por el if(), hay algo mal supongo.
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Re: Ejecución de comandos shell en Perl

Notapor explorer » 2010-01-13 15:09 @673

Bueno, yo no tengo instalado el Asterisk, pero a mi sí me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $a = "/bin/ls";
  7. my $b = "-alrt";
  8. my $c = "*.pl";
  9.  
  10. for ( qx( $a $b $c ) ) {
  11.     #print ":>$_";       # Qué es lo que estamos leyendo
  12.     if (/kk/) {
  13.         print "[[$_";    # ¡Encontrado!
  14.     }
  15. }
  16. __END__
  17. [[-rwxr-xr-x 1 explorer users   509 oct  4  2008 kk3.pl
  18. [[-rwxr-xr-x 1 explorer users 12489 mar  2  2009 kk4.pl
  19. [[-rwxr-xr-x 1 explorer users   326 sep  1 22:54 kk1.pl
  20. [[-rwxr-xr-x 1 explorer users 34850 nov 11 16:18 kk2.pl
  21. [[-rwxr-xr-x 1 explorer users   761 dic 14 16:37 kkdiscos.pl
  22. [[-rwxr-xr-x 1 explorer users 10541 ene 13 21:06 kk.pl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Descomenta la línea 11 y así verás las líneas que está recibiendo el for().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-13 15:37 @692

Ok, explorer, lo que creo que no hace bien es coger la tercera variable.

En tu ejemplo las has puesto seguidas. Si te fijas en lo que he puesto van seguidas pero la ultima entre comillas simples. Creo que por eso no capta bien.

En el primer comentario no he puesto el código porque sé que habrá gente que no use Asterisk, pero digamos que simplemente es la ejecución de un comando en el que la última palabra va entre comillas simples.
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Re: Ejecución de comandos shell en Perl

Notapor explorer » 2010-01-13 16:34 @732

Si pongo comilla simple, entonces (al ser un 'ls'), buscará por ese fichero, y funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $a = "/bin/ls";
  7. my $b = "-alrt";
  8. my $c = "'kk.pl'"; # <= comillas simples en el argumento
  9.  
  10. print "[$a $b $c]\n";
  11. for ( qx( $a $b $c ) ) {
  12.     #print ":>$_";
  13.     if (/kk/) {
  14.         print "[[$_";
  15.     }
  16. }
  17. __END__
  18. [/bin/ls -alrt 'kk.pl']
  19. [[-rwxr-xr-x 1 explorer users 10544 ene 13 22:23 kk.pl
  20.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y si pongo comillas dobles en el qx(), también:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $a = "/bin/ls";
  7. my $b = "-alrt";
  8. my $c = "kk.pl";
  9.  
  10. print "[$a $b $c]\n";
  11. for ( qx( $a $b "$c" ) ) {    # <= Comillas dobles
  12.     #print ":>$_";
  13.     if (/kk/) {
  14.         print "[[$_";
  15.     }
  16. }
  17. __END__
  18. [/bin/ls -alrt kk.pl]
  19. [[-rwxr-xr-x 1 explorer users 10544 ene 13 22:25 kk.pl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Prueba con esto, que parece más claro:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $a = '/bin/ls';
  7. my $b = '-alrt';
  8. my $c = 'kk.pl';
  9.  
  10. my $cmd = qq($a $b "$c");   # <= Comillas dobles mientras hacemos el comando
  11. print "[$cmd]\n";
  12.  
  13. for ( qx( $cmd ) ) {
  14.  
  15.     if (/kk/) {
  16.         print "[[$_";
  17.     }
  18. }
  19.  
  20. __END__
  21. [/bin/ls -alrt "kk.pl"]
  22. [[-rwxr-xr-x 1 explorer users 10565 ene 13 22:30 kk.pl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-13 16:47 @741

Ok, muchas gracias, explorer. Mañana según pruebe os comento los resultados.
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Re: Ejecución de comandos shell en Perl

Notapor davidin073 » 2010-01-14 06:51 @327

Buenos días,
resulta que me funcionó lo que me dijiste, explorer; creo que el problema estaba en que no retornaba lo que yo quería, ahora más o menos funciona.

Tengo aún dudas sobre el retorno; te pongo dos ejemplos que no me funcionan:

Los dos comandos tienen este retorno:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[root@localhost src]# asterisk -rx 'dahdi show status'
Description                              Alarms     IRQ        bpviol     CRC4
Wildcard TDM400P REV E/F Board 5         OK         0          0          0


[root@localhost src]# asterisk -rx 'sip show registry'
Host                            Username       Refresh State                
proxy01.sipphone.com:5060       1xxxxxxxxxx        105 Registered          
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Mi código es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use Getopt::Std;
  4. use strict;
  5.  
  6. # Variables Globales
  7.  
  8. my $asterisk_bin="/usr/bin/sudo /usr/sbin/asterisk";
  9. my $asterisk_option="-rx";
  10. my $asterisk_command_channels="sip show channels";
  11. my $asterisk_gizmo="sip show registry";
  12. my $asterisk_dahdi="dahdi show status";
  13.  
  14. # Programa Principal
  15. #####################
  16.  
  17. # Obtenemos la opción de la línea de comandos
  18. my $asterisk_command = $asterisk_command_channels;
  19. my $valid_opts='hvc:';
  20. getopts("$valid_opts", \%opts) or (printsyntax() and exit(2));
  21. for my $option (keys %opts) {
  22.   my $value=$opts{$option};
  23.   if ($option eq 'h') {
  24.     #Opcion de ayuda
  25.     printsyntax();
  26.     exit(2);
  27.   } elsif ($option eq 'v') {
  28.     #Opcion de version del script
  29.         printversion();
  30.     exit(2);
  31.   } elsif ($option eq 'c') {
  32.     if ($value eq "sipchannels") {
  33.         $asterisk_command = $asterisk_command_channels;  
  34.     } elsif ($value eq "gizmo") {
  35.         $asterisk_command = $asterisk_gizmo;
  36.     } elsif ($value eq "dahdi") {
  37.         $asterisk_command = $asterisk_dahdi;
  38.     } else {
  39.       printsyntax();
  40.       exit(2);
  41.     }
  42.   }
  43. }
  44.  
  45. # Ejecución de comando Asterisk y análisis de resultados
  46. if ($asterisk_command eq $asterisk_command_channels) {
  47.   #Comprobacion de que la salida es la correcta
  48.    my $cmd = qq($asterisk_bin $asterisk_option \"$asterisk_command"\ );
  49.   foreach ( qx($cmd)) {
  50.     if (/SIP\ channels/) {
  51.       $output=$_;
  52.       my $return = 0;
  53.       print(" $output \n");
  54.       exit($return);
  55.     }
  56.     else{
  57.       print(" Asterisk no esta arrancado \n");
  58.       my $return = 2;
  59.       exit($return);
  60.     }
  61.   }
  62. } elsif ($asterisk_command eq $asterisk_gizmo) {
  63.   #Comprobacion de que la salida es la correcta
  64.   my $cmd = qq($asterisk_bin $asterisk_option \"$asterisk_command"\ );
  65.   foreach ( qx($cmd)) {
  66.     if (/Registered/) {
  67.       $output=$_;
  68.       my $return = 0;
  69.       print(" El proveedor Gizmo 5 esta registrado. \n");
  70.       exit($return);
  71.     }
  72.     else{
  73.       print(" El proveedor Gizmo 5 no esta registrado en este momento. \n");
  74.       my $return = 1;
  75.       exit($return);
  76.     }
  77.   }
  78. } elsif ($asterisk_command eq $asterisk_dahdi) {
  79.   # Comprobación de que la salida es la correcta
  80.   my $cmd = qq($asterisk_bin $asterisk_option \"$asterisk_command"\ );
  81.   foreach ( qx($cmd)) {
  82.     if (/OK/) {
  83.       $output=$_;
  84.       my $return = 0;
  85.       print(" La tarjeta Wildcard TDM400P no tiene alarmas. \n");
  86.       exit($return);
  87.     }
  88.     else{
  89.       print(" Revisar el estado de la tarjeta Wildcard TDM400P. \n");
  90.       my $return = 1;
  91.       exit($return);
  92.     }
  93.   }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Ambas ejecuciones deben devolver siempre 0, pero entran por el else y se imprime en pantalla el mensaje contrario:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[nagios@localhost src]$ ./nagisk.pl -c gizmo
 El proveedor Gizmo 5 no esta registrado en este momento.

[nagios@localhost src]$ ./nagisk.pl -c dahdi
 Revisar el estado de la tarjeta Wildcard TDM400P.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Yo creo que el problema es que no encuentra en el retorno el "parámetro" del if().

El problema que tengo es que no entiendo cómo se guarda el retorno; supongo que se guardará tal cual, y no como comprueba en el if() si hay un string determinado en ese retorno.

Espero que podáis ayudarme...

Gracias.
Última edición por explorer el 2010-01-14 07:14 @343, editado 1 vez en total
Razón: Ortografía, bloques de código
davidin073
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2010-01-13 10:33 @481

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado