• Publicidad

A vueltas con Net::OpenSSH

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

A vueltas con Net::OpenSSH

Notapor sergiarcano » 2012-12-19 05:53 @287

Buenas,

Aunque es sobre el mismo script, he cerrado el hilo sobre la cuestión del nombre de clases y archivos correspondientes, porque esto ya es otro tema.

Estoy usando Net::OpenSSH para tratar de abrir una conexión a una máquina y ejecutar algunos comandos de forma remota. Para empezar he hecho una cosa muy sencillita a modo de prueba y resulta que ésto me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/soft/perl-5.10.1/bin/perl
  2. #use Net::OpenSSH;
  3. use strict;
  4.  
  5. my $host = "server";
  6. my $user_name = "usr";
  7. my $ssh_res = `ssh "$user_name"\@"$host" hostname`;
  8.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Sin problemas, me devuelve el hostname de la máquina, pero si intento usar el módulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/soft/perl-5.10.1/bin/perl
  2. use Net::OpenSSH;
  3. use strict;
  4.  
  5. my $ssh = Net::OpenSSH->new("$user_name\@$host");
  6. $ssh->error and die "Can't ssh to $host: " . $ssh->error;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Me devuelve éste error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
command-line: line 0: Bad configuration option: ServerAliveInterval
Can't ssh to server: unable to establish master SSH connection: master process exited unexpectedly at testSSH.pl line 14.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Por lo que he visto por ahí parece que tiene que ver con la configuración de ssh de la máquina, pero no sé exactamente cómo le afecta al módulo para que no me funcione pero sí me funcione a través de la shell.

Aunque puedo tirar "a lo bruto" por la primera vía, entiendo que el módulo Net::OpenSSH es una mejor solución, primero porque está pensado para eso y segundo porque me da muchas opciones de tratamiento y control. A ver si me podéis echar una manilla, porque no consigo dar con la solución (y lo mismo es una chorrada)
sergiarcano
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2012-11-28 10:18 @471

Publicidad

Re: A vueltas con Net::OpenSSH

Notapor explorer » 2012-12-19 07:58 @373

El error hace referencia a la opción ServerAliveInterval, en el al archivo ~/.ssh/config, o en el /etc/ssh/sshd_config, que veo que no es una opción admisible en los ssh modernos. Quítala.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: A vueltas con Net::OpenSSH

Notapor sergiarcano » 2012-12-19 09:01 @417

Vale, la gracia es que, dejando aparte el hecho de que no tengo permisos para modificar esos archivos (bueno, tema de pedírselo a la gente de UNIX y tal) por lo que estaba viendo sí podía cambiar esa circunstancia a través de algún parámetro en la llamada. La gracia es que he mirado el archivo tanto en la máquina como en la de destino y esa opción no está. En realidad me imagino que es un tema de la máquina origen (aparte de por obvio, porque me pasa con cualquier máquina a la que me intente conectar) y lo que no sé es si, ya que dicho parámetro no está definido en el archivo, ¿podría ser el hecho de que esté activada la opción "KeepAlive yes" en dicho archivo? Es lo único que se me ocurre.

De todos modos si trato de conectarme en la máquina directamente desde la shell me funciona perfectamente, es solo a través del script si uso ese módulo...
sergiarcano
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2012-11-28 10:18 @471

Re: A vueltas con Net::OpenSSH

Notapor explorer » 2012-12-19 11:39 @527

En mi sistema, si hago un

man 5 sshd_config

sale la explicación de las opciones para los archivos de configuración. Y tampoco aparece KeepAlive. Solo aparecen

ClientAliveCountMax
ClientAliveInterval
TCPKeepAlive


De esta última dice que antiguamente se llamaba KeepAlive.

