Tutoriales

Ejecute comandos en sistemas Linux remotos a través de SSH

estaba probando como Mantenga los permisos de archivo sin cambios al copiar archivos o directorios a múltiples ubicaciones y sistemas. Cuando quiero verificar los permisos de archivos en un sistema remoto, tengo que ingresar a ese sistema mediante SSH y verificar las propiedades. El proceso de iniciar y cerrar sesión en el sistema remoto varias veces es un poco molesto para mí.Creo que sería mejor si pudiera Ejecute comandos en sistemas Linux remotos a través de SSH.

Afortunadamente, después de navegar ssh Ordenar.

Si se pregunta cómo ejecutar un comando o script en un sistema remoto desde el propio sistema local sin iniciar sesión en el sistema remoto, así es como se hace.

1. Ejecute comandos en un sistema Linux remoto a través de SSH

La forma típica de ejecutar un comando o script en un sistema remoto a través de SSH desde el sistema local es:

$ ssh  

Permítanme mostrarles algunos ejemplos.

1.1.Ejecute un solo comando en un sistema remoto a través de SSH

digamos que quieres Buscar detalles del núcleo su sistema Linux remoto. Para hacer esto, simplemente ejecute:

$ ssh [email protected] uname -a

aquí,

  • sk es el nombre de usuario de mi sistema remoto,
  • 192.168.225.22 es la dirección IP del sistema remoto,
  • y "uname -a" es el comando que quiero ejecutar en el sistema remoto desde el sistema local.

Salida de muestra:

Ejecute comandos en sistemas Linux remotos a través de SSH

¿Mirar?En realidad, no estoy conectado al sistema remoto, pero ejecuto uname Ejecute comandos en el sistema remoto a través de SSH y muestre el resultado en la terminal del sistema local.

También puede especificar comandos entre comillas como se muestra a continuación.

$ ssh [email protected] "uname -a"

o,

$ ssh [email protected] 'uname -a'

si usted tiene Cambiar el puerto predeterminado para el protocolo SSHsolo menciónalo usando -p Los parámetros son los siguientes.

$ ssh -p 2200 [email protected] uname -a

1.2 Ejecute múltiples comandos en un host remoto a través de SSH

También puede ejecutar varios comandos en el host remoto especificándolos entre comillas a continuación.

$ ssh [email protected] "uname -r && lsb_release -a"

o,

$ ssh [email protected] "uname -r ; lsb_release -a"

El comando anterior mostrará la versión del kernel y los detalles de distribución de mi servidor Ubuntu.

Salida de muestra:

Ejecute múltiples comandos en hosts remotos a través de SSH en Linux
Ejecute múltiples comandos en hosts remotos a través de SSH en Linux

Como uno de nuestros lectores mencionó en la sección de comentarios a continuación, debe especificar varios comandos entre comillas. Sin comillas, el primer comando se ejecutará en el sistema remoto y el segundo comando se ejecutará solo en la computadora local. Todo el comando entre comillas será remoto como se esperaba.


Ten cuidado: saber la diferencia entre “&&” y “;” Operadores entre comandos:

Este “&&” El operador ejecutará el segundo comando solo si el primer comando tiene éxito.

ejemplo:

sudo apt-get update && sudo apt-get upgrade

En el caso anterior, el segundo comando (sudo apt-get upgrade) se ejecuta si el primer comando es exitoso. De lo contrario, no se ejecutará.

Este “;” El operador ejecuta el segundo comando incluso si el primer comando tiene éxito o falla.

ejemplo:

sudo apt-get update ; sudo apt-get upgrade

En el caso anterior, el segundo comando (sudo apt-get upgrade) se ejecutará incluso si falla el primer comando.


1.3 Invocación de comandos con privilegios sudo en una máquina remota a través de SSH

Algunos comandos requieren "sudo" Ejecutar permisos.Por ejemplo, el siguiente comando instalará Wim en mi sistema remoto.

$ ssh -t [email protected] sudo apt install apache2

Salida de muestra:

