• Publicidad

Listado de directorios

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

Listado de directorios

Notapor BigBear » 2011-10-31 10:01 @459

Hola, tengo un problema con un código que estoy haciendo.

Se trata de un simple programa que detecta los listados de directorios. El problema surge cuando a partir de "for my $probar(@repetidos) {", donde trato de detectar si un directorio ya fue visto para así ignorar los repetidos en el array del mismo nombre.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use LWP::UserAgent;
  2. use URI::Split qw(uri_split);
  3. use HTML::LinkExtor;
  4.  
  5. my $nave = LWP::UserAgent->new();
  6. $nave->timeout(5);
  7. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
  8.  
  9. unless ( $ARGV[0] ) { print "mal"; }
  10. else                { escalar( $ARGV[0] ); }
  11.  
  12. sub escalar {
  13.  
  14.     my $code  = toma( $_[0] );
  15.     my @links = get_links($code);
  16.  
  17.     if ( $code =~ /Index of (.*)</ig ) {
  18.         my $dir_found = $1;
  19.         chomp $dir_found;
  20.         print "[+] Directory Found : $dir_found\n\n";
  21.         while ( $code =~ /<a href=\"(.*)\">(.*)<\/a>/ig ) {
  22.             my $ruta   = $1;
  23.             my $nombre = $2;
  24.             unless ( $nombre =~ /Parent Directory/ig or $nombre =~ /Description/ig ) {
  25.                 print "[+] File Found : $nombre\n";
  26.             }
  27.         }
  28.     }
  29.  
  30.     #get more
  31.  
  32.     for my $com (@links) {
  33.         my ( $scheme, $auth, $path, $query, $frag ) = uri_split( $_[0] );
  34.         if ( $path =~ /\/(.*)$/ ) {
  35.             my $path1 = $1;
  36.             $_[0] =~ s/$path1//ig;
  37.             my ( $scheme, $auth, $path, $query, $frag ) = uri_split($com);
  38.             if ( $path =~ /(.*)\// ) {
  39.                 my $parche = $1;
  40.                 for my $probar (@repetidos) {
  41.                     print $parche;
  42.                     unless ( $parche =~ /$probar/ ) {
  43.                         print "paso\n";
  44.                         push( @repetidos, $parche );
  45.                         escalar( $_[0] . $parche );
  46.                     }
  47.                 }
  48.             }
  49.         }
  50.     }
  51.  
  52.     #
  53. }
  54.  
  55. sub toma {
  56.     return $nave->get( $_[0] )->content;
  57. }
  58.  
  59. sub get_links {
  60.  
  61.     $test = HTML::LinkExtor->new( \&agarrar )->parse( $_[0] );
  62.     return @links;
  63.  
  64.     sub agarrar {
  65.         my ( $a, %b ) = @_;
  66.         push( @links, values %b );
  67.     }
  68. }
  69.  
  70. # Coded by Doddy
  71.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



¿ Alguien me puede ayudar ?
Última edición por explorer el 2011-10-31 12:15 @552, editado 1 vez en total
Razón: Formateado de código con Perltidy
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Listado de directorios

Notapor explorer » 2011-10-31 12:20 @556

Humm.... ¿dónde se inicializa @repetidos? No veo por ningún sitio dónde se actualiza el contenido de @repetidos... salvo el propio bucle de @repetidos...
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: Listado de directorios

Notapor BigBear » 2011-10-31 12:33 @564

No, lo pongo al principio de la función para que se guarden todos los directorios, pero el problema empieza en la línea 40, porque a partir de ahí no se graban las variables que van a ir de nuevo en la función escalar.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Listado de directorios

Notapor explorer » 2011-10-31 15:53 @703

Todo lo que sea recordar si algo lo hemos visto antes o no, hay que resolverlo con hash, ya que con solo una línea puedes responder a esa pregunta o no.

Sigo sin ver el problema... salvo que quizás el bucle de @repetidos está mal planteado: hay que salir del bucle, o bien si encontramos un repetido, o no. Y en caso de que no, debemos llamar a escalar(). Pero, repito, hay que hacerlo después del bucle. O usar hash, que es lo propio.
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: Listado de directorios