Así que lo primero es asegurarse de que tienes instalado un ssh moderno. Luego, editas el ~/.ssh/config y quitas o cambias las opciones viejas. O las adaptas a la versión ssh que tengas instalada. Y si no se trata del ~/.ssh/config local tuyo, estará en el del sistema, y entonces sí que debes hablar con la gente de UNIX.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: A vueltas con Net::OpenSSH

Notapor salva » 2012-12-20 04:30 @229

ServerAliveInterval esta soportado en OpenSSH desde la versión 3.8 ¡que es muy antigua!

Net::OpenSSH requiere que la versión del cliente de OpenSSH sea al menos la 4.1 y esa aun da algunos problemas, porque la funcionalidad de multiplexado de conexiones que usa el módulo tenía bastantes bugs. Lo recomendable es utilizar la última versión.

También puede ser que el ssh instalado en la máquina no sea el de OpenSSH (esto pasa por ejemplo en Solaris).

En cualquier caso, la solución a tus problemas pasa por instalar en algún sitio (por ejemplo, en tu home o en /usr/local) una versión moderna del cliente de OpenSSH.

Como alternativas también tienes Net::SSH2 y un módulo en el que estoy trabajando actualmente Net::SSH::Any que provee una interfaz muy parecida a la de Net::OpenSSH (aunque más limitada), y por debajo puede usar tanto Net::OpenSSH como Net::SSH2.

-----
PD: que se me olvidaba: ¡es el propio Net::OpenSSH el que pasa la opción ServerAliveInterval al ssh!
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: A vueltas con Net::OpenSSH

Notapor sergiarcano » 2012-12-20 05:47 @283

Vale, pues... primera cuestión a recordar: "no pienses que porque alguien sabe más que tú, necesariamente está sabiendo lo que hace". Efectivamente la persona que lleva el tema me dijo que usase Net::OpenSSH porque estaba instalado y Net::SSH2 no, y ya sabéis cómo funcionan estas cosas en empresas más o menos tochas: es más fácil conseguir que un jefe te corte las uñas de los pies que conseguir que te instalen algo nuevo en alguna máquina "sensible"... o por lo menos más rápido.

El caso es que ante eso yo pensé que openSSH estaba instalado en la máquina, como se supone que era obvio, pero... no lo tengo tan claro. Efectivamente es una máquina Solaris y cuando hago un ssh -V me devuelve esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Sun_SSH_1.1.4, SSH protocols 1.5/2.0, OpenSSL 0x0090704f
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Y puedo ver los paquetes del openssl instalados:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. pkginfo | grep -i ssl
  2. system      SUNWopenssl-commands         OpenSSL Commands (Usr)
  3. system      SUNWopenssl-include          OpenSSL Header Files
  4. system      SUNWopenssl-libraries        OpenSSL Libraries (Usr)
  5. system      SUNWopenssl-man              OpenSSL Manual Pages
  6. system      SUNWopensslr                 OpenSSL (Root)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero entiendo que, aunque tienen que ver, openSSL y openSSH no son lo mismo...

Efectivamente al hacer un man 5 sshd_config como hizo explorer, en las opciones a pasar no aparece esa y claro, si pongo esto en el script se "ríe" de mí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ssh = Net::OpenSSH->new('user@server',default_ssh_options => [-o => "ServerAliveInterval=30"]);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Aparte la máquina en la que estoy es una máquina muy sensible, por lo que no es conveniente andar tocando los ficheros de config (a este hombre le ha dado por crear el archivo config en ~/.ssh y añadirle la opción y se ha cargado conexiones de gente que estaba realizando tareas... por suerte nada grave). De todos modos yo creo que no es ese el problema.

La gracia es que me estoy intentando conectar a una máquina HP-UX que tiene instalado OpenSSH y en ella sí que el ssh -V me devuelve otra cosa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. OpenSSH_4.3p2, OpenSSL 0.9.8a 11 Oct 2005
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
He probado a hacer una prueba a la inversa... pero esa máquina no tiene instalado el paquete Net::OpenSSH (grrrrr) y obviamente no lo puedo instalar...