Ejecute comandos con privilegios sudo en la máquina remota a través de SSH
Ejecute comandos con privilegios sudo en la máquina remota a través de SSH

¿Te diste cuenta?solía -t banderas en el comando anterior.tenemos que mencionar esto -t Bandera para forzar la asignación de pseudo-terminal. Esto se puede usar para ejecutar programas arbitrarios basados ​​en pantalla en una máquina remota, lo cual es útil, por ejemplo, cuando se implementan servicios de menú.

Además, ingresé la contraseña. dos vecesLa primera vez ingresé la contraseña del usuario remoto para acceder al sistema remoto a través de SSH desde el sistema local, y se requirió una segunda contraseña para otorgar al usuario remoto privilegios sudo para instalar aplicaciones en el sistema remoto (es decir, apache2 en este caso).

Verifiquemos si el servicio Apache se está ejecutando usando el comando:

$ ssh -t [email protected] sudo systemctl status apache2
[email protected]'s password: 
[sudo] password for sk: 
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2019-12-19 11:08:03 UTC; 52s ago
Main PID: 5251 (apache2)
Tasks: 55 (limit: 2318)
CGroup: /system.slice/apache2.service
├─5251 /usr/sbin/apache2 -k start
├─5253 /usr/sbin/apache2 -k start
└─5254 /usr/sbin/apache2 -k start

Dec 19 11:08:03 ubuntuserver systemd[1]: Starting The Apache HTTP Server...
Dec 19 11:08:03 ubuntuserver apachectl[5227]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 2409:4072:51f:a1b6:a00:27ff:f
Dec 19 11:08:03 ubuntuserver systemd[1]: Started The Apache HTTP Server.

Asimismo, podemos ejecutar cualquier comando o script en el sistema remoto vía SSH desde el sistema local.

1.4 Ejecutar un script local en un sistema remoto a través de SSH

Vamos a crear un script simple en el sistema local para mostrar toda la información disponible sobre el nombre de distribución del sistema remoto, la administración de paquetes y los detalles básicos, etc.

$ vi system_information.sh

Agregue las siguientes líneas:

