Raspberry Pi ¿Cómo configurar y conectarnos vía SSH sin monitor?

Raspberry Pi Logo

Raspberry Pi Logo

Dado que yo no tengo a mano ningún monitor HDMI (hay una TV, sí, pero esa suele estar ocupada) suelo conectarme con las Raspberry Pi a través de SSH. Os dejo aquí los pasos por si pudiera ayudaros.

Meter la tarjeta SD con el sistema operativo de la Raspberry en el portátil

Lo primero de todo es tener la tarjeta SD que contiene el sistema operativo que vamos a usar en la RPi. Si está vacía debemos primero volcar la imagen de nuestro SO en la tarjeta.

Abrimos una consola y buscamos la carpeta donde está montada la tarjeta. En mi caso:

gorka@gorkalaptop:/media/gorka$ ls /media/gorka
548da502-ebde-45c0-9ab2-de5e2431ee0b  boot
gorka@gorkalaptop:/media/gorka$ cd /media/gorka
gorka@gorkalaptop:/media/gorka/548da502-ebde-45c0-9ab2-de5e2431ee0b$

Aquí vemos que la tarjeta SD está montada con el extraño nombre de 548da502-ebde-45c0-9ab2-de5e2431ee0b. Ahí es donde está el sistema de archivos de la RPi. Busco el directorio /etc/rc2.d:

gorka@gorkalaptop:/media/gorka/548da502-ebde-45c0-9ab2-de5e2431ee0b$ cd etc/rc2.d

¡Cuidado! No os equivoquéis y pongáis cd /etc/rc2.d porque entonces estaréis modificando los archivos de vuestro propio ordenador en lugar de los de la RPi.

Al hacer un ls veréis una serie de archivos:

$ ls
K01lightdm     S01bootlogs  S01triggerhappy    S02rsync
K02ssh         S01ifplugd   S02cron            S04detector-init
K05nfs-common  S01motd      S02dbus            S04plymouth
K05rpcbind     S01rsyslog   S02dphys-swapfile  S04rc.local
README         S01sudo      S02ntp             S04rmnologin

Cambiamos el nombre de K02ssh por S02ssh (ojo, en lugar de 02 puede poner otro número) y de esta forma se arrancará automáticamente el SSH:

sudo mv K02ssh S02ssh

Ahora desmontamos la SD de nuestro ordenador, la extraemos y la instertamos en la Rpi. La conectamos a nuestra red local usando un cable ethernet (porque la RPi no tiene acceso al Wifi en mi caso) y la encendemos.

¿Cómo saber cuál es la IP de la Raspberry Pi?

En mi caso he entrado en el panel de control de mi router y he buscado la lista de los dispositivos conectados (attached devices) y he visto:

2	192.168.1.120	B8:27:EB:D8:7E:37	RASPBERRYPI

Si no tienes acceso al router puedes probar este otro sistema.

Conectarnos a la Rapsberry vía SSH

Una vez sabemos la IP de nuestra Raspberry Pi abrimos una consola. En mi caso tiene asignada la IP 192.168.1.120, así que para conectarme por SSH basta con teclear:

ssh pi@192.168.1.113

La primera vez que nos conectemos veremos el mensaje:

The authenticity of host '192.168.1.120 (192.168.1.120)' can't be established.
ECDSA key fingerprint is cf:b4:8a:0f:91:28:8f:44:cc:d7:84:60:05:36:83:35.
Are you sure you want to continue connecting (yes/no)?

Podemos contestar “yes”. Ahora nos pedirá la clave. Asumiendo que no hemos cambiado la clave de la RPi el usuario al que nos conectamos el “pi” y la clave que nos pide será “raspberry” (esto hay que cambiarlo rápidamente).

En ocasiones (si ya hemos estado jugando con otras RPi y hemos hecho mil pruebas) es posible que no podamos conectarnos y nos salga un aviso diciendo que podemos estar sufriendo un ataque “man-in-the-middle”. En este caso, y si tenemos la certeza de que no es así, teclearemos:

ssh-keygen -R 192.168.1.113

De esta forma “reseteamos” las claves correspondientes a esa IP.

Si ha ido todo bien ya estaremos dentro:

Linux raspberrypi 3.10.24+ #610 PREEMPT Thu Dec 12 13:12:09 GMT 2013 armv6l
 
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
 
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Dec 21 17:49:29 2013 from 192.168.1.104
pi@raspberrypi ~ $

Ahora, por seguridad, debemos cambiar las claves públicas/privadas SSH para evitar usar las mismas que todos los que se hayan descargado la misma imagen del sistema operativo que nosotros:

sudo rm /etc/ssh/ssh_host_* && sudo dpkg-reconfigure openssh-server

Ahora nos desconectamos de la RPi tecleando:

exit

Y:

ssh-keygen -R 192.168.1.120

Y ya está, ya podemos conectarnos vía SSH a nuestra Raspberry Pi con normalidad. Es buena idea asignar una IP fija a nuestra RPi para que no tengamos que buscarla cada vez. También sería conveniente configurar el SSH para hacerlo más seguro, pero esos son temas para otros artículos.

Python: Conectar a un servidor SSH

Y seguimos con la racha de artículos sobre Python (sí, me estoy quitando esa espina clavada). Esta vez vamos a ver un ejemplo de cómo enviar comandos a un servidor mediante SSH.

La magia esta vez se consigue gracias a la librería Paramiko. Para instalarla en Ubuntu:

sudo apt-get install python-paramiko

En este ejemplo no hay apenas control de errores, que sería importante añadirlo (eso queda como deberes para el lector 🙂 ).

#!/usr/bin/env python
 
# Librerías necesarias
import paramiko
import os
 
# Datos para la conexión SSH
ssh_servidor = 'midominio.com'
ssh_usuario  = 'usuario'
ssh_clave    = 'clave'
ssh_puerto   = 22 # O el puerto SSH que use nuestro servidor
comando      = 'ls' # el comando que vamos a ejecutar en el servidor
 
# Conectamos al servidor
conexion = paramiko.Transport((ssh_servidor, ssh_puerto))
conexion.connect(username = ssh_usuario, password = ssh_clave)
 
# Abrimos una sesión en el servidor
canal = conexion.open_session()
# Ejecutamos el comando, en este caso un sencillo 'ls' para ver
# el listado de archivos y directorios
canal.exec_command(comando)
 
# Y vamos a ver la salida
salida = canal.makefile('rb', -1).readlines()
if salida:
	# Si ha ido todo bien mostramos el listado de directorios
	print salida
else:
	# Si se ha producido algún error lo mostramos
	print canal.makefile_stderr('rb', -1).readlines()
conexion.close()