Perl en Español

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

SFTP a varios servidores

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Mar Oct 07, 2008 7:51 am
milko
Perlero Nuevo
Perlero Nuevo
Registrado: 07 Oct 2008
Mensajes: 7
SFTP a varios servidores Responder citando

Buenas tardes, antes que nada agradecer a las personas que trabajan en este foro ya que su aportación es muy importante para gente como yo, gente que está empezando a programar Smile.

Mi problema es el siguiente: después de estar una semana averiguando qué librerías tenía que bajarme para poder utilizar sftp y realizando prueba - error he logrado realizar backup de una máquina remota. Sin embargo necesito que el script realice backups atacando a otros 3 servidores y realmente no sé cómo. He estado leyendo tutoriales y he visto que se podría hacer con for o foreach, ¿alguien me puede echar una mano?. EL código realizado es el siguiente:

Perl:
#!/usr/bin/perl -w
use strict;
use Expect;
 
my $sftpUsername = "username";
my $sftpPassword = "password";
my $sftpServer = "server1";
my $fileToFetch = "bigip.conf";
my $path = "/config";
my $timeout = 10;
#my $i1 = "server1";
#my $i2 = "server2";
#my $i3 = "server3";
#my $i4 = "server4";

my $command = 'sftp';
my $params = ("$sftpUsername\@$sftpServer:$path/$fileToFetch $sftpServer\_$fileToFetch");
 

my $exp = Expect->spawn($command, $params) or die "Cannot spawn sftp command \n";
 

$exp->expect($timeout,
        ["Password Authentication"],
        ["Are you sure you want to continue connecting", sub {my $self = shift; $self->send("yes\n");}]
        );

$exp->expect($timeout, ["Password:"]);
 

$exp->send("$sftpPassword\n");
 

$exp->expect($timeout, ["sftp>"]);

$exp->send("get $fileToFetch\n");
 

$exp->expect($timeout, ["sftp>"]);
 

$exp->send("bye\n");
 

$exp->soft_close();


Con ese código como dije me deja hacer sftp a un servidor pero necesito hacerlo a más de uno.

Espero que me puedan ayudar. Muchas gracias de antemano.
Mensaje Mar Oct 07, 2008 11:05 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

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

Sí, la solución sería hacer un bucle. Y cambiando algunas de las variables, de escalares a arrays.

Por ejemplo:
Perl:
my @sftpServer = ("server1", "server2", "server3");


Y luego en el bucle
Perl:
for (my $i=0; $i<3; $i++) {
    print "Conexión con $sftpServer[$i]\n";
}
Mensaje Mar Oct 07, 2008 12:23 pm
milko
Perlero Nuevo
Perlero Nuevo
Registrado: 07 Oct 2008
Mensajes: 7
Responder citando

Muchas gracias Explorer, sabía que quería hacer pero no el cómo, jejeje. He añadido las líneas que me has dicho y me da un error en la compilación. El error es el siguiente:

Código:
Global symbol "sftpServer" requires explicit package name .....

El problema estaba en esta línea:
Perl:
my $params = ("$sftpUsername\@$sftpServer");


He cambiado $sftpServer por $i y parece que ha funcionado, lo he probado en casa así que mañana en el curro haré las modificaciones y te comentaré.

Muchas gracias por tu gran ayuda.

Un cordial saludo.
Mensaje Mar Oct 07, 2008 12:41 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Sería interesante ver más código...
Mensaje Mar Oct 07, 2008 12:46 pm
milko
Perlero Nuevo
Perlero Nuevo
Registrado: 07 Oct 2008
Mensajes: 7
Responder citando

Error, tiene que ser

Perl:
my $params = ("$sftpUsername\@$sftpServer[$i]");


Saludos
Mensaje Mar Oct 07, 2008 1:18 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Los paréntesis sobran...
Mensaje Mie Oct 08, 2008 12:59 am
milko
Perlero Nuevo
Perlero Nuevo
Registrado: 07 Oct 2008
Mensajes: 7
Responder citando

¡Que va, tío! no sobran. Si quito los paréntesis me da el error al compilar, tiene que estar ya que está llamando al array, al menos eso creo. La cuestión es que lo he probado aquí en el curro y tira:

