Resumen
Muchas veces necesitamos trabajar con sistemas Linux remotos. Iniciamos sesión en el host remoto, realizamos el trabajo y salimos de esa sesión. ¿Podemos realizar todas estas acciones desde la máquina local? Sí, es posible y este tutorial lo demuestra con ejemplos exhaustivos.
Ejecución de comandos sobre SSH
SSH nos permite ejecutar comandos en una máquina remota sin iniciar sesión en esa máquina. En este tutorial, discutiremos varias formas de lograr esto.
Ejecutar comando único
Ejecutemos el comando uname sobre SSH.
$ ssh [email protected] uname
Si observa el comando anterior, es similar al comando SSH regular con una pequeña diferencia. Hemos añadido el comando a ejecutar (resaltado en color rojo).
Cuando ejecutamos este comando. Generará el siguiente resultado:
Linux
Ejecutar múltiples comandos
Usando esta técnica, podemos ejecutar múltiples comandos usando una sola sesión SSH. Solo necesitamos separar los comandos con punto y coma (;).
$ ssh [email protected] "uname;hostname;date"
Como era de esperar, estos comandos generarán el siguiente resultado:
Linux linux-server Thu Mar 1 15:47:59 IST 2018
Ejecutar comando con privilegios elevados
A veces necesitamos ejecutar un comando con privilegios elevados, en ese caso podemos usarlo con sudo.
$ ssh -t [email protected] sudo touch /etc/banner.txt
Tenga en cuenta que hemos utilizado '-t 'opción con SSH, que permite la asignación de pseudo-terminal. El comando sudo requiere un terminal interactivo, por lo que esta opción es necesaria.
Ejecutar secuencia de comandos
La ejecución remota no solo se limita a los comandos; incluso podemos ejecutar scripts sobre SSH. Solo tenemos que proporcionar la ruta absoluta del script local al comando SSH.
Vamos a crear un script de shell simple con los siguientes contenidos y nombrarlo como system-info.sh
#!/bin/sh uname hostname
Haga que el script sea ejecutable y ejecútelo en un servidor remoto de la siguiente manera:
$ chmod +x system-info.sh $ ssh [email protected] ./system-info.sh
Como algunos de ustedes habrán adivinado, generará el siguiente resultado:
Linux linux-server
Problema de expansión de variables
Si dividimos los comandos en varias líneas, la expansión variable no funcionará. Veámoslo con un ejemplo simple:
$ msg="Hello LinuxTechi" $ ssh [email protected] 'echo $msg'
Cuando ejecutamos el comando anterior, podemos observar que la variable no se expande.
Para resolver este problema, necesitamos usar -c opción de caparazón. En nuestro caso, lo usaremos con bash de la siguiente manera:
$ ssh [email protected] bash -c "'echo $msg'"
Configurar sesión SSH sin contraseña
De forma predeterminada, SSH solicitará la autenticación de contraseña cada vez. Esto se aplica por razones de seguridad. Sin embargo, a veces es molesto. Para superar esto, podemos usar un mecanismo de autenticación de clave pública-privada.
Se puede configurar siguiendo los siguientes pasos:
1) Generar par de claves pública-privada
SSH proporciona la utilidad ssh-keygen que se puede usar para generar pares de claves en la máquina local.
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/linuxtechi/.ssh/id_rsa): #press enter Enter passphrase (empty for no passphrase): #press enter Enter same passphrase again: #press enter Your identification has been saved in /home/linuxtechi/.ssh/id_rsa. Your public key has been saved in /home/linuxtechi/.ssh/id_rsa.pub.
El resultado anterior muestra que los pares de claves generados se almacenan en el directorio ~/.ssh.
2) Agregue la clave pública al archivo ~/.ssh/authorized_keys en el host remoto
Una forma sencilla de hacerlo es usar el comando ssh-copy-id.
$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
En el comando anterior:
- -i opción indica archivo de identidad
- ~/.ssh/id_rsa.pub es un archivo de identidad
- el texto restante es el usuario remoto y la IP del servidor remoto
3) Eso es todo. ¿No es tan simple? Ahora podemos ejecutar el comando sobre SSH sin ingresar la contraseña. Verifiquemos esto.
$ ssh [email protected] uname
Limitación de autenticación de clave pública-privada
Aunque la autenticación de clave pública y privada nos hace la vida más fácil, no es perfecta. Su principal inconveniente es; no podemos automatizarlo, porque se requiere la interacción del usuario la primera vez. Recordar !!! hemos proporcionado la contraseña para el comando ssh-copy-id.
No hay necesidad de entrar en pánico, esto no es el fin del mundo. En la siguiente sección, discutiremos el enfoque que elimina esta limitación.
utilidad sshpass
Para superar la limitación anterior, podemos usar la utilidad sshpass. Proporciona una forma no interactiva de autenticar la sesión SSH. Esta sección analiza varias formas de hacerlo.
Instalación de sshpass
La utilidad sshpass es parte del repositorio oficial de Ubuntu. Podemos instalarlo usando los siguientes comandos:
$ sudo apt-get update $ sudo apt-get install sshpass
Ejemplos
sshpass puede aceptar la contraseña:como argumento, léala desde un archivo o mediante una variable de entorno. Hablemos de todos estos enfoques.
1) Contraseña como argumento
Podemos proporcionar una contraseña como argumento usando la opción –p:
$ sshpass -p 'secrete-password' ssh [email protected] uname
2) Contraseña del archivo
sshpass puede leer la contraseña de un archivo normal usando la opción -f:
$ echo "secrete-password" > password-file $ sshpass -f password-file ssh [email protected] uname
3) Contraseña de la variable de entorno
Además de esto, podemos proporcionar la contraseña de la variable de entorno usando la opción -e:
$ export SSHPASS="secrete-password" $ sshpass -e ssh [email protected] uname
Conclusión
Este tutorial muestra varios trucos y consejos sobre la ejecución remota de comandos a través de SSH. Una vez que entiendas estos trucos, tu vida será mucho más fácil y definitivamente mejorará tu productividad.
Leer también : 9 ejemplos de comandos 'diff' en Linux