Mar Oct 07, 2008 7:51 am
|
 |
milko
Perlero Nuevo

|
Registrado: 07 Oct 2008
Mensajes: 7
|
|
| SFTP a varios servidores |
|
|
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:
| 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. |
|
|
|

Mar Oct 07, 2008 11:05 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
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";
} |
|
|
Mar Oct 07, 2008 12:41 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
| Sería interesante ver más código... |
|
Mar Oct 07, 2008 1:18 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
| Los paréntesis sobran... |
|

Mie Oct 08, 2008 12:59 am
|
 |
milko
Perlero Nuevo

|
Registrado: 07 Oct 2008
Mensajes: 7
|
|
|
|
|
¡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. |
|

Mie Oct 08, 2008 2:38 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
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... |
|

Mie Oct 08, 2008 10:11 am
|
 |
salva
Perlero Nuevo

|
Registrado: 03 Ene 2008
Mensajes: 14
|
|
|
|
|
| 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;
} |
|
|

Mie Oct 15, 2008 4:59 am
|
 |
milko
Perlero Nuevo

|
Registrado: 07 Oct 2008
Mensajes: 7
|
|
| Respuest |
|
|
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. |
|

Mie Nov 12, 2008 9:54 am
|
|
|
| Igual esto te ayuda... |
|
|
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! |
|
Powered by phpBB © 2001, 2005 phpBB Group
|