Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Consulta sobre XML
Ir a página Anterior  1, 2, 3, 4  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mar Jun 10, 2008 5:23 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3873
Ubicación: Valladolid, España
Responder citando

Un bucle while mientras el usuario no indique que no quiere seguir metiendo más datos...
Mensaje Mie Jun 11, 2008 2:41 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 132
Responder citando

Explorer,
Sé que me vas a odiar pero no sé en qué estoy fallando pero no logro el while :s
Mensaje Mie Jun 11, 2008 4:27 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3873
Ubicación: Valladolid, España
Responder citando

Perl:
while ( 'el usuario no entre un FIN' ) {
    print "Nombre del host (FIN para terminar):";
    chomp(my $host = <>);
    last if $host eq 'FIN';
    # el resto de la entrada
    # actualizar xml
}
# grabar xml
Mensaje Mie Jun 11, 2008 6:31 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 132
Responder citando

Gracias.
Ahora tengo otro problemita.
Al crear cada usuario también se crea el archivo con su password, pero al hacer lo siguiente:
Cita:

[~][situ]# ./kk.pl -name=marcos -usuario=root -descrypt

Me muestra el password del usuario "root" como yo le pedí pero como usuario "admin", en vez de admin :s

Perl:

#!/usr/bin/perl -s
#use strict;
#use warnings;
use POSIX qw(strftime);
my $hday= strftime("%Y%m%d", localtime);

##Verificacion del modulo XML::Simple
BEGIN {
    eval "use XML::Simple";
    if ( $@ ) {
        warn  "Error al cargar el modulo: XML::Simple\n"
            . "Instalar Modulo:\n"
            . "\t\tcpan XML::Simple\n\n";
        exit();
    }
}

our $crear;
our $name;
our $notes;
our $ip;
our $url;
our $descrypt;
our $usuario;

## Ayuda del sistema
if ( !$name and !$notes and !$ip and !$url and !$crear and !$descrypt and !$usuario) {
    die "Uso: $0 [-name|-notes|-ip|-url|-crear|-descrypt]\n"
      . "\t-name=pc                                               Busqueda por nombre del host\n"
      . "\t-notes=test                                               Busqueda por nota\n"
      . "\t-ip=1.1.1.1                                                      Busqueda por direccion IP\n"
      . "\t-url=https://10.0.0.1                         Busqueda por url\n"
      . "\t-crear                                            Adjuntar nuevos contenidos\n"
      . "\t-name=pc -usuario=admin -descrypt                Desencriptar password\n"
      ;
}

my $info = XMLin('kk.xml', KeyAttr => 1, ForceArray => [ 'user' ]);

if ( $name and $usuario and $descrypt ) {
            print "- Ingresar password de la key gpg\n";
            system("gpg --no-options $name.$usuario.pw.asc");
            open my $FILE, '<', "$name.$usuario.pw" or die $!;
        my @lines = <$FILE>;
            for my $pc ( @{$info->{technology}{pc}} ) { 
        next if $name  and $pc->{name}  !~ /^$name$/  and $user->{name} !~ /^$usuario$/;
        print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
    for my $user ( @{$pc->{user}} ) {
        print "\t   $user->{name} : @lines\n";
        system("rm -f $name.$usuario.pw");
                close $FILE;
                exit ();
        }
    }


}

if ( !$crear ) {
    for my $pc ( @{$info->{technology}{pc}} ) {
        next if $name  and $pc->{name}  !~ /^$name$/;
        next if $notes and $pc->{notes} !~ /^$notes$/;
        next if $ip    and $pc->{ip}    !~ /^$ip$/;
        next if $url   and $pc->{url}   !~ /^$url$/;
        print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
        for my $user ( @{$pc->{user}} ) {
            print "\t   $user->{name} : $user->{password}\n";
        }
    }
}

else {
 print "- Ingresar nombre del Host: ";
    my $hname=<STDIN>;
    chop($hname);
    print "- Ingresar url: ";
    my $hurl=<STDIN>;
    chop($hurl);
    print "- Ingresar IP: ";
    my $hip=<STDIN>;
    chop($hip);
    print "- Ingresar notas: ";
    my $hnota=<STDIN>;
    chop($hnota);   
  while ( 'el usuario no entre un FIN' ) {
    print "- Nombre de usuario (FIN para terminar):";
    chomp(my $huser = <>);
    last if $huser eq 'FIN';
## Creacion del archivo del password y la encriptacion
    open  (my $NHOST , "> $hname.$huser.pw");
    print "- Ingresar password (el password no aparece): ";
    system "stty -echo";
    my $hpass=<STDIN>;
    chop($hpass);
    print $NHOST "$hpass";
    close ($NHOST);
    system "stty echo";
        print "\n- Ingresar password de la key gpg\n";
        system("gpg -ac --no-options $hname.$huser.pw");
        system("rm -f $hname.$huser.pw");
##Termina  el archivo del password y la encriptacion

   push @{$info->{technology}{pc}}, {
        name    => $hname,
        url     => $hurl,
        ip      => $hip,
        user    => [{
                        name    => $huser,
                        password=> "$hname.$huser.pw.asc",
                        date    => $hday,
                    }],
        notes   => $hnota,
    };
        }
#use Data::Dumper;
#print Dumper $info;
#Escribo sobre el archivo xml la salida
open  my $SV, q{>:encoding(iso-8859-1)}, 'kk.xml';
print $SV XMLout($info, RootName => 'owner', XMLDecl => 1, NoAttr => 1 );
close ($SV)
}


