Sab Jul 14, 2007 6:41 am
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 149
|
|
| Conectividad SSH a varios Host |
|
|
Estoy tratando de hacer un script el cual por el momento me presente en pantalla la salida del comando "ls".
Lo hice para un solo Host:
| Perl: | #!/bin/perl
use Net:: SSH qw(ssh );
my $user = 'operador';
my $host = 'localhost';
my $cmd = "ls";
ssh ("$user\@$host", "$cmd"); |
Y me anda perfecto. Ahora me gustaría hacerlo pero para que lea un archivo el cual contiene las ips de las pcs y me vaya mostrando el "ls" de cada una, el tema que no sé cómo hacer porque estoy probando con matrices y me tira un error a la hora de juntar las @.
Se alguien me puede ayudar, se lo voy a agradecer |
|
|
|

Sab Jul 14, 2007 7:01 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
|
¿Y dónde está el código que falla? ¿en qué línea? ¿qué error sale?
La solución parece que es abrir el fichero y hacer un bucle por cada línea leída, quitar el retorno de carro del final de la línea, ejecutar el ssh y repetir hasta el final. |
|
Sab Jul 14, 2007 7:12 am
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 149
|
|
|
|
|
Tengo el siguiente código.
| Perl: | #!/bin/perl
use Net:: SSH qw(ssh );
my $user = 'situ';
my $cmd = "ls";
open (DATOS, "ips.lst");
while (@linea = <DATOS>){
ssh ("$user\@linea", "$cmd");
} |
Y este error:
ssh: linea: Name or service not known
Seguramente debe ser fácil arreglarlo, pero como todavía soy novato en este tema no me estoy dando cuenta cómo hacerlo.
Desde ya gracias por ayudarme. |
|

Sab Jul 14, 2007 8:39 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
|
El problema está en el modo de leer el fichero.
En el bucle while tienes puesto @linea = <DATOS> que quiere decir que del fichero DATOS se lean TODAS las líneas y se almacenen en el array @linea. Como es de suponer que el fichero no está vacío, esa operación, además, devuelve un valor de verdedaro al while, pero sólo una vez, ya que el fichero ha sido leído en su totalidad y no hay más qué leer.
Al llegar a la línea del ssh, pones ssh("$user\@linea", "$cmd"); que quiere decir que se abra una conexión SSH a situ@linea, y claro, en ese momento salta el error porque ssh no sabe quien es el host 'linea'.
Prueba con esto:
| Perl: | #!/bin/perl
use Net:: SSH qw(ssh );
my $user = 'situ';
my $cmd = "ls";
open(DATOS, "ips.lst");
while($linea = <DATOS>) {
chomp($linea);
ssh ("$user\@$linea", $cmd);
}
close DATOS; | Los cambios son:
* hemos pasado de usar una variable array @linea a una variable escalar $linea, por lo que DATOS guardará allí una línea cada vez, hasta que llegue el final de fichero y le devuelva un falso al while
* con chomp() quitamos el carácter fin de línea a $linea (no nos hace falta para el comando ssh, incluso puede molestarnos)
* en la función ssh, usamos la variable $linea para indicar el host. Además, quitamos las comillas a $cmd porque no son necesarias (sólo está esa variable dentro de ellas). |
|

Sab Jul 14, 2007 11:16 pm
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 149
|
|
|
|
|
| Gracias, anda de 10. |
|
Sab Jul 14, 2007 11:57 pm
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 149
|
|
|
|
|
Molesto nuevamente, para consultar si me podrías ayudar para guarda la salida del comando en un archivo.
Con el siguiente formato:
| Código: |
IP
salida del comando |
Gracias. |
|
Dom Jul 15, 2007 3:34 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
|
| Creo que para eso tienes que usar sshopen2(). En el manual hay un ejemplo. |
|
Dom Jul 15, 2007 5:51 pm
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 149
|
|
|
|
|
Explorer,
Desde ya muchas gracias por tu respuesta.
Estoy buscando y la verdad que no encuentro el ejemplo que nombras :S |
|
Dom Jul 15, 2007 6:13 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
Lun Jul 16, 2007 12:41 pm
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 149
|
|
|
|
|
Mira hice el siguiente script basándome en el ejemplo y me funcionó pero no creo que este 100% correcto en su armado.
| Perl: | use Net:: SSH qw(sshopen2 );
use strict;
my $user = "operador";
my $host = "localhost";
my $cmd = "ls";
sshopen2 ("$user\@$host", *READER, *WRITER, "$cmd") || die "ssh: $!";
while (<READER>) {
open(LECTURA, ">> hola.txt") || die "No pudo crearse: $!";
print LECTURA "$_";
}
close(READER ); |
Si saco el *WRITER del parámetro no me anda el script.
Saludos |
|
Lun Jul 16, 2007 1:12 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
|
| Es que *WRITER es el handle del fichero de salida. sshopen2 necesita al menos un fichero de salida para sacar los mensajes. |
|
Lun Jul 16, 2007 5:53 pm
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 149
|
|
|
|
|
| ¿Digamos que ese código no esta mal, entonces? Aunque tenga información que no voy usar. |
|
Lun Jul 16, 2007 6:06 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
|
|
|
|
|
Yo lo que haría, en caso de que no me interesase para nada los mensajes de salida, sería abrir el fichero nulo (/dev/null) con un open WRITER,...
Aunque quizás hay otras formas... que ahora mismo no recuerdo... a ver si otro perlero se acuerda. |
|
Lun Jul 16, 2007 6:12 pm
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 149
|
|
|
|
|
| Gracias, voy a probarlo y a poner el codigo ya que siempre es util tener codigos de referencia |
|
Lun Jul 16, 2007 6:24 pm
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 149
|
|
|
|
|
Bueno, acá les dejo el script terminado.
| Perl: | use Net:: SSH qw(sshopen2 );
use strict;
my $user = "operador";
my $host = "localhost";
my $cmd = "ls";
sshopen2 ("$user\@$host", *WRITER, *READER, "$cmd") || die "ssh: $!";
while (<WRITER>) {
open(LECTURA, ">> hola.txt") || die "No pudo crearse: $!";
print LECTURA "$_";
}
while (<READER>) {
open(ESCRITURA, "> /dev/null") || die "No pudo crearse: $!";
print ESCRITURA "$_";
}
close(READER );
close(WRITER ); |
Explorer, si tenes unos minutos, fíjate si está bien toda la sintaxis.
Gracias |
|
Powered by phpBB © 2001, 2005 phpBB Group
|