Código:
milko@milko-desktop:~/programas_perl$ perl sftp2.pl
Conexion con f5-intranet-01.red.adif
Connecting to f5-intranet-01.red.adif...
Password:
Fetching /config/bigip.conf to f5-intranet-01.red.adif_bigip.conf
/config/bigip.conf                            100%   13KB  13.3KB/s   00:00   
backup correcto Conexion con f5-intranet-02.red.adif
Connecting to f5-intranet-02.red.adif...
Password:
Fetching /config/bigip.conf to f5-intranet-02.red.adif_bigip.conf
/config/bigip.conf                            100%   13KB  13.3KB/s   00:00   
backup correcto Conexion con f5-internet-01.red.sir
Connecting to f5-internet-01.red.sir...
Password:
Fetching /config/bigip.conf to f5-internet-01.red.sir_bigip.conf
/config/bigip.conf                            100% 7553     7.4KB/s   00:00   
backup correcto Conexion con f5-internet-02.red.sir
Connecting to f5-internet-02.red.sir...
The authenticity of host 'f5-internet-02.red.sir (10.1.2.86)' can't be established.
RSA key fingerprint is e6:33:13:c3:38:75:6a:1c:93:1f:39:88:fb:58:c5:2e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'f5-internet-02.red.sir,10.1.2.86' (RSA) to the list of known hosts.
Password:
Fetching /config/bigip.conf to f5-internet-02.red.sir_bigip.conf
/config/bigip.conf                            100% 7553     7.4KB/s   00:00   
backup correcto milko@milko-desktop:~/programas_perl$ ls
f5-internet-01.red.sir_bigip.conf  f5-intranet-01.red.adif_bigip.conf  sftp2.pl
f5-internet-02.red.sir_bigip.conf  f5-intranet-02.red.adif_bigip.conf  sftp3.pl


Muchas gracias por tu ayuda Explorer, quizás luego te vuelva hacer otra consulta :-b jeje.
Mensaje Mie Oct 08, 2008 2:38 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Que sí, que sí... que sobran...
Perl:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $sftpUsername = 'milko';
my @sftpServer  = qw(host1 host2 host3);

for (my $i = 0; $i < @sftpServer; $i++ ) {
    my $params;

    $params = ("$sftpUsername\@$sftpServer[$i]");
    print "$params\n";

    $params"$sftpUsername\@$sftpServer[$i]";
    print "$params\n";
}

__END__
Sí los quitas y dan error... pues entonces es que pasa algo muy raro...
Mensaje Mie Oct 08, 2008 10:11 am
salva
Perlero Nuevo
Perlero Nuevo
Registrado: 03 Ene 2008
Mensajes: 14
Responder citando

Cita:
después de estar una semana averiguando qué librerías tenía que bajarme para poder utilizar sftp


Bueno, si lo único que has visto es como hacerlo con Expect, ¡¡¡tampoco habrás mirado tanto!!!

Hoy en día tienes tres módulos en CPAN que te permiten hacer una transferencia por SFTP, que son Net::SFTP, Net::SSH2 y Net::SFTP::Foreign.

Aquí va un ejemplo de cómo hacerlo con el último:

Perl:
use strict;
use warnings;

use Net::SFTP::Foreign;

my $user = 'username';
my $passwd'password';
my $filename = 'bigip.c';
my $timeout = 10;
my @hosts = qw(host1 host2 host3);

for my $host (@hosts) {
  my $sftp = Net::SFTP::Foreign->new($host,
                                     user => $user, passwd => $passwd,
                                     timeout => $timeout);
  if ($sftp->error) {
    warn "unable to connect to remote host $host: " . $sftp->error;
    next;
  }
  $sftp->get($filename, "$filename-$host")
    or warn "file transter from $host failed: " . $sftp->error;
}
Mensaje Mie Oct 15, 2008 4:59 am
milko
Perlero Nuevo
Perlero Nuevo
Registrado: 07 Oct 2008
Mensajes: 7
Respuest Responder citando

Antes de haber intentado hacerlo con expect intenté lo que me comentas pero me dió mil errores al bajar las librerías correspondientes, yo no soy programador, soy administrador de redes y la verdad es que si el script hace lo que quiero, por mi de pt jeje.

Un saludo.
Mensaje Mie Nov 12, 2008 9:54 am
Sombrerero_Loco
Perlero Nuevo
Perlero Nuevo
Registrado: 11 Nov 2008
Mensajes: 9
Igual esto te ayuda... Responder citando

Hola, milko.

Yo también he empezado a programar en Perl por "exigencias del guión" jajajá, te recomiendo dos programas para solucionar esos errores de depuración que te están dando fallos.

Yo los uso cada vez que hago cualquier tipo de modificación, para centrarme en si es problema de que lo he escrito mal o de si está mal planteado.

Y estos son: Notepad++ (que eligiendo el lenguaje Perl te lo colorea según sus comandos y el dzsoft perl editor, que este tiene análisis de sintaxis.

Échales un vistazo, en tu problema especifico por si te ayuda pero por lo que sé debes de usar array y haciendo bucles ir lanzando los ftps como bien te han indicado.

¡Un saludo!
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group