• Publicidad

ifconfig

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

ifconfig

Notapor Menmar » 2009-05-21 06:35 @316

No tengo ni idea de cómo dividir el ifconfig para que me dé cada bloque de información (eth0, eth1, lo, bond0...) y luego dividir esos bloques para conseguir toda la información como toca y organizada.

¡Ayudadme, por favor!
Menmar
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-05-21 04:37 @234

Publicidad

Notapor explorer » 2009-05-21 08:21 @390

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

La salida del comando ifconfig es algo así:

Código: Seleccionar todo
eth0      Link encap:Ethernet  HWaddr 00:1D:7D:AA:CD:72
          inet addr:10.10.10.216  Bcast:10.10.10.255  Mask:255.255.255.0
          UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:369684 errors:0 dropped:0 overruns:0 frame:0
          TX packets:294073 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:273854001 (261.1 Mb)  TX bytes:22798688 (21.7 Mb)
          Interrupt:21 Base address:0xc000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8244 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8244 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:719767 (702.8 Kb)  TX bytes:719767 (702.8 Kb)



La separación de un bloque a otro es con una línea en blanco, así que podemos usar esa diferencia para obtener la información en bloques:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

my $ifconfig = qx(ifconfig);
my @ifconfig = split "\n\n", $ifconfig;

print join "\n", map { "[$_]" } @ifconfig;
print "\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
sale:
Código: Seleccionar todo
[eth0      Link encap:Ethernet  HWaddr 00:1D:7D:AA:CD:72
          inet addr:10.10.10.216  Bcast:10.10.10.255  Mask:255.255.255.0
          UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:374008 errors:0 dropped:0 overruns:0 frame:0
          TX packets:298302 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:274803370 (262.0 Mb)  TX bytes:23116752 (22.0 Mb)
          Interrupt:21 Base address:0xc000 ]
[lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8390 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8390 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:729672 (712.5 Kb)  TX bytes:729672 (712.5 Kb)]

Ahora ya podemos sacar la información que queramos.

Vemos que la información está organizada en forma de campos y valores, separados con espacio en blanco entre estos pares, y con un carácter ':' entre cada campo y valor. Excepto el primer valor, que es nombre del interfaz. Así que lo que queda es jugar un poco con las expresiones regulares:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

my $ifconfig = qx(ifconfig);
my @ifconfig = split "\n\n", $ifconfig;

foreach my $interfaz (@ifconfig) {

    my ($nombre) = $interfaz =~ m/^(\w+)/;      # Buscamos la primera palabra

    print "$nombre\n";

    while ($interfaz =~ m/([a-z]+):(\S+)/gi) {
        print "$1->$2\n";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale:
Código: Seleccionar todo
eth0
encap->Ethernet
D->7D:AA:CD:72
addr->10.10.10.216
Bcast->10.10.10.255
Mask->255.255.255.0
MTU->1500
Metric->1
packets->378081
errors->0
dropped->0
overruns->0
frame->0
packets->302382
errors->0
dropped->0
overruns->0
carrier->0
collisions->0
txqueuelen->1000
bytes->275650072
bytes->23413115
Interrupt->21
address->0xc000
lo
encap->Local
addr->127.0.0.1
Mask->255.0.0.0
MTU->16436
Metric->1
packets->8535
errors->0
dropped->0
overruns->0
frame->0
packets->8535
errors->0
dropped->0
overruns->0
carrier->0
collisions->0
txqueuelen->0
bytes->740677
bytes->740677
No, no sale bien. La mayor parte de los campos sí que sale bien, pero hay algunas excepciones a la regla principal, así que habría que adoptar otra estrategia, como por ejemplo, la búsqueda de campos especificando su nombre concreto. Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

my $ifconfig = qx(ifconfig);
my @ifconfig = split "\n\n", $ifconfig;


foreach my $interfaz (@ifconfig) {

    my ($nombre) = $interfaz =~ m/^(\w+)/;      # Buscamos la primera palabra

    print "$nombre\n";

    my ($hw_addr) = $interfaz =~ m/HWaddr ([\w:]+)/;

    print "Dirección hardware: $hw_addr\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale:
Código: Seleccionar todo
eth0
Dirección hardware: 00:1D:7D:AA:CD:72
lo
Dirección hardware:
Y así podemos encontrar todas.
Incluso se pueden agrupar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my ($Bcast,$Mask) = $interfaz =~ m/Bcast:([\d.]+) +Mask:([\d.]+)/;
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

Notapor Menmar » 2009-05-22 02:47 @158

Muchas gracias, estaba mirándolo y me he encontrado con que falla al tener todo en castellano y me gustaría que se me diese alguna recomendación sobre cómo solventar el problema, teniendo en cuenta que hay máquinas que no tienen la salida del ifconfig en castellano.
Menmar
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-05-21 04:37 @234

Notapor explorer » 2009-05-22 04:24 @225

Si puedes mostrar un ejemplo de las dos posibles salidas y el código que estás usando, podríamos ayudarte algo más.
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


Volver a Básico

¿Quién está conectado?

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

cron