Cuando pueda hablar de nuevo con esta persona le pediré que confirme que openSSH está instalada en la máquina y ver qué versión tiene, pero yo no lo veo. Además, de hecho, alguien comentaba por ahí lo siguiente sobre este tema en Solaris:
"The main reason for me to use OpenSSH instead of Sun's SSH under Solaris 9
is that Sun's SSH misses the ServerAliveInterval/ClientAliveInterval
options and that it doesn't support HostbasedAuthentication."

¡Qué casualidad...! En fin, cuando sepa algo nuevo os lo comento... u os lo comento y cierro el hilo. Por ahora muchas gracias a los dos.
if ($mas_alla ne "like"){
goto mas_aca;
}
sergiarcano
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2012-11-28 10:18 @471

Re: A vueltas con Net::OpenSSH

Notapor salva » 2012-12-20 06:21 @306

Es muy habitual que en Solaris los administradores instalen el paquete de OpenSSH de Sun Freeware que si no recuerdo mal va a /opt. Si es así tendrás que incluirlo en el PATH para que Net::OpenSSH lo encuentre antes que el del sistema.

Net::OpenSSH también acepta la opción ssh_cmd donde le puedes indicar la ruta completa del binario de ssh.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: A vueltas con Net::OpenSSH

Notapor sergiarcano » 2012-12-20 09:52 @453

Que va... revisé todos los paquetes instalados y los directorios y nada de nada. Ya he hablado con ellos y van a instalar OpenSSH en la máquina o, en su defecto, lo necesario para Net::SSH2. A ver si con lo que instalen no se cargan otra cosa. Más noticias en breve...
if ($mas_alla ne "like"){
goto mas_aca;
}
sergiarcano
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2012-11-28 10:18 @471

Re: A vueltas con Net::OpenSSH

Notapor salva » 2012-12-20 13:35 @607

Si puedes elegir que sea OpenSSH.

La interfaz de Net::SSH2 es de muy bajo nivel y para conseguir hacer lo mismo que con Net::OpenSSH tienes que trabajar mucho más. Además, en libssh2 todavía salen bugs cada dos por tres.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: A vueltas con Net::OpenSSH

Notapor sergiarcano » 2012-12-21 04:01 @209

¡¡Ya estoy aquí de nuevo!!

Resulta que sí que está instalado el OpenSSH, aunque no podría decir qué versión es porque... no tengo permisos para ver ninguno de los subdirectorios dentro del directorio OpenSSH (de hecho solo tiene permisos el root...)

El caso es que me pasaron un trozo de código de un programa usado por otra gente en esa misma máquina (ya me podían haber pasado el script entero...) y me dijeron que lo usase así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ssh = Net::OpenSSH->new($hostname,master_opts=>[-i => $sshuxPrivateKeyFile,-l=>$sshUxUserName]);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Yo he intentado hacerlo así y para empezar he tenido que sustituir el "-i" por "-o", porque con -i me da este error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Can't call method "i" without a package or object reference at testSSH.pl line 15.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Así que lo substituí por "-o" y ahora me da éste bonito error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. Use of uninitialized value $call[2] in exec at /soft/perl-5.10.1/lib/site_perl/5.10.1/Net/OpenSSH.pm line 677.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Y después no me devuelve nada (por lo que creo que es posible que la conexión me la llegue a realizar, pero tengo después un par de líneas con un Dumper y no llega a devolverme nada, así que tampoco lo puedo asegurar). He echado un vistazo a esa línea del módulo y está dentro de la función _connect(), pero aún no acabo de descifrar cuál es la variable no inicializada (no sé si es un problema con el fork, pero no da el error de que el fork no le devuelva un pid)
if ($mas_alla ne "like"){
goto mas_aca;
}
sergiarcano
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2012-11-28 10:18 @471

Siguiente

Volver a Básico

¿Quién está conectado?

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