• Publicidad

SFTP a varios servidores

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

SFTP a varios servidores

Notapor milko » 2008-10-07 08:51 @410

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 :-).

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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();
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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.
milko
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-10-07 08:32 @397

Publicidad

Notapor explorer » 2008-10-07 12:05 @545

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @sftpServer = ("server1", "server2", "server3");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y luego en el bucle
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for (my $i=0; $i<3; $i++) {
    print "Conexión con $sftpServer[$i]\n";
}
Coloreado en 0.001 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

Notapor milko » 2008-10-07 13:23 @599

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: Seleccionar todo
Global symbol "sftpServer" requires explicit package name .....

El problema estaba en esta línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $params = ("$sftpUsername\@$sftpServer");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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.
milko
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-10-07 08:32 @397

Notapor explorer » 2008-10-07 13:41 @612

Sería interesante ver más código...
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 milko » 2008-10-07 13:46 @615

Error, tiene que ser

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $params = ("$sftpUsername\@$sftpServer[$i]");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos
milko
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-10-07 08:32 @397

Notapor explorer » 2008-10-07 14:18 @637

Los paréntesis sobran...
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 milko » 2008-10-08 01:59 @124

¡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: Seleccionar todo
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.
milko
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-10-07 08:32 @397

Notapor explorer » 2008-10-08 03:38 @193

Que sí, que sí... que sobran...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sí los quitas y dan error... pues entonces es que pasa algo muy raro...
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 salva » 2008-10-08 11:11 @507

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Respuest

Notapor milko » 2008-10-15 05:59 @291

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.
milko
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-10-07 08:32 @397

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron