es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de acceder remotamente a una máquina diferente y ejecutar múltiples comandos en serie (utilizando Perl)?

Tengo un script de Perl. Quiero conectarme de forma remota a un host diferente y ejecutar múltiples comandos (no 5, 10 sino de 100 a 150 comandos) allí. Algo así,

Algoritmo del Script1.pl (el script en la máquina local):

ssh machine10
// Luego ejecutar comando1 en machine10
// Luego ejecutar comando2 en machine10
// Luego ejecutar comando3 en machine10
.
.
.
// Luego ejecutar comando100 en machine10, y así sucesivamente

Luego salir del host remoto.
Luego, ejecutar los comandos en la máquina local.

¿Cómo puede ser implementado?

Soy nuevo en Perl, y después de buscar en Internet, vi que el comando system podría ayudar [system (ssh remote_host “comando1; comando2;…”)], pero este comando system no parece ser viable ya que no se pueden escribir de esta manera 100-150 comandos para ejecutar.

¿Alguien puede ayudar, por favor? ¿Existe alguna forma de abrir un servidor SSH y ejecutar múltiples comandos, y luego cerrarlo? En realidad, estoy buscando este tipo de técnica.

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para ejecutar múltiples comandos en un host remoto utilizando un script de Perl y SSH, una forma es crear un archivo en la máquina local que contenga todos los comandos que deben ejecutarse en la máquina remota. Luego, utilizar SSH para enviar ese archivo a la máquina remota y ejecutarlo allí.

    Aquí tienes un ejemplo:

    use Net::OpenSSH;
    
    my $ssh = Net::OpenSSH->new('host_remoto');
    $ssh->error and die "la conexión ssh falló: " . $ssh->error;
    
    # Crear un archivo que contenga múltiples comandos
    my $archivo_comandos = '/ruta/al/archivo_comandos.txt';
    open my $fh, '>', $archivo_comandos or die "No se puede crear el archivo $archivo_comandos: $!";
    print $fh <<'END_COMANDOS';
    comando1
    comando2
    comando3
    ...
    comando100
    END_COMANDOS
    close $fh;
    
    # Enviar el archivo a la máquina remota y ejecutarlo
    $ssh->scp_put($archivo_comandos, '.') or die "No se puede enviar el archivo $archivo_comandos: " . $ssh->error;
    my $output = $ssh->system('bash', './archivo_comandos.txt') or die "No se pueden ejecutar los comandos: " . $ssh->error;
    
    print "Comandos remotos ejecutados:\n$output\n";
    
    # Limpiar el archivo en la máquina remota
    $ssh->system('rm', './archivo_comandos.txt') or warn "No se puede limpiar el archivo de comandos: " . $ssh->error;
    

    En este ejemplo, primero creamos un objeto Net::OpenSSH para conectarnos al host remoto. Luego, creamos un archivo en la máquina local que contiene los múltiples comandos que deben ejecutarse en la máquina remota. Utilizamos el método scp_put de Net::OpenSSH para enviar el archivo a la máquina remota. Finalmente, utilizamos el método system de Net::OpenSSH para ejecutar el archivo en la máquina remota utilizando bash. La salida de los comandos se captura en la variable $output.

    Después de que los comandos se ejecutan, podemos limpiar el archivo en la máquina remota utilizando otra llamada a system.

    De esta manera, podemos ejecutar múltiples comandos en una máquina remota utilizando un solo archivo y sin utilizar el comando system con una lista larga de comandos.

Comments are closed.