• Publicidad

Extraer todos los archivos de un directorio por FTP

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Extraer todos los archivos de un directorio por FTP

Notapor wastudillo » 2009-04-14 22:33 @981

Hola, ¿cómo están?

Tengo un pequeño problema: necesito extraer los archivos que se encuentran en un dispositivo por FTP. Puedo logearme correctamente y si le doy el nombre de un archivo específico me lo trae, pero necesito saber de qué manera puedo traerlos todos de una sola vez. De antemano, muchas gracias y de verdad lo necesito.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$ftp->login("ftp", "ftp");
   # se inicia la toma de archivos...
   $ftp->binary ();

   # Justo aquí necesito la sentencia para bajar todos los archivos.

$ftp->quit();
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
wastudillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-04-14 22:21 @972

Publicidad

Notapor explorer » 2009-04-15 04:56 @247

Yo lo hacía en tiempos sacando un listado de los ficheros, y luego en un bucle, bajando uno por uno.

Hoy en día lo haría con Net::FTP::Recursive.

En la documentación de Net::FTP, al final, hay una referencia a un programa de ejemplo llamado autoftp, que parece que hace lo que necesitas.
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

Notapor explorer » 2009-04-16 09:54 @454

El error dice que no está instalado el módulo. Debes instalarlo según el sistema Perl y operativo que tengas.

Busca en estos foros por cómo instalar módulos.

Por otra parte, me parece que el código que has puesto es para el módulo Net::FTP, no el que te recomendé.
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

Extraer archivos por ftp

Notapor wastudillo » 2009-04-16 12:16 @552

Sí, me di cuenta de eso. Solo un último favor, tengo el siguiente error:

Código: Seleccionar todo
Can't call method "dir" on an undefined value


Aquí está el código nuevamente; que pena por la molestia y muchísimas gracias de verdad:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/local/bin/perl
#
#Programa que extrae los archivos de un dispositivo

#use strict;
use Net::FTP;
print "DIRECCION IP:\n";
$IP = <STDIN>;


open(FH, sprintf ">> Copia archivos.log");
$old_fh = select(FH);
$| = 1;
select($old_fh);
print FH sprintf "\n***Log Copia de archivos de dispositivos\n", $day, $mon+1;

foreach $tca_ip ($IP){
        #$tca_ip ($IP);
      $tca_pos=shift @post;
      print FH sprintf "ftp: conectando a dispositivo";
      print FH sprintf "ftp: conectando a TCA $tca_pos $hour, $min, $sec";

      $ftp = Net::FTP->new($IP, Debug =>0) or do{
      print FH " fallo $@\n\n";
      next;
      };  
        $ftp->login("ftp", "ftp") or die ("login incorrecto");
      $ftp->binary ();
        print FH "Copiando archivos dispositivo...\n";
        #print;
        my @archivos = $FTP->dir();
        foreach  my $fichero (@archivos) {
                $ftp->get($fichero) or die "no se pudo traer el archivo";
            }
      $ftp->quit();
}
print FH "\n\n***copia terminada***\n\n\n";
close FH;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
wastudillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-04-14 22:21 @972

Notapor explorer » 2009-04-16 12:23 @557

No hace falta que vuelvas a copiar el código nuevamente. Fíjate que puedes reeditar tus mensajes, por lo que puedes cambiar el código ya publicado como quieras.

En cuanto al fallo, es porque no sabemos de dónde viene la variable $FTP.

Cuando se comienza a programar en Perl es siempre recomendable el uso de los pragmas use strict; y use warnings; para que nos ayuden a cometer errores como los que muestras. Yo además uso el use diagnostics; para que dé más información aún.

