Utilizando SSH
El cliente de SSH
Abrir una shell interactiva
La forma más simple de utilizar el SSH es para abrir una shell
interactiva en una máquina remota, la invocación del programa no
tiene ningún misterio, simplemente ponemos el comando
ssh seguido de la IP o el nombre de la máquina a la
que queremos conectar:
ssh [usuario@]máquina
El parámetro opcional usuario
sirve para indicar la cuenta de usuario a la que se quiere conectar
en el equipo remoto, de no especificarse ningún usuario
se empleará el que se está usando para invocar al cliente
de ssh. El parámetro máquina es la IP o el nombre del
equipo informático al que queremos conectar.
A modo de ejemplo, una posible forma de realizar una conexión SSH
a una máquina remota llamada remoto.ejemplo.com sería
la siguiente:
[hell@local] $ ssh remoto.ejemplo.com
Continuando con el ejemplo anterior, si todo fuese bien, el cliente
de SSH debería de pedirnos la contraseña del usuario hell,
ya que según el prompt del ejemplo, ese es el usuario que estamos
usando en el momento de invocar al cliente de SSH. En caso de poner
mal la clave, el cliente nos la pediría otra vez, pero no esperes
que te la pida más de tres veces, ademas este es el caso de que
la cuenta de usuario hell no exista en la máquina
remoto.ejemplo.com:
[hell@local] $ ssh remoto.ejemplo.com
hell@remoto.ejemplo.com's password:
Permission denied, please try again.
hell@remoto.ejemplo.com's password:
Permission denied, please try again.
hell@remoto.ejemplo.com's password:
Permission denied (password).
[hell@local] $
Imaginemos que nuestra cuenta en remoto.ejemplo.com no
se llama hell, sino que se llama manolo, en
este caso tendríamos que invocar al cliente de ssh con un parámetro
de la forma usuario@máquina, como en el
siguiente ejemplo:
[hell@local] $ ssh manolo@remoto.ejemplo.com
manolo@remoto.ejemplo.com's password:
Last login: Sat Dec 17 16:30:18 2005 from local.ejemplo.com
[manolo@remoto] $
Hemos abierto una pty (pseudo-terminal) en la que se está ejecutando
una shell, podemos escribir comandos y la shell los interpretará
como si estuviéramos delante del equipo remoto.ejemplo.com,
vale, esto es lo mismo que telnet, la única diferencia que
la conexión está encriptada. Para que el cliente de SSH termine tenemos
que cerrar la shell, poniendo exit, pulsado
Ctrl-d o como se os ocurra.
[manolo@remoto] $ exit
Connection to remoto.ejemplo.com closed.
[hell@local] $
Ejecucar comandos remotamente
En lugar de abrir una shell interactiva, también podemos hacer que
el cliente de SSH ejecute un comando y nos envie su salida, basta
con poner el comando con todos sus parámetros a continuación del
nombre del equipo remoto, por ejemplo para ver el contenido de la
carpeta personal del usuario manolo en el equipo
remoto.ejemplo.com podríamos
poner lo siguiente:
[hell@local] $ ssh manolo@remoto.ejemplo.com ls
manolo@remoto.ejemplo.com's password:
a.tar.gz
doc
test.txt
misc
src
[hell@local] $
Para, por ejemplo, ver el contenido del archivo test.txt
podríamos poner:
[hell@local] $ ssh manolo@remoto.ejemplo.com cat test.txt
manolo@remoto.ejemplo.com's password:
Este es un archivo de texto que
no contiene nada en especial,
tan sólo sirve para ocupar algo
de espacio en el disco duro.
[hell@local] $
Que pena, no parece que contenga ninguna información privilegiada
que nos pudiese interesar, en fin, a lo nuestro. Esto en principio
puede parecer estupido, ¿para qué quiero ejecutar comandos si puedo
usar perfectamente una shell interactiva?, bueno, pues ahí es donde
entra la imaginación de cada uno. A modo de ejemplo, fijemonos arriba
en el archivo a.tar.gz, ¿qué pasaría si quisieramos
extraer dicho archivo en el equipo que estamos usando?, ¿cómo
podríamos hacerlo?. Tradicionalmente nos lo bajaríamos, extraeríamos
su contenido y opcionalmente borraríamos el archivo comprimido. OpenSSH
tiene herramientas para poder transmitir archivos por SSH, pero a
pesar de ello, vamos a explotar el echo de que al ejecutar un comando
de forma remota el cliente de SSH nos envia su salida, con esto
y la creación de una tubería (pipe), podemos extraer el archivo
directamente sin tener que bajarnoslo para luego borrarlo:
[hell@local] $ ssh manolo@remoto.ejemplo.com cat a.tar.gz | tar xvzf -
manolo@remoto.ejemplo.com's password:
a
a/a.txt
a/b.txt
a/c.txt
[hell@local] $
Analicemos el comando anterior, en primer lugar ejecutamos el comando
"cat a.tar.gz" en el equipo remoto.ejemplo.com usando
para ello la cuenta de usuario manolo. El programa ssh
redirecciona la salida estandar del comando cat hacia la
salida estandar de nuestra consola. Hasta aquí ningún problema, pues
es el caso del ejemplo de antes cuando quisimos ver el contenido del
archivo test.txt, pero
a continuación nos encontramos con una barra vertical (|) seguida del
comando "tar xvzf -". La barra vertical le dice al shell que cree
una tubería entre dos comandos, esto es, redireccionar la salida
estandar del comando que hay a su izquierda hacia la entrada del
comando que hay a su derecha, con lo cual, en este caso, lo que
conseguimos es descomprimir directamente el archivo remoto
a.tar.gz en nuestra máquina local, sin tener que salvar
dicho archivo previamente en nuestro disco duro.
Hemos comprobado la ventaja de que ssh redireccione la salida estandar
de los comandos que ejecuta remotamente hacia la salida estandar de
nuestra consola, pero la cosa no se queda ahí, ¿qué sucede con la
entrada del comando ssh?, pues bien, ssh, también redirecciona su
entrada hacia la entrada del comando que ejecute remotamente, ¿esto
qué significa?, significa que podemos coger unos datos locales,
procesarlos remotamente y obtener el resultado localmente.
Veamoslo con otro ejemplo, imaginemos que queremos invocar el
comando wc en un equipo remoto para contar el número
de líneas, palabras y bytes que tiene el archivo test.txt
que tenemos almacenado en nuestro disco duro:
[hell@local] $ cat test.txt | ssh manolo@remoto.ejemplo.com wc
manolo@remoto.ejemplo.com's password:
5 24 124
[hell@local] $
Hagamos otro análisis de este comando. En primer lugar está el
"cat test.txt", que lo único que hace es leer el contenido del
archivo test.txt y mostrarlo por la salida estandar.
A continuación tenemos una barrita vertical (|) que le dice al
shell que cree una tubería para redireccionar la salida del
comando cat hacia la entrada del comando ssh.
El comando ssh ejecuta en la máquina
remoto.ejemplo.com el programa wc, al que
en su entrada le pasa la salida del comando "cat test.txt", a su
vez, ssh nos envia la salida de wc para que
podamos verla.
Nada impide que creemos otra tubería para procesar la salida del
comando wc con otra herramienta, ni tampoco que nos
compliquemos la vida elaborando comandos más complejos, pues
ahí entra la imaginación de cada uno.