Notapor BigBear » 2011-10-31 16:45 @739

El problema esta acá

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $probar (@repetidos) {
  2.                     print $parche;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Porque al usar el print() la variable $parche no se imprime. También probé usando $_[0] en vez de $parche y surge el mismo problema: no se muestra ninguna.

Otra cosa: ¿cómo hago lo mismo pero usando hash, como me estás diciendo?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Listado de directorios

Notapor explorer » 2011-10-31 17:51 @785

Para saber el contenido real de una variable, lo mejor es ponerlo así:

print "[$parche]\n";

Si, entre los corchetes, no sale nada, es que $parche está vacía o indefinida.

En la línea 39, $parche toma el valor de $1, que es el resultado de la búsqueda dentro de $path.

El caso es que sí puede darse el caso de que los paréntesis de captura, no capturen nada, porque solo exista una '/', al principio de $path, y el operador avaricioso permite que sean cero caracteres: .*. Y la expresión regular, en ese caso, devuelva un valor verdadero, por lo que entra en el if().
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: Listado de directorios

Notapor BigBear » 2011-10-31 20:05 @878

Bueno, explorer, por primera vez tu ayuda no me sirvió y me vi forzado a usar mi cerebro. Reparé temporalmente el código.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use LWP::UserAgent;
  2. use URI::Split qw(uri_split);
  3. use HTML::LinkExtor;
  4.  
  5. my $nave = LWP::UserAgent->new();
  6. $nave->timeout(5);
  7. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
  8.  
  9.  
  10. unless ( $ARGV[0] ) { print "mal"; }
  11. else                { escalar( $ARGV[0] ); }
  12.  
  13. sub escalar {
  14.  
  15.     my $code  = toma( $_[0] );
  16.     my @links = get_links($code);
  17.  
  18.     if ( $code =~ /Index of (.*)</ig ) {
  19.         my $dir_found = $1;
  20.         chomp $dir_found;
  21.         print "\n\n[+] Directory Found : $dir_found\n\n";
  22.         while ( $code =~ /<a href=\"(.*)\">(.*)<\/a>/ig ) {
  23.             my $ruta   = $1;
  24.             my $nombre = $2;
  25.             unless ( $nombre =~ /Parent Directory/ig or $nombre =~ /Description/ig ) {
  26.                 print "[+] File Found : $nombre\n";
  27.                 escalar($_[0]."/".$nombre )
  28.             }
  29.         }
  30.     }
  31.  
  32.     #get more
  33.  
  34.     for my $com (@links) {
  35.         my ( $scheme, $auth, $path, $query, $frag ) = uri_split( $_[0] );
  36.         if ( $path =~ /\/(.*)$/ ) {
  37.             my $path1 = $1;
  38.             $_[0] =~ s/$path1//ig;
  39.             my ( $scheme, $auth, $path, $query, $frag ) = uri_split($com);
  40.             if ( $path =~ /(.*)\// ) {
  41.                 my $parche = $1;
  42.                
  43.                  
  44.                     unless($repetidos=~/$parche/){
  45.                        
  46.                         $repetidos.=" ".$parche;
  47.                         escalar( $_[0] . $parche );
  48.                    
  49.                 }
  50.             }
  51.         }
  52.     }
  53.  
  54.     #
  55. }
  56.  
  57. sub toma {
  58.     return $nave->get( $_[0] )->content;
  59. }
  60.  
  61. sub get_links {
  62.  
  63.     $test = HTML::LinkExtor->new( \&agarrar )->parse( $_[0] );
  64.     return @links;
  65.  
  66.     sub agarrar {
  67.         my ( $a, %b ) = @_;
  68.         push( @links, values %b );
  69.     }
  70. }
  71.  
  72. # Coded by Doddy
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Cualquier sugerencia sobre el código, decirla.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818


Volver a Básico

¿Quién está conectado?

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