Si ejecuto este programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $ftp;
my @archivos = $FTP->dir();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale
Código: Seleccionar todo
explorer@casa:~/Documents/Desarrollo> ./kk.pl
Global symbol "$FTP" requires explicit package name at ./kk.pl line 6.
Execution of ./kk.pl aborted due to compilation errors (#1)
    (F) You've said "use strict vars", which indicates that all variables
    must either be lexically scoped (using "my"), declared beforehand using
    "our", or explicitly qualified to say which package the global variable
    is in (using "::").

Uncaught exception from user code:
        Global symbol "$FTP" requires explicit package name at ./kk.pl line 6.
Execution of ./kk.pl aborted due to compilation errors.
 at ./kk.pl line 12
ya me está avisando que la variable $FTP no se ha declarado ni definido por ninguna parte. Así que quizás me he equivocado al escribirla.
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

Cómo ingreso a un directorio por FTP

Notapor wastudillo » 2009-04-20 05:58 @290

Qué tal, ¿cómo están? Gracias por la ayuda.

Dos cositas: la primera es cómo entro a un directorio después de loguearme por FTP al servidor; segundo, ¿se pueden ejecutar comandos de DOS en Perl y en un directorio dentro del servidor, como por ejemplo, el (cd ..)? Al intentar entrar al directorio me sale el siguiente error:

Código: Seleccionar todo
Cannot open Local file .: No such file or directory
drwxr-xr-x 0 0 0 1072 Jan 1 2000 .


Código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/local/bin/perl
#
#Programa que extrae los archivos de un dispositivo

use strict;
use Net::FTP;

print "*****************************DIGITE IP************************************\n";
my $SERVER = <STDIN>;
#shop($SERVER);
print "****************************TIPO DISPOSITIVO******************************\n";
my $tipo = <STDIN>;
#chop($tipo);
my $name = 'bca';
my $pass = 'bca';

if ($tipo = 'bca')
{
my $FTP = Net::FTP->new($SERVER) or die ("No se puede abrir la conexion$!");

$FTP->login($name,$pass) or die ("Login incorrecto:$!");
my @archivos = $FTP->dir("/files/tmp");
foreach my $archivo (@archivos){
my @f=split (/\s+/,$archivo);
$FTP->get($f[8]);
print "$archivo\n";
}
$FTP->quit();
} else
{
print "dispositivo no corresponde\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y gracias nuevamente.
wastudillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-04-14 22:21 @972

Notapor explorer » 2009-04-20 06:34 @315

A la primera pregunta: con el método cwd() de Net::FTP.

A la segunda pregunta, es más difícil...

Se pueden ejecutar comandos en el servidor, a través de FTP, si, a) el servidor funciona en DOS b) el servidor admite el comando QUOT para admitir comandos externos al protocolo FTP, interpretarlos, y ejecutarlos en modo local suyo. Como regla general, solo se permite la ejecución de unos pocos comandos (ls, por ejemplo), por el grave riesgo de seguridad que existe.

Sería interesante saber que quieres hacer, exactamente.

Si deseas realizar algo en un servidor, es muy posible que tengas entonces que instalar tus programas en ese servidor.
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

NO evalua el IF

Notapor wastudillo » 2009-04-20 10:19 @471

¿Qué tal? Ya logré arreglar todo el inconveniente anterior; me funcionó perfectamente el cwd(), gracias, pero nuevamente tengo un problemita y no sé porqué en esta parte del programa no me evalúa la condición:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "*****************************DIGITE IP************************************\n";
my $SERVER = <STDIN>;
print "****************************TIPO DISPOSITIVO******************************\n";
my $tipo = <STDIN>;
my $name = 'ftp';
my $pass = 'ftp';

if ($tipo = 'tca')
        {
        my $FTP = Net::FTP->new($SERVER) or die ("No se puede abrir la conexion:$!");

        $FTP->login($name,$pass) or die ("Login incorrecto:$!");
        my @archivos = $FTP->dir();
        foreach my $archivo (@archivos){
        my @f=split (/\s+/,$archivo);
        $FTP->get($f[8]);
        print "$archivo\n";
        }
        $FTP->quit();
} else{
      print "dispositivo no corresponde\n";
        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Muchas gracias por todo, no se imaginan lo que me ha servido hasta ahora esto...
wastudillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-04-14 22:21 @972

Notapor explorer » 2009-04-20 11:29 @520

Has confundido '=' con '=='. Mejor dicho, en Perl, para comparar cadenas, su igualdad, se usa 'eq'.
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

condicional IF

Notapor wastudillo » 2009-04-20 13:20 @597

¿Qué tal, cómo está? Resulta que le coloco el eq a la condición pero cuando le ingreso el dato correspondiente o alguno incorrecto solamente me muestra el mensaje del else así que no me quiere entrar a la parte del programa. No sé por qué razón. Nuevamente gracias por la ayuda.
wastudillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-04-14 22:21 @972

Siguiente

Volver a Intermedio

¿Quién está conectado?

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