• Publicidad

Calcular complemento a 9 de una IP

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Calcular complemento a 9 de una IP

Notapor SJG3226X » 2015-11-20 06:09 @297

Buenos días,

A ver si alguien me puede ayudar con este tetris.

Necesito hacer un script en Perl que saque la contraseña de acceso a los enrutadores con su IP y utilizando el complemento a 9.

Tengo esta IP: 10.113.125.8

1- Quitar el primer octeto -> 113.125.8
2- Rellenar con 0 los octetos con menos de 3 dígitos -> 113.125.008
3- Restar de 9 cada dígito -> 999.999.999 - 113.125.008 = 886.874.991
4- Quitar los puntos y darle la vuelta -> 199478688

Otro ejemplo:
IP: 10.96.3.8
1- 96.3.8
2- 096.003.008
3- 999.999.999 - 096.003.008 = 903.996.991
4- 199699309

Como podéis ver, para mi esto es un mundo. Si alguien me puede ayudar se lo agradecería enormemente.

Saludos,

Susana
SJG3226X
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-11-20 04:26 @226

Publicidad

Re: Calcular complemento a 9 de una IP

Notapor explorer » 2015-11-20 18:45 @823

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

Este problema es muy sencillo. Se puede resolver siguiendo tus pasos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.18;
  3.  
  4. my $IP = shift // '10.113.125.8';       # Leemos la IP desde la entrada estándar
  5.  
  6. $IP =~ s/^\d+//;                        # 1- Quitar el primer octeto -> 113.125.8
  7.  
  8. $IP =~ s/(\d+)/sprintf "%03d", $1/ge;   # 2- Rellenar con 0 los octetos con menos de 3 dígitos -> 113.125.008
  9.  
  10. $IP =~ s/[.]//g;                        # 3- Quitar los puntos
  11.  
  12. $IP = 999_999_999 - $IP;                # 4- Restar de 9 cada dígito -> 999.999.999 - 113.125.005 = 886.874.991
  13.  
  14. $IP = reverse $IP;                      # 5- y darle la vuelta
  15.  
  16. say $IP;                                # 199478688
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Usamos expresiones regulares para quitar el primer octeto , rellenar con ceros, y quitar los puntos.

Hay más formas para resolverlo, desde luego. Por ejemplo, cambiando un poco el orden de ejecución de las operaciones:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.18;
  3.  
  4. my $IP = shift // '10.113.125.8';       # leemos la IP desde la entrada
  5.  
  6. my @IP = split /[.]/, $IP;              # partimos la IP
  7.  
  8. @IP = map { 999 - $_ } @IP;             # restamos 999 - octeto
  9.  
  10. shift @IP;                              # quitamos primer octeto
  11.  
  12. $IP = join '', @IP;                     # unir
  13.  
  14. $IP = reverse $IP;                      # dar la vuelta
  15.  
  16. say $IP;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Usamos split() para sacar los octetos de forma individual, y luego operamos en cada uno de ellos.

La línea del map{} la podemos cambiar por esta otra, pero es un poco más mágica:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $_ = 999 - $_ for @IP;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Podemos incluso unir todas las operaciones en una sola línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.18;
  3. say scalar reverse join '', map { 999 - $_ } (split /[.]/, shift)[1..3];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Unos pequeños cambios, y ya podemos ejecutarlo desde la propia línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
> perl -E 'say scalar reverse join "", map { 999 - $_ } (split /[.]/, shift)[1..3]' 10.96.3.8
199699309
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Otras versiones:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
> perl -E 'say scalar reverse 999999999 - join "", map { substr "00$_", -3 } (split /[.]/, shift)[1..3]' 10.113.125.8
199478688
> perl -E 'say scalar reverse "9"x9 - sprintf "%03d"x3, (split /[.]/, shift)[1..3]' 10.113.125.8
199478688
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

En Perl 6 se puede hacer de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
> perl6 -e '.split(".").[1..3].map({999-$_}).join("").flip.say for @*ARGS' 10.113.125.8 10.96.3.8
199478688
199699309
Coloreado en 0.002 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Calcular complemento a 9 de una IP

Notapor SJG3226X » 2015-11-23 10:07 @463

¡Muchas gracias!

Funciona perfectamente, ya consigo entrar en todos los enrutadores de planta con la contraseña dinámica. ¡¡Te debo una!!


Un saludo,

¡Susana!
SJG3226X
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-11-20 04:26 @226


Volver a Administración

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados