Logo OpenSSH

Ejecutar comandos con ssh (Secure Shell)

 
 

En este artículo veremos como ejecutar comandos con ssh. Cuando hablamos de comandos, nos referimos a programas y scripts instalados, tanto en el equipo local como en el equipo remoto.

 
Índice General

  1. Introducción
  2. Ejecutar comandos con ssh y que se permita interactuar con la salida del comando
  3. Ejecutar comandos o scripts que se encuentran en la máquina remota
  4. Ejecutar scripts locales en la máquina remota
  5. Ejecutar comandos o scripts con un usuario determinado
  6. Evitar que un script o comando se detenga al cerrar la sesión ssh
     

  1. Introducción (Volver al índice General)
    Si administramos equipos informáticos, en ocasiones, podremos encontrarnos en la situación de tener que ejecutar programas o scripts en equipos remotos, es decir, desde un equipo accederemos a otro equipo para administrarlo, ya sea ejecutando programas o scripts. La forma más segura de acceder a un equipo remotamente es mediante ssh.

    En </ZeppelinuX>, hemos publicado varios artículos relacionados con la instalación y configuración de ssh, asegurar el servicio ssh y acceder remotamente a un equipo utilizando ssh. A continuación, os dejamos los enlaces a dichos artículos por si aún no habéis trabajado con ssh.


    Veamos a continuación varios métodos para ejecutar comandos con ssh, teniendo en cuenta los datos siguientes:

    Los usuarios que utilizaremos para las pruebas son usuarios que existen en el equipo remoto. Además, el equipo remoto que vamos a administrar tiene la IP 192.168.1.10

  2.  

  3. Ejecutar comandos con ssh y que se permita interactuar con la salida del comando (Volver al índice General)
    En primer lugar, tenemos que diferenciar entre los comandos que solo realizan una acción y los que interactuan con el usuario. Para ejecutar comandos con ssh que implican interactuar con ellos, como por ejemplo la edición de un fichero, pasar ordenes al comando, etc, necesitamos que ssh asigne una pseudo-terminal (pseudo-tty) al iniciarse la sesión. Para que ssh asigne una pseudo-terminal, tendremos que añadir la opción -t a la orden ssh.

    Por ejemplo, para editar un fichero ubicado en algún directorio del equipo remoto con el editor de texto nano, tendríamos que ejecutar una orden similar a esta:

    $ ssh -t mortadelo@192.168.1.10 "nano /home/mortadelo/script.sh"

    Otro ejemplo de cómo ejecutar comandos con ssh es, monitorizar nuestro sistema con el comando htop. Interactuando con htop nos mostrará las aplicaciones en ejecución según el tiempo de CPU utilizado, la memoria RAM usada y muchas cosas más. Para conseguirlo, tendríamos que ejecutar una orden similar a esta:

    $ ssh -t mortadelo@192.168.1.10 "htop"

    Para que programas como nano o htop funcionen, es necesario asignarles una pseud-terminal pasandole como argumento a ssh la opción -t.

  4.  

  5. Ejecutar comandos con ssh que se encuentran en la máquina remota (Volver al índice General)
    En este punto, veremos como ejecutar comandos con ssh que se encuentran en la máquina remota, es decir, nos conectaremos a la máquina remota y una vez allí, ejecutaremos los comandos y scripts instalados o creados en la máquina remota.

       

    • Ejecutar un comando simple (Volver al índice General)
      La sintaxis básica para ejecutar un comando simple es la siguiente:

      $ ssh nombre_usuario@ip_equipo_remoto "comando_a_ejecutar"

      Por ejemplo, veamos como ejecutar el comando date para que nos muestre la fecha y hora del equipo remoto.

      $ ssh mortadelo@192.168.1.10 "date"
      mortadelo@192.168.1.10's password: 
      sáb 02 jul 2022 19:42:47 CEST
    •  

    • Ejecutar múltiples comandos al mismo tiempo (Volver al índice General)
      GNU/Linux permite ejecutar múltiples comandos al mismo tiempo. A la ejecución de más de un comando a la vez en GNU/Linux se le conoce como encadenamiento de comandos.

      Veremos los siguientes tipos de ejecución:

         

      • Ejecución secuencial (Volver al índice General)
        En este tipo, la ejecución del siguiente comando no está condicionada por el resultado del comando anterior. La sintáxis genérica sería la siguiente:

        $ ssh nombre_usuario@ip_equipo_remoto "comando1 ; comando2 ; comando3"
      •  

      • Ejecución condicional (Volver al índice General)
        En este tipo, la ejecución del siguiente comando si está condicionada por el resultado del comando anterior, ya sea por que ha sido exitoso o no.
         

        • Utilizando el operador lógico Y (&&) (Volver al índice General)
          En este tipo de ejecución, si queremos que el siguiente comando se ejecute, el comando anterior ha de finalizar exitosamente. Los comandos deberán ir separados por el operador AND lógico, que es dos signos & (&&).

          La sintaxis genérica para este tipo de ejecución sería la siguiente:

          $ ssh nombre_usuario@ip_equipo_remoto "comando1 && comando2 && comando3"

          En el encadenamiento comando1 && comando2 && comando3, el comando2 se ejecutará solo si el comando1 fue exitoso e igualmente, comando3 se ejecutará si el comando2 fue exitoso.

        •  

        • Utilizando el operador lógico O (||) (Volver al índice General)
          En este tipo de ejecución, si queremos que el siguiente comando se ejecute, el comando anterior no ha de finalizar exitosamente. Los comandos deberán ir separados por el operador OR lógico, que es dos signos | (||).

          La sintaxis genérica para este tipo de ejecución sería la siguiente:

          $ ssh nombre_usuario@ip_equipo_remoto "comando1 || comando2 || comando3"

          En el encadenamiento comando1 || comando2 || comando3, el comando2 se ejecutará solo si el comando1 no fue exitoso e igualmente, comando3 se ejecutará si el comando2 no fue exitoso.

        En el artículo Cómo ejecutar más de un comando a la vez en la terminal de Linux publicado en </ZeppelinuX>, podréis ver algunos ejemplos de encadenamiento de comandos.


  6.  
     
     

  7. Ejecutar scripts locales en la máquina remota (Volver al índice General)
    En este punto, al contrario que en el anterior, ejecutaremos comandos y scripts locales en un equipo remoto. La sintaxis genérica del comando, para ejecutar un script que tenemos en nuestro ordenador en un equipo remoto es la siguiente:

    $ ssh usuario@ip_equipo_remoto 'bash -s' < nombre_script.sh

    Por ejemplo:

    $ ssh mortadelo@192.168.1.10 'bash -s' < backup.sh
  8.  

  9. Ejecutar comandos o scripts con un usuario determinado (Volver al índice General)
    Hasta ahora, todos los comandos que hemos visto en este artículo han sido ejecutados por el usuario que inicia la sesión ssh. Si nos interesa iniciar la sesión con un usuario y ejecutar comandos como si fuéramos otro usuario, ejecutaremos un comando del siguiente tipo:

    $ ssh usuario1@ip_equipo_remoto "sudo su usuario2 -c 'comando'"

    Nota: El usuario1, en la máquina remota, deberá pertenecer al grupo sudo o tener bien configurado el archivo /etc/sudoers para que pueda iniciar sesión como otro usuario.

    Supongamos que iniciamos sesión con el usuario mortadelo y ejecutamos un comando con el usuario filemon, por ejemplo, editar un archivo ubicado en la máquina remota con el editor de texto nano. El comando a ejecutar sería el siguiente:

    $ ssh -t mortadelo@192.168.1.10 "sudo su filemon -c 'nano /home/filemon/script.sh'"

    Supongamos que en la máquina remota, por seguridad, tenemos deshabilitado el acceso por ssh al root. Podemos iniciar sesión con un usuario autorizado, por ejemplo mortadelo y luego adquirir los privilegios de root con sudo:

    $ ssh -t mortadelo@192.168.1.10 "sudo su root -c 'systemctl status sshd.service'"

    Nota: Fíjense que se ha añadido la opción -t a la orden para poder interactuar con la salida del programa nano y systemctl.

  10.  

  11. Evitar que un script o comando se detenga al cerrar la sesión ssh (Volver al índice General)
    Si desde que ejecutamos un script o comando hasta que finaliza transcurre mucho tiempo, puede ocurrir que; tengamos que cerrar la sesión ssh, que se apague el equipo o simplemente, que se cierre la sesión ssh inesperadamente. Si ocurriese esto, la ejecución del script o comando se detendría, para evitarlo, tendremos que usar alguna aplicación del tipo screen o nohup.

    Para usar screen o nohup, si no están ya instalados en el equipo remoto, habrá que instalarlos. Mostramos a continuación su instalación en distribuciones que utilizan paquetes .deb:

    Para instalar screen, ejecutaremos el siguiente comando:

    $ sudo apt install screen

    Para instalar nohup, ejecutaremos el siguiente comando:

    $ sudo apt install coreutils

    Imaginemos que tenemos que lanzar un script para realizar una copia de seguridad de la máquina remota, dicho script se llama backup.sh y está en el home del usuario mortadelo. Para ejecutarlo y poder cerrar la sesión ssh sin que se detenga el script, utilizaremos alguno de los comandos siguientes:

    Si utilizamos nohup, ejecutamos el siguiente comando:

    $ ssh mortadelo@192.168.1.10 "nohup /home/mortadelo/backup.sh &"

    Nota: Hemos utilizado al final del comando & para mandar el comando a segundo plano.

    Si utilizamos screen, ejecutamos el siguiente comando:

    $ ssh mortadelo@192.168.1.10 "screen -d -m /home/mortadelo/backup.sh"

    Cualquiera de las opciones anteriores nos permitirá ejecutar el script y cerrar la sesión ssh sin que se detenga la ejecución del script o programa que hayamos lanzado. En nuestros ejemplos, la copia de seguridad seguirá ejecutándose aunque hayamos cerrado la sesión ssh.

 

Espero que este artículo os haya sido de utilidad. Si pensáis que podéis colaborar para mejorar este artículo, que hay algo erróneo en él o simplemente deseáis comentarlo, por favor, dejad vuestra opinión más abajo.
 
Seguir J. Carlos:

Técnico Informático - Desarrollo Web - Administración de Redes

Técnico Informático. Desarrollo Web. Administración de redes.

Últimas publicaciones de

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.