Gracias Very Happy
Mensaje Jue Jun 12, 2008 12:14 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 132
Responder citando

¿Alguno se le ocurre como poder resolverlo Very Happy ?
Mensaje Jue Jun 12, 2008 2:33 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3873
Ubicación: Valladolid, España
Responder citando

Yo no entiendo la pregunta...
Mensaje Jue Jun 12, 2008 2:42 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 132
Responder citando

Antes que nada gracias explorer por responder.
El problema es el siguiente:
Ahora para desencriptar el password, utilizo aparte del nombre del host el usuario, ya que ahora puedo agregar varios usuarios a la lista del HOST, con esto tengo:
./kk.pl -name=marcos -usuario=root -descrypt

Ahora esta operatoria anda pero el resultado que me da es:

marcos => http://hola.com (1.1.1.1)
admin : situ

El password es el correcto es el del usuario "root", pero me muestra como usuario "admin", ese es el "problema".
Gracias
Mensaje Jue Jun 12, 2008 3:30 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3873
Ubicación: Valladolid, España
Responder citando

No es cosa del programa. Ese "admin" está dentro del XML.
Mensaje Jue Jun 12, 2008 4:50 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 132
Responder citando

Claro exacto, es el primero usuario que cargue para ese Host, pero no sé cómo hacer para que me muestre como usuario "root" ya que me da bien su password pero me dice "admin".
Mensaje Jue Jun 12, 2008 5:01 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3873
Ubicación: Valladolid, España
Responder citando

Abre el fichero XML con un editor de textos y busca por la palabra "admin", y la cambias.
Mensaje Jue Jun 12, 2008 5:14 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 132
Responder citando

Creo que no me expliqué bien.
Voy a ver si lo explico por pasos se entiende.
1. Creo un nuevo Host con datos.
Código:
host : marcos10
url: http://marcos10
ip: 1.1.1.1
nota: test
usuario: admin password: test
usuario: root password: situ

Ahora al hacer esto tengo 2 usuarios asignados a ese Host, cuando quiero ver el password del usuario "root" hago el siguiente procedimiento.
2. ./kk.pl -name=marcos10 -usuario=root -descrypt

Ahora esta operatoria anda pero el resultado que me da es:

Código:
marcos10 => http://marcos10 (1.1.1.1)
admin : situ


Digamos me da bien el password "situ" ya que corresponde al usuario root, pero me dice como usuario "admin" que no es correcto ya que sería "root".
Mensaje Jue Jun 12, 2008 5:58 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3873
Ubicación: Valladolid, España
Responder citando

Sí, ya veo el error. Está en el bucle de la condición donde buscas por nombre de host, de usuario y su contraseña. Debería ser así:

Perl:
if ( $name and $usuario and $descrypt ) {
    print "- Ingresar password de la key gpg\n";
    system("gpg --no-options $name.$usuario.pw.asc");

    open my $FILE, '<', "$name.$usuario.pw" or die $!;
    my $lines = <$FILE>;
    close $FILE;

    for my $pc ( @{$info->{technology}{pc}} ) {
        next if $pc->{name} !~ /^$name$/;

        print "$pc->{name} => $pc->{url} ($pc->{ip})\n";

        for my $user ( @{$pc->{user}} ) {
            next if $user->{name} !~ /^$usuario$/;

            print "\t   $user->{name} : $lines\n";

            system("rm -f $name.$usuario.pw");
            exit ();
        }
    }
}
La condición de exclusión por nombre del $usuario estaba mal colocada. Debía ser colocada dentro del bucle que analiza los nombres de los usuarios.
Mensaje Jue Jun 12, 2008 6:11 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 132
Responder citando

Muchas Gracias
Mensaje Jue Jun 12, 2008 6:17 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 132
Responder citando

Perdón que sea tan "rompe" pero la verdad que aprendo muchísimo del foro Very Happy.
¿Hay forma de que no me aparezca 2 veces el host?
ya que el resultado ahora es:

Código:
marcos10 => http://marcos10 (1.1.1.1)
marcos10 => http://marcos10 (1.1.1.1)
           root : garcia


Gracias.
Mensaje Vie Jun 13, 2008 1:56 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3873
Ubicación: Valladolid, España
Responder citando

Eso es algo más difícil.

Tendrías que hacer un cambio fundamental: el bucle interior de los usuarios consistiría en guardar en un array los usuarios encontrados que coincidiesen con el que buscamos. Luego, ver si ese array contiene algo, indicando que hemos encontrado al menos a un usuario. Si es así, pintamos la línea del host, la lista de usuarios a partir del array (solo el primero sería suficiente), y luego hacemos el system() y el exit().
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Ir a página Anterior  1, 2, 3, 4  Siguiente
Página 3 de 4



Powered by phpBB © 2001, 2005 phpBB Group