tl;dr: Guia que explica qué es ssh, cómo se usa y cómo lo pueden usar de forma eficiente para facilitarles la vida con el tp
Hola!
En este documento van a encontrar información que les va a facilitar la vida en ORGA2 y otras materias, cuando quieran conectarse remotamente a los laboratorios. Espero lo lean y encuentren utilidad en el mismo :).
Decidí dividirlo en varias partes, de forma tal que pueden saltear las que no les interesen.
DISCLAIMER: No me hago cargo de nada de lo que les pueda pasar a sus computadoras o a ustedes por seguir estos consejos. Esto incluye (pero no se limita a): Perdida de acceso ssh a otros servidores, perdida de informacion en su pc local, perdida de tps, ganas de llorar, perdida de cordura y locura espontánea.
- Parte 1 - SSH Básico: "¿Lo qué?"
- Parte 2 - SSH Avanzado: "Mirá vos"
- Parte 3 - SSH Más Avanzado: "No sabía que las computadoras podían hacer eso"
- Parte 4 - Configuraciones Útiles
- Parte 5 - Troubleshooting
- Parte 6 - ¡SSH es lo mas! ¿Dónde puedo leer más sobre las cosas que mencionaste?
Seguro esta situación ya les pasó más de una vez en lo que va del cuatrimestre: Están re divertidos programando en assembler en la facultad, y de repente cae Mateo con la federal a decirnos que ya son las 10.30 y que se quiere ir a su casa, por lo cual tenemos que cortar todo y dejar de trabajar. Si todavía no les pasó eso, ya les va a pasar, porque orga 2 salió la mejor materia del DC, elegida por los docentes de orga 2.
En fin. A veces estaría bueno poder seguir programando desde los labos de forma fácil y rápida. Es por eso que existe SSH. Más adelante comento algunos motivos por lo cuales les va a resultar útil.
SSH es un programa que les va a servir para conectarse de forma segura a otra computadora. Trabaja en un esquema cliente-servidor (ustedes usan un cliente ssh para conectarse con un servidor ssh).
Entonces, objetivo: Poder conectarse remotamente a los laboratorios de la facultad (no se desanimen, se pueden hacer cosas muy copadas!, se las voy a mencionar más adelante). Para esto, vamos a necesitar: un cliente ssh (sudo apt-get install openssh-client
) y una cuenta en milagro.
Milagro es una pc que está en la facultad, es el "punto de acceso" desde afuera. Teóricamente esa computadora solo debe usarse para conectarse a alguna otra pc. Es decir: Primero me conecto a milagro (que es accesible desde afuera de la facu) y una vez que estoy en milagro, me conecto a alguna pc de los labos. Si no tienen una cuenta en milagro, se la pueden pedir a su conservador amigo en los labos de la facu. Muchas veces te la crean por defecto con tu cuenta de Linux que a esta altura todos deberían tener.
Ahora hacemos (en una terminal):
ssh [email protected]
[donde username es su nombre de usuario]
Esto nos va a pedir nuestra contraseña de linux. Más adelante veremos cómo evitarlo y hacerlo más seguro. No se preocupen, su contraseña no viaja insegura por la red (de hecho, yo desconfiaríá más de la seguridad de mis datos en las pcs de la facu que usando ssh).
Ahora que estamos adentro, tenemos una terminal igual que antes, salvo que todo lo que ejecutemos se va a ejecutar en la pc milagro (en la facu). Debemos conectarnos por ssh a alguno de los labos. Como saben, no siempre todas las pcs de todos los labos se encuentran prendidas. Para ver qué pcs están prendidas, podemos ejecutar: verMaquinas
Las máquinas que nos interesan son las que están corriendo Linux. Por ejemplo, en la imagen podemos ver que la pc 15 del labo 4 está prendida. ¿Cómo nos conectamos a esa pc? Efectivamente, la respuesta es.. ¡usando ssh! Pero... ¿A dónde? Hay que poner el nombre de la pc del labo como hicimos antes, o la dirección IP del mismo. Hay una reglita muy fácil: la pc Y del labo X tiene ip: 10.2.X.Y; por ejemplo, la pc 15 del labo 4 tiene ip 10.2.4.15. Creo (puede fallar dijo tusam) que los nombres de las pcs son: wsY.laboX.lab.dc.uba.ar; por ejemplo, la pc 15 del labo 4 tiene nombre ws15.labo4.lab.dc.uba.ar. Entonces, hacemos (desde milagro también):
ssh 10.2.4.15
[acá no hace falta aclarar el username, pues es el mismo que el de milagro]
Nos va a pedir nuevamente la contraseña de linux. Una vez conectados, ¡listo! Estamos en la pc 15 del labo 4. Desde ahí podemos seguir programando como si estuvieramos en la facultad.
Seguro están pensando, «nah, qué fiaca, mejor sigo programando en linux como vengo haciendo y listo». Si, seguro. Yo programo en casa cuando puedo, les estoy mostrando una herramienta que puede serles de utilidad. Veamos algunas aplicaciones más copadas.
- Podemos ejecutar un comando en la pc remota sin necesidad de abrir una terminal y demáses: En ocasiones no queremos conectarnos por ssh y quedarnos trabajando en los labos, sólo queremos ejecutar un comando y ya. Podemos lograr esto poniendo el comando a ejecutar al final de la cadena ssh.
ssh [email protected] verMaquinas
[< Va a ejecutar verMaquinas en milagro y nos va a mostrar el resultado]
- Podemos conectarnos directamente a una pc de un labo sin tener que conectarnos manualmente a milagro: SSH nos deja tener archivos de configuración que nos facilitan la vida a la hora de hacer cosas complejas con SSH. El archivo de configuración, se encuentra en
~/.ssh/config
. Agreguenle lo siguiente (si no lo tienen, creenlo):
Host milagro
HostName milagro.dc.uba.ar
Port 22
Host *.lab.dc.uba.ar
ProxyCommand ssh -q -W %h:%p milagro
Con esto, nos podemos conectar a cualquier pc del labo directamente escribiendo su hostname (ej: ssh ws7.labo5.lab.dc.uba.ar
). Previamente vamos a necestar saber si la máquina está prendida.
Esta configuración define configuración para dos hosts distintos. Uno de ellos es "milagro". Cada vez que escribamos ssh milagro, lo que va a ocurrir es que nos conectemos a milagro.dc.uba.ar en el puerto 22.
La segunda regla, tiene un asterisco *
, lo que significa que cada vez que escribamos algo del estilo ssh cualquiercosa.lab.dc.uba.ar
, ssh va a aplicar la configuración que definimos ahí. En particular, esto lo que hace es que cada vez que nos querramos conectar a cualquier host de la pinta *.lab.dc.uba.ar
, ssh primero va a establecer una conexión con milagro, y luego la conexión ssh con la máquina que nos interesa.
- Podemos pasar cosas desde nuestra pc a las pcs de los labos (y viceversa): Podemos copiar cosas utilizando SSH. Tal vez no sepan, pero en las pcs de la facu todos sus "homes" estan compartidos entre todas las pcs de los labos, pero no con milagro; esto significa que pueden copiar las cosas desde su pc a cualquier compu de la facu y esto ya se los va a dejar accesible para cualquier otra compu prendida.
scp archivolocal [email protected]:
[<- importantisimo el :]
Eso va a copiar el archivo de su pc al home de su usuario en la compu 7 del labo 5. Si quieren cambiar la carpeta o ponerle otro nombre al archivo, pueden hacerlo despues del ":"
scp archivolocal [email protected]:orga2/lecambioelnombre
scp
es bastante útil. También funciona al revés:
scp [email protected]:archivoremoto archivolocal
- Podemos montar un directorio remoto en nuestra pc. ¿Qué? Sí. Por ssh podemos "traer" un directorio remoto desde la facu y tenerlo como una carpeta local, agregar, borrar y modificar archivos como si nada (con latencia de red). Esto es especialmente útil si, por ejemplo, corremos el tp en la facu y queremos ver las imagenes en nuestra compu. O queremos editar los archivos desde nuestra compu y compilarlos/correrlos en la facu.
Para poder usar esto, van a tener que instalarse el programa sshfs
, luego crean una carpeta en su compu en donde van a querer tener la carpeta de la facu sincronizada.
mkdir facultad
sshfs [email protected]:carpeta facultad
Traten de no sincronizar todo su home entero, sólo la carpeta que les interese (les va a andar más rápido).
- Podemos ejecutar un comando en la pc remota y luego cerrar la conexión, dejando el programa corriendo de fondo mientras no apaguen la computadora.
Una vez que estamos conectados por ssh, si ejecutamos un programa y cerramos la conexión, el programa se muere.
Para evitar esto, cuando ejecutemos nuestro programa, usemos nohup para correrlo
nohup programa &
[nohup desatachea el programa de la sesión actual, y & hace que lo corramos en background]
Con esto el programa va a estar corriendo de fondo y nosotros seremos libres de terminar la conexion SSH cuando querramos. Esto puede resultar util cuando necesitemos dejar un programa corriendo, redireccionando el output del mismo a un archivo y luego ver el output cuando termine.
Con estas cosas les debería resultar muuucho más fácil correr sus tps en la facultad, copiar cosas de un lado a otro y ver resultados :)
Si hasta ahora no se asombraron, prometo volarles la peluca con las posibilidades que vienen ahora. No son necesarias para los TPs, pero es copado saber que SSH les deja hacer cosas como estas.
- Podemos "forwardear un puerto" de la red local a una pc de la red remota. Por ejemplo, si quisieramos que todo lo que mandemos en el puerto 5000 de nuestra pc le llegue a la pc 7 del labo 5 al puerto 2000, podemos hacer algo como
ssh [email protected] -L5000:10.2.5.7:2000
Un uso viable para esto es hacer algo como de esta forma:
ssh [email protected] -L5000:10.2.5.7:22
[en otra terminal] ssh localhost:5000
Esto hace que: La primer conexion se conecta a milagro y dice que, en mi pc, todo lo que mande al puerto 5000, se lo va a mandar al puerto 22 (el de ssh) de la pc 7 del labo 5. El segundo ssh, es un ssh que hago a mi pc (localhost) en el puerto 5000, de esa forma, esto va a entrar por el tunel que creamos antes y va a caer directamente a la pc 7 del labo 5. WOW. (en la parte de configs útiles les muestro una alternativa para lograr lo mismo)
-
Podemos hacer lo mismo pero al revés: Cuando al servidor le llegue una conexión en el puerto X, que lo forwardee a hacia un puerto Y en nuestra pc. Creo que está desactivado en las pcs de la facu. Es útil en otras situaciones. Ahora no se me ocurre ninguna.
-
Podemos hacer un proxy SOCKS: Muchas veces estamos en entornos donde no podemos conectarnos porque estamos siendo filtrados por un proxy o simplemente no queremos que los administradores de la red sepan qué conexiones hacemos. Si contamos con una conexión ssh a algun servidor seguro, podemos hacer que todas nuestras conexiones vayan hacia ese proxy :)
ssh -D puertoLocal usuario@server:puerto
nos va a direccionar todo lo que mandemos hacia el puertoLocal por la conexión SSH que hicimos. Podemos luego, configurar nuestro navegador de internet para que se conecte a este proxy (host: localhost, puerto: puertoLocal) y listo, salteamos todos los filtros que hayan.
- Podemos ejecutar programas con interfaz gráfica en un servidor ssh y verlos en nuestra pc local. Si, lo que leyeron. Por ejemplo, podemos ejecutar matlab en las pcs de la facu y ver y usar el programa en la pc local. Lo mismo con firefox.
Para eso, usamos el comando -X de ssh. Si el servidor lo soporta, nos va a dar la interfaz grafica de los programas. Es muy útil, y se puede hacer en las pcs de los labos.
ssh -X dc.labo.5 xclock
[esto usa lo que explico en configuraciones utiles]
No hace falta usar usuario y contraseña para todo. Hay un método de autenticación más seguro: Usar claves públicas y privadas. Básicamente, en su pc de su casa crean un par de claves (una clave pública y una privada), luego suben a la pc de milagro su clave pública y dicen "El que tenga la clave privada de esta clave publica, va a poder conectarse a mi".
Luego, cuando se conecten por ssh, ssh va a usar su clave privada para conectarse.
Para hacer esto, en su pc local ejecuten:
ssh-keygen -t rsa -b 2048
Eso les va a crear una clave publica y privada (no hace falta crearla si ya tienen), dejen la dire default, y si quieren ponganle contraseña (es solo para la clave privada la pw). En la carpeta ~/.ssh
van a tener id_rsa
e id_rsa.pub
, esta última es su clave pública.
Para habilitarla en milagro hagan:
ssh-copy-id [email protected]
Internamente, esto copia la clave publica hacia el host al que se quieren conectar, y la agrega al final de ~/.ssh/authorized_keys
. El archivo authorized_keys
especifica qué claves públicas pueden acceder a ese usuario y qué comandos pueden ejecutar.
Con esto se van a poder conectar desde su casa a milagro sin problemas.
Para conectarse de milagro a uno de los labos, deberian hacer algo similar: crear un par de claves en milagro (o cualquier pc de los labos) y agregar la clave publica al final de authorized_keys
En el 2012 cree un script que facilita totalmente el uso de las pcs de los labos. Pueden encontrarlo acá. El mismo facilita tener que conectarse a milagro, buscar maquinas abiertas, o tener que acordarse ips. Escribiendo cosas como ssh dc.labo
los conectará a alguna pc de la facu. ssh dc.labo.5
a alguna pc del labo 5 y ssh dc.labo.5.3
a la pc 3 del labo 5. También van a poder hacer ssh milagro
o cosas similares sin tener que escribir el dc.uba.ar
:P. Ahí pueden ver cómo uso el archivo de config para hacer un par de reglas (una regla para milagro y una regla para conectarse a dc.labo*)
Como dije antes, cuando la sesión por ssh muere, todo lo demás también muere, si no quieren perder lo que estaban haciendo usen screen
o tmux
(puede que los tengan que instalar en los labos). Estos programas están buenos porque básicamente te creas una sesión cuando te conectas y si se corta la conexión después podes levantar de nuevo la sesión cuando regreses.
Existe una aplicación que se llama PuTTY que es un cliente de SSH para windows. Con eso se van a poder conectar a la facu.
Es posible que algunas veces tengan problemas con ssh, sepan que google es su amigo y van a poder buscar ahí la solución al problema el 90 % de las veces. También me pueden preguntar a mi, si se la respuesta se las diré y si no, los ayudaré a buscarla en Google.
-
"Cuando me conecto me pide que agregue un número raro como un host de confianza": Cada vez que nos conectamos por ssh a una pc nueva, nos va a mostrar un mensaje diciendo "es esta la huella digital de tu host?" si es asi, entonces está todo ok y la agrega, si en algún momento eso cambia (es decir, cambia el host), ssh te va a decir que pasó algo raro.
-
"Me dice que mis claves privadas/publicas tienen los permisos muy abiertos": A veces pasa, la clave privada no deberia ser accesible para el resto de los usuarios. Se soluciona cambiandole los permisos a la carpeta de ssh: chmod -R 0700 ~/.ssh
-
"Me dice que no tengo internet": Chequea la conexión a internet
-
"Cuando corro los tests me dice que hay diferencias en las imagenes": Este mail es sobre ssh, para mails de tps manda mail a orga2-doc
Hay un montón de historia, teoría y cosas interesantes sobre SSH, espero haberles dado un pantallazo general de cómo se lo puede usar :) No duden en leer las manpages y buscar en google más cosas.
www.google.com
man ssh
man sshfs
man ssh_config
man scp
man nohup
http://robots.thoughtbot.com/a-tmux-crash-course
- @mega por la configuración para conectarse directamente a los labos
- @tinchou por la recomendación de usar
ssh-copy-id
Genio <3. Dejo un tip: para habilitar la key en Milagro se pueden reemplazar esos tres comandos por
ssh-copy-id [email protected]
.