#!/bin/bash
#Name: Display System Details
#Owner: OSTechNIx
#----------------------------
echo /etc/*_ver* /etc/*-rel*; cat /etc/*_ver* /etc/*-rel*

de acuerdo a ESC claves y tipos :wq Guarda el archivo y cierra.

Ahora ejecute este script en el sistema remoto a través de SSH usando el siguiente comando:

$ ssh [email protected] 'bash -s' < system_information.sh

Salida de muestra:

[email protected]'s password: 
/etc/debian_version /etc/lsb-release /etc/os-release
buster/sid
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="
SUPPORT_URL="
BUG_REPORT_URL="
PRIVACY_POLICY_URL="
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

si no especificas 'bash -s' En el comando anterior, obtendrá los detalles del sistema remoto, pero no se asignará ningún pseudo-terminal.

1.5.Guarde la salida del comando del host remoto al host local

Esto es útil si desea compartir la salida de los comandos que ejecuta en sistemas remotos a través de SSH con su equipo de soporte o colegas.

Se ejecutará el siguiente comando "du -ah" SSH en su sistema remoto y guarde la salida en diskusage.txt archivos en el sistema local.

$ ssh [email protected] du -ah > diskusage.txt

Entonces puedes ver diskusage.txt uso de archivos cat comando o visor de texto.

$ cat diskusage.txt 
4.0K ./.profile
4.0K ./.gnupg/private-keys-v1.d
8.0K ./.gnupg
76K ./data/image.jpg
128K ./data/file.pdf
20K ./data/text.docx
5.9M ./data/audio.mp3
6.1M ./data
0 ./.sudo_as_admin_successful
4.0K ./pacman?inline=false
4.0K ./.bash_logout
4.0K ./.wget-hsts
4.0K ./.bash_history
0 ./.cache/motd.legal-displayed
4.0K ./.cache
4.0K ./deb-pacman_1.0-0.deb
4.0K ./.bashrc
6.2M .

1.6 Configurar la autenticación basada en clave SSH para evitar escribir contraseñas

Si ejecuta comandos con frecuencia en sistemas remotos, es posible que deba configurar la autenticación basada en clave SSH para omitir el ingreso de la contraseña cada vez. Más detalles se pueden encontrar en el siguiente enlace.

Después de configurar la autenticación basada en clave SSH, podemos ejecutar comandos en la máquina remota a través de SSH sin ingresar una contraseña:

$ ssh [email protected] sudo apt update

2. Use sshpass cuando ejecute comandos en máquinas remotas a través de SSH

Si no desea configurar la autenticación basada en clave SSH, puede usar sshpass La utilidad puede ejecutar comandos en computadoras remotas sin ingresar una contraseña.

2.1. ¿Qué es sshpass?

La utilidad sshpass está diseñada para ejecutar ssh utilizando el modo de autenticación de contraseña interactivo del teclado, pero en un modo no interactivo. En resumen, sshpass proporciona una forma no interactiva de autenticar sesiones SSH.

SSH utiliza el acceso TTY directo para garantizar que el usuario del teclado interactivo haya emitido la contraseña. sshpass ejecuta ssh en un tty dedicado, engañándolo para que piense que obtiene la contraseña del usuario interactivo.

2.2 Instalación de sshpass en Linux

La utilidad sshpass está disponible en los repositorios predeterminados de muchas distribuciones de Linux. Por ejemplo, puede instalar sshpass en Debian, Ubuntu y derivados con el siguiente comando:

$ sudo apt install sshpass

2.3 Usar sshpass para ejecutar comandos en una máquina remota a través de SSH

sshpass puede aceptar una contraseña como argumento, leer la contraseña a través de una variable de entorno o leer la contraseña de un archivo de texto.

Un recordatorio: Todos estos métodos son altamente inseguroTodos los usuarios del sistema pueden ver la contraseña en el comando, solo emita ps Ordenar.Esto es No recomendado Utilice estos métodos en la producción. Es mejor usar la autenticación basada en claves en su lugar.

Veamos un ejemplo de cada método.

Proporcione la contraseña como un parámetro:

Para proporcionar una contraseña como parámetro, use -p Las opciones son las siguientes.

$ sshpass -p  ssh remoteuser@ip-address 

ejemplo:

$ sshpass -p ubuntu ssh [email protected] uname -a

aquí,

  • -p ubuntu - Proporcione la contraseña para el sistema remoto.
  • [email protected] - Nombre de usuario remoto y dirección IP.
  • 'uname -a' - el comando a ejecutar en la máquina remota.

Salida de muestra:

Linux Ubuntu22CT 5.15.60-1-pve #1 SMP PVE 5.15.60-1 (Mon, 19 Sep 2022 17:53:17 +0200) x86_64 x86_64 x86_64 GNU/Linux

Proporcione la contraseña como una variable de entorno:

En este método, declaramos un método llamado SSHPASS Utilice la contraseña del sistema remoto como su valor.Luego proporcionamos la contraseña. -e Los signos son los siguientes:

$ SSHPASS=ubuntu sshpass -e ssh [email protected] uname -a

Leer contraseñas de un archivo de texto:

Agregue la contraseña a un archivo de texto usando el comando echo:

$ echo "ubuntu" > mypassword.txt

Ahora, pase el archivo de contraseña a sshpass lwith -f Los signos son los siguientes:

$ sshpass -f mypassword.txt ssh [email protected] uname -a
Ejecute comandos en máquinas remotas a través de SSH usando sshpass
Ejecute comandos en máquinas remotas a través de SSH usando sshpass

En conclusión

En este tutorial, aprendimos algunas formas de invocar un comando o programa en una máquina remota a través de una conexión de red segura. De todos los métodos, el método sshpass es el menos seguro. Se anima a los usuarios a evitar el uso de sshpass en los sistemas de producción.

LEER  ¿Visual Studio Code o Atom? ¿Qué editor deberías usar?

Publicaciones relacionadas

Deja una respuesta

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

Botón volver arriba