hits counter
Este sitio web utiliza cookies para obtener estadísticas de navegación. Si sigue adelante, consideraremos que acepta su uso. Acepto | Más información

Utilidades:



Varias terminales en una sola pantalla

Cuando trabajamos en la terminal, con la línea de comandos, es muy útil tener la posibilidad de usar varias terminales al mismo tiempo. Esto podemos hacerlo de varias formas: por ejemplo, abriendo varias sesiones de SSH. Pero hay una forma mejor y más práctica: instalar la utilidad tmux, que es lo que se denomina un multiplexor de terminales. Con ella podemos dividir la pantalla de nuestra terminal en varias terminales más pequeñas, crear nuevas pantallas (o ventanas) que contengan, a su vez, varias terminales y saltar de una a otra con una simple combinación de teclas.

Así pues, vamos a instalar esta utilidad:

sudo apt install tmux

Una vez terminada la instalación, ya tenemos tmux listo para usar. Lo lanzamos:

tmux

y lo usamos empleando la combinación de teclas Ctrl+b seguida de otra tecla. He aquí las más comunes:

Ctrl+b %  ->  divide en horizontal 
Ctrl+b "  ->  divide en vertical  
Ctrl+b o  ->  cambia de una a otra  
Ctrl+b flechas  ->  cambia a la terminal donde apunte la flecha  
Ctrl+b x  ->  cierra una terminal [abajo, izquierda, aparece (y/n)]
Ctrl+b c  ->  crea una nueva ventana
Ctrl+b p  ->  vuelve a la ventana anterior
Ctrl+b n  ->  pasa a la ventana siguiente
Ctrl+b &  ->  cierra ventana actual [abajo, izquierda, aparece (y/n)]

Este es el resultado de dividir una pantalla en cuatro terminales:




Poner el disco duro en suspensión

Si conectamos un disco duro externo a la Raspberry, tal y como explicamos más arriba, a no ser que la caja posea un mecanismo para poner el HD en estado de suspensión pasado un cierto tiempo, lo normal es que el disco permanezca continuamente en movimiento, incluso cuando no se está haciendo uso de él, lo que supone un gasto de energía innecesario. Para evitar esto, podemos instalar una utilidad que se encargue de llevar a cabo este proceso.


hdparm

Este servicio es el más fácil de instalar y usar, pero tiene el inconveniente de que no todos los discos duros funcionan con él, especialmente los que se conectan por USB, como es el caso de la Raspberry, ya que esta placa carece de puerto SATA. Lo mejor es probar y ver si funciona con nuestro HD. De no ser así, entonces usaremos hd-idle, cuya instalación se explica más adelante.

Lo instalaremos de la forma habitual:

sudo apt install hdparm

hdparm posee una larga lista de parámetros que se pueden utilizar. Podemos verlos todos aquí. Según se observa, el parámetro -S es el que establece el tiempo de espera antes de poner la unidad en suspensión (standby o spindown). Al usarlo, a continuación debemos añadir un valor numérico que determinará cuál será el tiempo de espera (durante el que no hay actividad del disco) antes de ponerlo en suspensión para ahorrar energía. Seguido de este número vendrá el nombre de la unidad de disco a la que queremos que se aplique (que podemos averiguar previamente con el comando sudo fdisk -l). Por ejemplo:

sudo hdparm -S 60 /dev/sda

La codificación del valor de tiempo de espera es bastante peculiar. El valor 0 significa que el tiempo de espera está deshabilitado y, por consiguiente, el dispositivo no entrará automáticamente en standby. Los valores del 1 al 240 especifican múltiplos de 5 segundos, produciendo tiempos de espera de entre 5 segundos y 20 minutos. Los valores del 241 al 251 indican unidades con intervalos de 30 minutos, cuyos tiempos de espera van desde los 30 minutos a las 5,5 horas. El resto de valores son especiales. Todos ellos podemos verlos en este listado.

Para no tener que escribir el comando anterior cada vez que arranquemos nuestra Raspberry, lo mejor es ponerlo en el fichero de configuración de hdparm para que quede establecido de forma permanente. Así que editamos dicho fichero:

sudo nano /etc/hdparm.conf

y, al final del mismo, escribimos lo siguiente:

/dev/sda {
    spindown_time = 120
}

Como vemos, la sintaxis es diferente a cuando lo usamos directamente desde la línea de comandos. Aquí no se usa el parámetro -S, sino spindown_time, que en este ejemplo le hemos asignado un valor de 120, lo que equivale a 10 minutos de espera (120x5=600 segundos, que son 10 minutos).

Haciendo lo anterior, el spindown debería iniciarse correctamente transcurrido el tiempo indicado. Sin embargo, en algunos discos es necesario, además, activar (descomentándola) esta opción:

apm = 255

Por último, reiniciaremos el sistema para que se active el servicio y comprobar que funciona correctamente:

sudo reboot

Otros parámetros de hdparm

Con el parámetro -C podemos comprobar el estado de la unidad:

sudo hdparm -C /dev/sda

Obtendremos estas respuestas según esté el disco activo o en suspensión:

drive state is: active/idle
drive state is: standby

Para forzar el estado de suspensión, usaremos -y:

sudo hdparm -y /dev/sda

Lo que nos devolverá esta respuesta:

issuing standby command

Una lista completa de todos los parámetros puede obtenerse con

sudo hdparm -h

NOTA: Puede que estos parámetros (o alguno de ellos) no funcionen bien en determinados modelos de discos y obtengamos el mensaje drive state is: unknown junto a algún otro mensaje de error (por ejemplo, SG_IO: bad/missing sense data), pero esto no significa forzosamente que el servicio no esté realizando de forma correcta su función, que es la de poner el disco en suspensión una vez transcurrido el tiempo estipulado.


hd-idle

Si la aplicación anterior no funcionara, entonces la desinstalamos (sudo apt purge hdparm) y probamos con hd-idle, que suele ser más adecuada para los discos USB. El proceso lo haremos en varios pasos, instalando primero algunas herramientas que son necesarias:

sudo apt install build-essential fakeroot debhelper -y

Después descargamos la última versión de hd-idle (que podemos conocer en este enlace):

wget http://sourceforge.net/projects/hd-idle/files/hd-idle-1.05.tgz

Y por último descomprimimos el fichero e instalamos el paquete:

tar -xvf hd-idle-1.05.tgz && cd hd-idle
dpkg-buildpackage -rfakeroot
sudo dpkg -i ../hd-idle_*.deb

Ya podemos poner en suspensión el disco duro con el comando que mostramos a continuación, al final del cual se indica el nombre de nuestra unidad de disco (lo que es posible averiguar previamente escribiendo sudo fdisk -l):

sudo hd-idle -t sda

Para no tener que escribir el comando anterior cada vez que arranquemos la Raspberry, lo mejor es ponerlo en el fichero de configuración de hd-idle para que quede establecido de forma permanente. Así que editamos dicho fichero:

sudo nano /etc/default/hd-idle

y modificamos las líneas que se muestran a continuación, indicando en la segunda el tiempo que ha de transcurrir (en segundos) hasta que el HD entre en standby:

START_HD_IDLE=true
. . . . . .
. . . . . .
HD_IDLE_OPTS="-i 300 -l /var/log/hd-idle.log"

Si tuviéramos conectados varios discos, habría que modificar la segunda línea de manera que indique al principio el tiempo por defecto y luego el de cada unidad:

HD_IDLE_OPTS="-i 300 -a sda -i 600 -a sdb -i 1200"

Ya podemos reiniciar el servicio:

sudo service hd-idle restart

o bien el sistema para comprobar que funciona correctamente tras el reinicio:

sudo reboot



Certificado SSL de Let's Encrypt

Puesto que cada vez es más necesario dotar de un acceso seguro a cualquier sitio web, vamos a convertir nuestro servidor Apache o Nginx en un servidor web seguro que use el protocolo HTTPS. Para ello necesitaremos añadir un certificado SSL de una Autoridad de Certificación. Normalmente este certificado se incluye en la compra del dominio. Pero si vamos a usar un DNS dinámico (DDNS), como No-ip, por ejemplo, no dispondremos de él. Afortunadamente, Let's Encrypt nos proporciona de forma gratuita dicho certificado.

Antes de nada, lo primero que haremos será abrir los puertos 80 y 443 TCP en el router y redirigirlos a la IP local de la Raspberry. Si usamos un cortafuegos, también tendremos que abrirlos en él.


Obtención del certificado

Este proceso lo vamos a realizar en tres pasos:

1.) Instalamos Cerbot, el cliente de Let's Encrypt que nos permitirá automatizar la emisión e instalación de certificados, además del paquete que se encarga de automatizar esta tarea en el servidor web.

  1. Si usamos Apache:
    sudo apt install certbot python-certbot-apache
  2. En el caso de Nginx:
    sudo apt install certbot python-certbot-nginx

2.) Y ahora es cuando vamos a obtener el certificado.

  1. Para Apache usaremos este comando (sustituyendo midominio.com por el nuestro):
    sudo certbot --apache -d midominio.com
  2. Para Nginx el comando es similar:
    sudo certbot --nginx -d midominio.com

Durante el proceso de instalación del certificado se nos pedirá un email. Este correo electrónico es para la recuperación de claves y recibir notificaciones, por lo que es importante que sea un email válido, ya que se utilizará además para avisarnos en el caso de que se produzca un error durante el proceso de renovación automática del certificado. Luego tenderemos que aceptar los términos del servicio y si queremos compartir nuestro email (Y/N). Finalmente se nos preguntará si deseamos o no redireccionar todas las peticiones (tanto las HTTP como las HTTPS) al protocolo HTTPS (No redirect/Redirect).

3.) Ya sólo falta reiniciar el servidor.

  1. Si es Apache:
    sudo service apache2 restart
  2. En el caso de Nginx:
    sudo service nginx restart

Renovar el certificado

El certificado proporcionado por Let's Encrypt sólo es válido durante 90 días, por lo que es necesaria su renovación periódica. Podemos simular la renovación y comprobar que funciona correctamente mediante este comando:

sudo certbot renew --dry-run

Aunque la auténtica renovación se hace con

sudo certbot renew

En principio no hay que preocuparse por la renovación: el paquete que instalamos antes se encarga de mantener nuestro certificado actualizado, ya que al instalar dicho el paquete, se instala también un timer de systemd que se ejecuta dos veces al día.

No obstante, si nuestra distribución no usa systemd o el timer no funciona correctamente por algún motivo, siempre es posible automatizar la tarea de renovar el certificado recurriendo a cron. Para ello editamos su fichero de configuración:

crontab -e

y al final del mismo añadimos una línea para que se ejecute la autorenovación, por ejemplo, todos los viernes a las 3 de la madrugada:

0 3 * * 5 sudo /usr/bin/certbot renew --quiet

Guardamos los cambios y reiniciamos cron:

sudo service cron restart

Por otro lado, podemos verificar el estado de nuestro certificado SSL en esta página:

https://www.ssllabs.com/ssltest/analyze.html

Copia de seguridad del certificado

En caso de que en un futuro se dañe el directorio /etc/letsencrypt, que es donde se encuentra el certificado, podemos hacer copia de seguridad del mismo y restaurarlo después. En primer lugar hacemos la copia:

sudo tar zcvf letsencrypt_backup_$(date +'%Y-%m-%d_%H%M').tar.gz /etc/letsencrypt

Posteriormente, en el momento en que lo necesitemos, procederemos a su restauración. La haremos en dos pasos.

1.) Primero ejecutamos este comando para restaurar los archivos:

sudo tar zxvf letsencrypt_backup_XXXX-XX-XX_XXXX.tar.gz -C /

Sustituiremos, naturalmente, las XXXX-XX-XX_XXXX por los números correspondientes del fichero que contiene la copia de seguridad.

2.) En segundo lugar, restablecemos el certificado.

  1. En el caso de Apache:
    sudo certbot --apache
  2. Y para Nginx haremos lo propio:
    sudo certbot --nginx



Cron: el programador de tareas de Linux

Cron es un demonio (daemon) que funciona en segundo plano y ejecuta tareas automáticamente en un tiempo especificado por el usuario. Dichas tareas o trabajos (jobs), definidas generalmente en forma de scripts, se indican en un fichero de texto llamado crontab. Cada usuario del sistema posee su propio fichero crontab.

Veamos su funcionamiento mediante un ejemplo. Vamos a crear un script para que Raspberry Pi OS se actualice automáticamente cada cierto tiempo. Para ello, en el directorio del usuario (/home/pi) creamos un fichero llamado update.sh:

nano update.sh

Dentro del mismo escribimos lo siguiente:

#!/bin/bash
sudo apt update
sudo apt upgrade -y

Lo guardamos y a continuación le damos permisos de ejecución:

chmod u+x update.sh

Ahora lo añadimos como una nueva tarea de cron mediante la edición del fichero crontab:

crontab -e

Justo al final del fichero de texto que nos ha aparecido incluimos una línea para ejecutar nuestro script:

# m h dom mon dow       command
0 10 * * * /home/pi/update.sh > /dev/null 2>&1

NOTA: La parte final de la línea (> /dev/null 2>&1) se añade para que la ejecución del script no muestre ninguna salida por pantalla.

Una vez guardado el fichero, reiniciamos cron:

sudo service cron restart

Ahora tendremos una tarea que se ejecutará todos los días a las 10 de la mañana. Y para entender el funcionamiento de los 5 elementos (0 10 * * *) que hemos incluido al comienzo de esa línea, es preciso observar este esquema:

Podemos ver que, de izquierda a derecha, el significado de cada uno de esos 5 elementos es el siguiente:

min: minuto
hou: hora
dom: día del mes
mon: mes
dow: día de la semana

Podríamos cambiar la hora o los días en que queremos que se actualice el sistema operativo; para ello realizaremos las modificaciones oportunas, como en los siguientes ejemplos:

30 9 * * * /home/pi/update.sh > /dev/null 2>&1

Así, en lugar se ejecutarse todos los días a las 10, lo haría a la 9 horas y 30 minutos.

0 13 * * 5 /home/pi/update.sh > /dev/null 2>&1

Ahora la ejecución se llevaría a cabo todos los viernes (día 5 de la semana) a las 13 horas.

45 23 28 * * /home/pi/update.sh > /dev/null 2>&1

Con la línea anterior, se ejecutaría el día 28 de cada mes a las 23 horas y 45 minutos.

0 22 * * 1 /home/pi/update.sh > /dev/null 2>&1

En este último caso el sistema se actualizará los lunes (día 1 de la semana) a las 10 de la noche.


Intervalos de tiempo

Para indicar intervalos de tiempo se utilizan 3 caracteres especiales:

la coma		(,)   	separa una lista
el guión	(-)	indica un rango 
la barra	(/) 	cada cierto tiempo

Veamos algunos ejemplos:

0 10,15,19 * * * /home/pi/update.sh > /dev/null 2>&1

El script se ejecutará a las 10, a las 15 y a las 19 horas todos los días.

0 22 * * 1-5 /home/pi/update.sh > /dev/null 2>&1

Ahora lo hará a las 10 de la noche de lunes a viernes (días 1 al 5 de la semana).

0 */4 1,15 * * /home/pi/update.sh > /dev/null 2>&1

Se ejecutará cada 4 horas los días 1 y 15 de cada mes.

*/45 * * * * /home/pi/update.sh > /dev/null 2>&1

En este caso, la ejecución será cada 45 minutos.

0 9-23/2 * * 1,3,5 /home/pi/update.sh > /dev/null 2>&1

Por último, lo hará cada 2 horas (entre las 9 y las 23 horas) los lunes, miércoles y viernes.


Comandos específicos

  1. @reboot: se ejecuta en cada inicio del sistema.
  2. @yearly: se ejecuta una vez al año (0 0 1 1 *).
  3. @monthly: se ejecuta una vez al mes (0 0 1 * *).
  4. @weekly: se ejecuta una vez a la semana (0 0 * * 0).
  5. @daily: se ejecuta una vez al día (0 0 * * *).
  6. @hourly: se ejecuta una vez a la hora (0 * * * *).



Gestor de ficheros Midnight Commander

Quienes utilizaron hace varias décadas el sistema operatino MS-DOS muy probablemente tenían instalado el famoso Norton Commander, una utilidad con la que era posible obviar la línea de comandos para usar en su lugar una pantalla dividida en dos partes que representaba el árbol de directorios. La aplicación permitía realizar las tareas más comunes con ficheros y carpetas (crear, copiar, mover, borrar, editar, renombrar,...) sin tener que aprenderse la lista de comandos, usando en su lugar un menú de opciones, las teclas de función, el tabulador, las flechas e incluso el ratón. Incluía además un editor de texto propio.

La gran popularidad de esta utilidad hizo que surgiera pronto una versión para el sistema operativo Linux. Por razones de copyright se le cambió el nombre a Midnight Commander y así, las siglas que se utilizaban para referirse al Norton, pasaron de NC a MC. Y de esta última forma es como se instala en la Raspberry Pi:

sudo apt install mc

La arrancamos con la misma abreviatura con la que la hemos instalado (mc para usarlo como usuario o sudo mc para acceder como administrador) y este será su aspecto:

Podemos cambiar a cualquiera de las dos partes en que se divide la pantalla con la tecla del tabulador o pinchando con el ratón. En el menú Opciones se nos ofrece la posibilidad de configurar una gran cantidad de detalles de esta práctica y veterana aplicación.



Instalar Docker y utilizar contenedores

Docker es una herramienta de virtualización muy ligera que permite correr aplicaciones y servicios utilizando contenedores. La virtualización basada en contenedores tiene una gran ventaja con respecto a los sistemas tradicionales como VMWare o Virtualbox: en los contenedores no se crea un sistema huésped completo, sino que las aplicaciones se encapsulan en módulos que comparten el mismo kérnel del sistema anfitrión y se ejecutan como procesos aislados en el espacio de usuario. Esto supone un gran ahorro de recursos: memoria, espacio de disco y uso de CPU. El hecho de que sea tan ligera implica que no requiere de un hardware potente, lo que la hace muy adecuada para su uso en una placa como la Raspberry Pi. Los contenedores son, además, sistemas autocontenidos que ya disponen de todo lo necesario (código, librerías, dependencias y ficheros de configuración) para poder funcionar en cualquier equipo.

Los creadores de esta plataforma mantienen un repositorio público en la nube, llamado Docker Hub, que contiene una enorme cantidad de imágenes de muchas de las aplicaciones y servicios más utilizados por usuarios y empresas de todo el mundo, ordenadas por categorías, sistemas operativos y arquitecturas (entre las que se encuentra ARM). Cualquiera puede crearse una cuenta (gratuita o de pago) e incluir su propio repositorio particular, haciéndolo público o privado.


Instalar Docker

Lo primero que haremos será actualizar la lista de paquetes de Raspberry Pi OS:

sudo apt update

A continuación ejecutamos el script que llevará a cabo la instalación:

sudo curl -sSL https://get.docker.com | sh

Para poder utilizarlo con el usuario habitual del sistema, añadimos éste al grupo de Docker:

sudo usermod -aG docker pi

y reiniciamos el equipo:

sudo reboot

Con el fin de comprobar que Docker está funcionando correctamente, ejecutamos un primer contenedor hecho ex profeso para esta finalidad: uno muy básico que simplemente muestra el típico "Hello World". Para ello usaremos esta orden:

docker run hello-world

Como podemos ver, la imagen del contenedor se busca primero localmente, y si no se encuentra (como es el caso), se descarga del repositorio Docker Hub. Después se ejecuta el contenedor, que muestra el mensaje Hello from Docker!, y a continuación es cuando se nos indica que la instalación se ha realizado correctamente.

Con los siguientes comandos conoceremos la versión de Docker que tenemos instalada y también otra información extendida (su directorio raíz, kérnel, arquitectura de la CPU, sistema operativo,...), respectivamente:

docker -v
docker info

Instalar Docker Compose

Ahora vamos a instalar Docker Compose, que es una extensión que nos permite gestionar varios contenedores a la vez, además de poder configurar de una forma más sencilla cómo se comunican entre ellos.

Primero instalamos el gestor de paquetes pip:

sudo apt install libffi-dev libssl-dev -y
sudo apt install python3-pip -y

Y luego instalamos la aplicación:

sudo pip3 install docker-compose

Para comprobar que todo ha ido bien, ejecutamos este comando para que nos muestre la versión:

docker-compose --version

Actualizar y desinstalar

Ambas herramienta se actualizan, respectivamente, mediante estos comandos:

sudo apt update && sudo apt upgrade
pip3 install --upgrade docker-compose

Para desinstalarlas, en el caso de Docker:

sudo apt remove --purge docker-ce
sudo rm -rf /var/lib/docker

Y en el caso de Docker Compose:

sudo pip3 uninstall docker-compose

Imágenes

Ya dijimos al principio que existe un gran repositorio donde se encuentran todas las imágenes disponibles para Docker, llamado Docker Hub. De aquí es de donde se descargan las imágenes que vamos a usar en nuestro sistema.

Podemos conocer la lista de comandos disponibles para trabajar con imágenes escribiendo esto:

docker image --help

Los más usados seguramente serán los siguientes:

docker image ls                                       Muestra la lista de imágenes
docker image rm nombre | ID                  Borra una imagen
docker image pull nombre                       Descarga una imagen del repositorio
docker image prune                                 Borra todas las imágenes

Los tres primeros comandos anteriores pueden abreviarse:

docker images
docker rmi nombre | ID
docker pull nombre

Hemos de tener en cuenta que no se puede borrar una imagen si ya existe un contenedor de la misma. Es necesario borrar previamente el contenedor, ya que este no es más que una imagen que se ha lanzado y se encuentra en ejecución.

Parar borrar una imagen podemos usar su nombre o bien su ID. En este último caso no es necesario teclearlo completo (sólo los primeros caracteres, siempre que no existan varios IDs que comiencen por los mismos caracteres). Así, si tenemos dos imágenes cuyos IDs son 6567cb064a414 y 639db11237ab2, respectivamente, para eliminar la primera basta con teclear docker rmi 65.


Contenedores

Como dijimos antes, un contenedor no es más que una imagen que se encuentra en ejecución realizando una tarea. Ello implica que para poder lanzar un contenedor, previamente ha de descargarse la imagen correspondiente: primero se comprueba si esta ya existe en la máquina local, y si no es así, se descarga automáticamente del repositorio.

Al igual que con las imágenes, podemos conocer la lista de comandos disponibles para trabajar con contenedores tecleando esto:

docker container --help

Los más usados en un principio son los siguientes:

docker run nombre                              Arranca un contenedor
docker run -d nombre                         Arranca un contenedor en segundo plano
docker run --name wp wordpress       Lo arranca asignándole un nombre (wp)
docker run -it ubuntu bash                  Arranca un nuevo contenedor y ejecuta comandos
docker exec -it nombre | ID bash        Ejecuta comandos en un contenedor ya arrancado
docker container rename nombre | ID nuevo_nombre               Renombra el contenedor
docker ps -a                                         Muestrra la lista de contenedores
docker stop nombre | ID                      Detiene un contendor
docker start nombre | ID                      Inicia un contendor parado
docker restart nombre | ID                   Reinicia (stop/start) un contendor
docker rm nombre | ID                         Borra un contendor (debe estar parado)
docker pause nombre | ID                    Pausa un contendor
docker unpause nombre | ID                Reinicia un contendor pausado
docker container prune                        Borra todos los contenedores

Como en el caso de las imágenes, para referirse a un contenedor por su ID, no hace falta escribirlo entero (sólo el/los primer/os caracteres, siempre que no existan varios IDs que comiencen por los mismos).




Crear un punto de acceso Tor

Vamos a convertir la Raspberry en un AP (Access Point) o punto de acceso Wifi con la finalidad de acceder a Internet por medio de la red Tor, de modo que todos los dispositivos que se conectan a este AP, sin tener que tocar ni configurar nada en ellos, se enruten automáticamente a través de Tor. Esto resulta mucho más práctico y cómodo que hacerlo mediante un servidor proxy.

Cuando utilizamos Tor, nuestra ubicación o nuestra dirección IP quedan ocultas y enmascaradas, lo que impide el rastreo de las actividades que llevamos a cabo mientras navegamos por Internet. Pero hemos de saber que su uso conlleva una ralentización en la velocidad de navegación y transmisión de datos debido a su peculiar forma de funcionamiento: es el precio que hemos de pagar por la seguridad y el anonimato que nos proporciona.


requisitos previos

El primer requisito es usar Raspberry Pi OS Lite. Una vez instalada esta versión concreta del SO (para quien lo necesite, aquí se muestra cómo hacerlo), entramos por SSH utilizando, de momento, la IP local que nos asigne el servidor DHCP de nuestro router. Más adelante (ya veremos el motivo de no hacerlo ahora) le asignaremos una IP estática.

Una vez instalado, lo primero que haremos será actualizar el sistema:

sudo apt update
sudo apt upgrade -y

Luego reiniciamos:

sudo reboot

Por último, dado que vamos a crear un punto de acceso Wifi, accedemos a la configuración del sistema:

sudo raspi-config

y entramos en el apartado 4 Localisation Options. Aquí seleccionamos I4 Change WLAN Country y elegimos nuestro país (ES Spain en nuestro caso).


Crear el punto de acceso (AP)

Para ahorrarnos el complejo proceso de instalación y configuración del punto de acceso, vamos a usar un script que haga todo el trabajo de forma automática. Podemos saber más sobre el mismo pinchando en la siguiente imagen:

Lo ejecutaremos tecleando este comando:

curl -sL https://install.raspap.com | bash

Una vez finalizado el proceso y reinicializado el sistema, nos aparecerá una nueva red Wifi con el SSID raspi-webgui. Este es el punto de acceso al que hemos de conectarnos. Para ello usaremos la contraseña ChangeMe. Este AP crea una subred en un rango de direcciones que van desde la 10.3.141.50 hasta la 10.3.141.255, que son las que se les asignarán por DHCP a los clientes que se conecten.

Desde el navegador de nuestro PC podemos entrar en la interfaz web del punto de acceso a través de la dirección 10.3.141.1 para realizar algunos cambios en su configuración. Se nos pedirá un nombre de usuario (admin) y una contraseña (secret). En el menú de la izquierda, pinchamos en Hotspot y en la pestaña Basic comprobamos que esté selecionado el Interface: wlan0; luego podemos cambiar el nombre del SSID por otro distinto (por ejemplo, RPi-Tor); debajo seleccionamos Wireless Mode: 802.11n - 2.4 GHz y en Channel se puede cambiar el canal si el que aparece ya lo estamos usando en otro emisor Wifi de nuestra LAN. Guardamos los cambios pinchando en el botón Save settings.

Luego, en la pestaña Security nos aseguramos de que esté seleccionado Encryption Type: CCMP y en PSK cambiamos la contraseña de conexión al AP que viene por defecto (ChangeMe) por otra más robusta y compleja. Volvemos a guardar los cambios y pasamos a la pestaña Advanced, donde vamos a seleccionar el país que nos corresponda (Country Code: Spain en nuestro caso). Guardamos los cambios de nuevo y ahora no debemos olvidar hacer clic en el botón Restart hotspot. Cuando se reinicie, nos conectamos de nuevo al punto de acceso, volvemos a entrar en la interfaz web, vamos al menú izquierdo y pinchamos en Authentication para cambiar la contraseña de acceso por defecto (secret) por otra menos obvia. Ya sólo nos queda guardar los cambios por última vez haciendo clic en Save settings.


Cambios en iptables

Hecho todo lo anterior, ya tenemos la Raspberry convertida en un punto de acceso Wifi y correctamente configurada. Pero ahora nos proponemos ir un paso más allá y hacer que todas las conexiones a la misma se realicen a través de Tor, con el fin de conseguir seguridad y anonimato en nuestras comunicaciones. Para ello, lo primero que haremoss será borrar todas las reglas de iptables del sistema:

sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Podemos comprobar su eliminación con el siguiente comando:

sudo iptables -t nat -L

A continuación crearemos nuevas reglas, comprobaremos que se han escrito correctamente y finalmente las guardaremos:

sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo iptables -t nat -A PREROUTING -i wlan0 -p udp --dport 53 -j REDIRECT --to-ports 53
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --syn -j REDIRECT --to-ports 9040
sudo iptables -t nat -L
sudo iptables-save | sudo tee /etc/iptables/rules.v4

Instalar Tor

Vamos a realizar la instalación de Tor:

sudo apt install tor

Editamos su fichero de configuración:

sudo nano /etc/tor/torrc

Y al final del mismo añadimos las siguientes líneas:

Log notice file /var/log/tor/notices.log
VirtualAddrNetwork 10.192.0.0/10
AutomapHostsSuffixes .onion,.exit
AutomapHostsOnResolve 1
TransPort 10.3.141.1:9040
DNSPort 10.3.141.1:53

Creamos el fichero de log indicado antes y le damos los permisos correspondientes:

sudo touch /var/log/tor/notices.log
sudo chown debian-tor /var/log/tor/notices.log
sudo chmod 644 /var/log/tor/notices.log

Arrancamos el servicio y comprobamos que esté activo:

sudo service tor start
sudo service tor status

Hacemos que se ejecute durante el arranque del sistema:

sudo update-rc.d tor enable

Y por último, reiniciamos:

sudo reboot

Puede darse el caso de que el servicio no se inicie correctamente durante el arranque de la Raspberry, por lo que nos encontraremos con el problema de que el punto de acceso Wifi no tiene conexión a Internet. Para solucionarlo tendremos que reiniciarlo de nuevo: escribimos sudo service tor stop, esperamos unos segundos y volvemos a iniciarlo con sudo service tor start. Dado que este proceso es bastante tedioso si lo hacemos manualmente, lo mejor es automatizarlo: creamos un script con las instrucciones necesarias y lo ejecutamos en cada reinicio por medio de cron. Lo haremos de esta forma:

  1. 1.- En /home/pi creamos un fichero de script llamado, por ejemplo, aptor.sh:
    nano aptor.sh
    e incluimos este contenido:
    #!/bin/bash
    sleep 15
    sudo service tor stop
    sleep 15
    sudo service tor start
  2. 2.- Una vez guardado, le damos permiso de ejecución:
    chmod u+x aptor.sh
  3. 3.- Editamos el fichero de configuración de cron:
    crontab -e
    y, al final del mismo, añadimos una línea para que se ejecute el script cada vez que se ponga en marcha o se reinicie la Raspberry:
    @reboot /home/pi/aptor.sh > /dev/null 2>&1

A partir de ahora, tras cada arranque, damos tiempo a que se inicie correctamente el servicio y ya podremos conectarnos al punto de acceso Tor desde cualquier cliente. Para asegurarnos de que estamos utilizando de verdad la red Tor, sólo tenemos que pinchar en este enlace.


Asignarle a la RPi una IP estática

Hasta ahora hemos entrado en la Raspberry Pi por SSH mediante la IP dinámica asignada por el servidor DHCP del router. Esto ha sido así porque el script que usamos antes para crear el punto de acceso borra el contenido y luego realiza cambios en el fichero donde se configura la IP local. Pero una vez que el script ha hecho su labor, ya podemos asignar una IP estática a la interfaz de red eth0, tal y como se explica aquí.

Por último, añadir que, después de haber instalado Tor, si deseamos entrar en la interfaz web del AP, ya no podremos hacerlo como lo hicimos al principio (a través de la IP 10.3.141.1), sino que deberemos entrar usando la IP que acabamos de asignar a la RasPi.




Configurar un nodo o relay Tor

En el apartado anterior (y en otro en el que explicamos cómo instalar un servidor proxy) hemos visto cómo usar la red Tor en beneficio propio con el fin de preservar nuestra privacidad. Pero también podemos ser nosotros los que ofrezcamos este servicio a los demás convirtiendo la Raspberry Pi en un Tor relay, es decir, en un nodo o router Tor, de manera que pase a formar parte de esta red y sean otros usuarios los que se beneficien de nuestros recursos para operar en Internet de forma anónima. Se trata, pues, de contribuir de una forma activa a que cualquier persona pueda acceder a Internet y evitar que se monitorice constantemente su actividad, tanto por parte de los gobiernos como de las grandes compañías que ofrecen servicios en la red y trafican con los datos obtenidos.

El proyecto Tor intenta proporcionar una solución al problema de la privacidad consiguiendo que sea imposible (o, al menos, muy difícil) rastrear el origen de una dirección IP. Esto se logra haciendo rebotar la conexión a través de una cadena de relays aleatorios, que consta de al menos un nodo de entrada, un nodo de retransmisión y un nodo de salida:

  1. 1.- Nodo de entrada: el nodo de entrada sólo conoce la dirección IP del usuario de Tor y la dirección IP del nodo de retransmisión, pero no el destino final de la solicitud.
  2. 2.- Nodo intermedio o de retransmisión: el nodo de retransmisión sólo conoce la dirección IP del nodo de entrada y la dirección IP del nodo de salida, y no conoce ni el origen ni el destino final.
  3. 3.- Nodo de salida: el nodo de salida sólo conoce la dirección IP del nodo de retransmisión y el destino final de la solicitud; es el único nodo que descifra el tráfico antes de enviarlo a su destino final. Debido a que el tráfico sale a través de este nodo, su dirección IP es la que se interpreta como el origen del tráfico en lugar de la dirección IP real del usuario de Tor.

Como se muestra en la figura, los nodos de entrada y retransmisión (guard & middle relays), también llamados non-exit relays, que son los que vamos a configurar nosotros, desempeñan un papel crucial en este intercambio porque crean una barrera criptográfica entre el origen de la solicitud y el destino de la misma. En los nodos de salida se rompe esta barrera, pero incluso en el caso de que alguno estuviera controlado por un "observador" que intenta robar los datos, no podrá conocer el origen de la solicitud sin controlar toda la cadena previa de retransmisiones Tor.

Los nodos de salida (exit relays) son más complejos de configurar y mantener, requieren un mayor ancho de banda y además están más expuestos, por lo que suelen ser ejecutados por operadores pertenecientes a diversas instituciones, universidades u organizaciones de defensa de la privacidad.

En cuanto a los primeros, que son los que nos atañen, para que un nodo funcione como entrada o guard relay debe ser estable (a ser posible, permanecer activo 24/7) y además ha de ser rápido (estar por encima de los 2 MB/s de velocidad), de lo contrario funcionará como un middle relay, es decir, un nodo intermedio o de retransmisión.


Requisitos previos

Toda la información sobre los requisitos necesarios para configurar un nodo puede consultarse en la web de Tor, en la sección Relay Operations.

Antes de empezar con la instalación, debemos asignarle a la Raspberry una IP estática, lo que se explica en este apartado.

Por último, conviene saber que, al contrario que otras placas, la Raspberry Pi no dispone de aceleración AES-NI por hardware para el cifrado/descifrado de datos, lo que implica que ha de hacerse por software y ello conlleva una cierta ralentización en el flujo del tráfico que pasa por nuestro nodo.


Instalacíón y configuración

Procedemos a instalar Tor:

sudo apt install tor

Editamos su fichero de configuración:

sudo nano /etc/tor/torrc

y al final del mismo añadimos las siguientes líneas:

SocksPort 0
Log notice file /var/log/tor/notices.log
RunAsDaemon 1
DataDirectory /var/lib/tor
ControlPort 9051
CookieAuthentication 1
ORPort 9001
DirPort 9030
ExitPolicy reject *:*
RelayBandwidthRate 4 MB
RelayBandwidthBurst 8 MB
Nickname mi_nick
ContactInfo mi_email
DisableDebuggerAttachment 0

Tenemos que sustituir mi_nick por el apodo que queramos utilizar en la red y mi_email por una dirección de correo válida, pues en ella vamos a recibir una alerta del servicio "Tor Weather" si nuestro nodo se desconecta durante más de 48 horas o si algo no funciona bien.

Podemos cambiar el ancho de banda que vamos a asignar a nuestro nodo en la red modificando los valores RelayBandwidthRate y RelayBandwidthBurst, adecuándolos a la capacidad y velocidad de transmisión de nuestra línea.

Los puertos indicados en el fichero (9001 TCP y 9030 TCP) hemos de abrirlos en el router y redirigirlos a la IP local de la Raspberry. También los abriremos en el cortafuegos, si lo tenemos instalado.

A continuación reiniciamos Tor para que los cambios tengan efecto:

sudo service tor restart

Si todo ha ido bien, podemos mirar el contenido del fichero de log:

cat /var/log/tor/notices.log

y comprobar que haya una línea como la siguiente:

... [notice] You are running a new relay. Thanks for helping the Tor network!...

Una vez pasadas varias horas, es posible saber con seguridad si nuestro relay está activo y obtener más información sobre el mismo buscando en Relay Search. La búsqueda podemos hacerla por nuestro apodo, dirección IP, fingerprint, etc.

Finalmente, añadir que en el directorio /var/lib/tor se almacenan algunos datos importantes de nuestro nodo, entre ellos la clave privada que se usa para cifrar los paquetes de datos.


Control gráfico

Para comprobar la actividad de nuestro nodo Tor, podemos instalar un sistema de control gráfico para ARM:

sudo apt install tor-arm

Limpiamos la consola escribiendo clear y lo ejecutamos con este comando:

sudo -u debian-tor nyx

Hay una serie de teclas que podemos usar: m para desplegar el menú de opciones, p para pausar la gráfica o q (dos veces) para salir.


Nodos bridge

Aparte de los nodos de entrada, de retransmisión y de salida, existe además un tipo especial llamado bridge (puente). El diseño de la red Tor implica que la dirección IP de sus nodos es pública. Por ello, una de las formas en que los gobiernos o los ISP pueden combatir el uso de Tor es bloqueando la lista de direcciones IP de estos nodos públicos. Sin embargo, los bridge son nodos de la red que no figuran en el directorio público de Tor, lo que dificulta enormemente que los ISP o los gobiernos puedan bloquearlos.

Para los usuarios de Tor, recurrir a este tipo especial de nodos es útil si se encuentran bajo regímenes opresivos o para aquellas personas que quieren una capa adicional de seguridad porque les preocupa que alguien reconozca que están conectados a una dirección IP pública de retransmisión Tor.

Para nosotros, configurar un bridge relay es una excelente opción si estamos ejecutando un nodo Tor desde nuestra red doméstica, disponemos de una única IP pública o no tenemos una línea con una gran cantidad de ancho de banda para donar (aunque se recomienda ceder al menos 1 MB/s de este ancho de banda).

Si queremos realizar la configuración de nuestro nodo Tor en modo bridge, el proceso diferirá un poco con respecto al que explicamos antes. Los pasos se indican a continuación.

  1. 1.- Instalamos Tor:
    sudo apt install tor
  2. 2.- Después hay que instalar tambien este otro paquete:
    sudo apt install obfs4proxy
  3. 3.- Seguidamente editamos el fichero de configuración de Tor:
    sudo nano /etc/tor/torrc
    Pero en este caso el contenido que incluiremos será algo diferente:
    SocksPort 0
    BridgeRelay 1
    ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy
    ServerTransportListenAddr obfs4 0.0.0.0:8042
    ORPort 9833
    ExtOrPort auto
    Log notice file /var/log/tor/notices.log
    DataDirectory /var/lib/tor
    ExitPolicy reject *:*
    RelayBandwidthRate 2 MB
    RelayBandwidthBurst 4 MB
    ControlPort 9051
    Nickname mi_nick
    ContactInfo mi_email
    DisableDebuggerAttachment 0
    No hay que olvidar sustituir mi_nick y mi_email por el apodo y el correo que queramos usar.
  4. 4.- Ya sólo nos resta reiniciar el servicio:
    sudo service tor restart

Lo demás es idéntico a lo expuesto antes, incluyendo la instalación del control gráfico. Únicamente recordar que, como es obvio, los nuevos puertos indicados en el fichero anterior (el 9833 TCP y el 8042 TCP, que podemos cambiar por otros si lo deseamos) tendremos que abrirlos en el router y redireccionarlos a la IP local de la Raspberry. También los abriremos en el cortafuegos, en el caso de que lo tengamos instalado.




Montar un sistema de discos en RAID

El término RAID es un acrónimo que significa Redundant Array of Independent Disks o, dicho en español, matriz redundante de discos independientes. Se trata de crear un sistema para el almacenamiento de datos utilizando múltiples unidades, de forma que los datos se distribuyan entra ellas. Estas unidades de almacenamiento suelen ser discos duros mecánicos (HDD) o discos de estado sólido (SSD). El objetivo final del RAID es ofrecer al usuario una mayor capacidad de almacenamiento, redundancia de datos (para evitar la pérdida de estos) y proporcionar mayor velocidad de lectura y escritura que si solamente tuviéramos un único disco.

Existen diversos tipos y combinaciones de RAID. Los más utilizados son 0, 1, 5, 6, 01 (0+1) y 10 (1+0). Aquí vamos a ver únicamente los dos primeros, ya que son los más usados en entornos domésticos debido a su menor complejidad y a que se pueden configurar con sólo dos discos. Los demás tipos necesitan un mínimo de tres o cuatro discos.


RAID 0

También llamado conjunto dividido o striping, la función de este tipo de RAID es la de distribuir los datos entre los distintos discos que están conectados al equipo. Dichos datos se dividen en bloques que se reparten por todas las unidades de la matriz. Al utilizar varios discos (al menos 2) al mismo tiempo, ofrece un rendimiento de E/S superior, llegando casi a duplicar la velocidad de acceso. El objetivo de implementar un RAID 0 es el de proporcionar buenas velocidades de acceso a los datos que estén guardados en los discos, ya que la información esta equitativamente repartida en ellos para tener acceso simultáneo a una mayor cantidad de datos con los discos funcionando en paralelo. RAID 0 no tiene información de paridad ni redundancia de datos, por lo que si se rompe una de las unidades de almacenamiento, perderemos todos los datos que haya almacenados en la matriz.

Para realizar un RAID 0 debemos de prestar atención al tamaño de los discos que lo forman. En este caso será el disco de menor tamaño el que determine el espacio añadido en el RAID. Por ejemplo, si tenemos un disco de 1 TB y otro de 500 GB en la configuración, el tamaño del conjunto será de 1 TB, ya que el sistema usará el disco de 500 GB y otros 500 GB del disco de 1 TB. Por esto lo ideal es usar discos de igual tamaño para poder utilizar todo el espacio disponible en el conjunto.


RAID 1

Esta configuración también es llamada espejo o mirroring y es una de las más utilizadas debido a que proporciona redundancia de datos y buena tolerancia a fallos. En este caso, lo que estamos haciendo es crear un almacén con información duplicada en dos discos. Cuando guardamos un dato, este se copia inmediatamente en su unidad espejo para así tener dos veces el mismo dato almacenado.

Debido a que RAID 1 guarda los mismos datos en cada disco de la matriz, esto supone un aumento en la fiabilidad del sistema de almacenamiento: para que se pierdan los datos de un RAID 1, todas las unidades deben fallar al mismo tiempo. Cuando falla una unidad, el controlador muestra una advertencia que lo notifica. Al reemplazar la unidad defectuosa, el controlador reconstruye el nuevo disco con los datos almacenados en la otra unidad de forma automática. Esta seguridad tiene como contrapartida la pérdida de espacio de almacenamiento, pues de los dos discos (que deben ser del mismo tamaño), sólo aprovecharemos uno de ellos, ya que el otro se usa como copia del primero.

Resumen: RAID 0 usa todo el espacio de almacenamiento y proporciona mayor velocidad, pero no tenemos ninguna seguridad en caso de fallo. RAID 1, en cambio, ofrece seguridad, pero a cambio de una menor velocidad y una pérdida de espacio de almacenamiento. De nosotros y de nuestras necesidades específicas dependerá el uso de uno u otro sistema. Para almacenar ficheros fácilmente recuperables (películas o software, por ejemplo) en caso de avería o fallo en alguno de los discos, podemos usar RAID 0 con el fin de tener disponible todo el espacio de ambos discos y ganar velocidad. Pero si vamos a guardar datos personales o críticos (fotos, vídeos, documentos) será preferible usar RAID 1, ya que en este caso prima la seguridad.


Instalar el software

En la Raspberry tenemos que crear el sistema RAID mediante software, para lo que necesitamos instalar la utilidad adecuada:

sudo apt install mdadm -y

Conectamos la dos unidades de disco USB a la Raspberry y tecleamos el siguiente comando:

lsblk

Obtendremos algo similar a lo que se observa en esta imagen:

Las dos unidades se muestran como sda1 y sdb1.


Crear el volumen

Ahora vamos a configurar el volumen RAID. En el caso de que queramos crear un RAID 0, teclearemos lo siguiente:

sudo mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sda1 /dev/sdb1

Y en el caso de que deseemos crear un RAID 1, escribiremos esto otro:

sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

En ambos comandos, /dev/md0 es el nombre del volumen que queremos crear; --level=1 es el tipo de RAID; --raid-devices=2 indica el número de discos; y al final, separados por un espacio, se muestran las unidades de disco que se van a utilizar.

Ya que pretendemos guardar datos personales, vamos a optar por crear un RAID 1. Sea cual sea la opción elegida, se nos pedirá confirmación (Continue creating array?), así que respondemos Yes:

Al final se nos informa de la que matriz /dev/md0 se ha iniciado. Podemos comprobar que, efectivamente, se ha creado el RAID usando de nuevo este comando:

lsblk

que nos muestra ambas unidades de disco (sda1 y sdb1) apuntando a un único volumen de datos (md0).

Podemos obtener mucha información sobre el mismo con

sudo mdadm --detail /dev/md0

Formateo y montaje

Tenemos que dar formato al nuevo volumen RAID:

sudo mkfs.ext4 /dev/md0

Creamos la carpeta de montaje, le damos los permisos adecuados y lo montamos en ella:

cd /media
sudo mkdir raid
sudo chmod 777 raid
sudo mount /dev/md0 /media/raid

A continuación vamos a hacer que el volumen se monte automáticamente cada vez que iniciamos el sistema:

sudo nano /etc/fstab

Añadiremos al final de este fichero una nueva línea en la que indicaremos el nombre del dispositivo, la carpeta de montaje y el sistema de ficheros usado (los espacios se insertan con el tabulador):

/dev/md0    /media/raid    ext4    defaults    0    0

Guardamos los cambios y reiniciamos:

sudo reboot

A partir de este momento, para guardar, editar o descargar datos en nuestra unidad RAID podríamos instalar servicios como Samba o WebDAV, por ejemplo, utilizando en ellos la carpeta /media/raid como carpeta compartida y lugar de almacenamiento.




Crear un bot de Telegram

Gracias a la API de Telegram, se pueden crear bots para establecer una conexión con la la Raspberry Pi e interactuar con ella. En este apartado vamos a crear un bot sencillo que nos permiirá recibir diversas notificaciones:

  • Cuando se arranque o reinicie la RPi
  • En el momento en que alguien se conecte por SSH
  • Para indicarnos cuál es nuestra IP pública
  • Conocer la temperatura de la CPU

Naturalmente, lo primero que hemos de hacer es instalar Telegram en uno o en varios de nuestros dispositivos (PC, portátil, tableta, teléfono móvil). Como es habitual, para Android lo descargamos de Google Play; en el caso de iOS, de la App Store; y para instalarlo en un PC o portátil, podemos hacer clic en la imagen siguiente:


Creación del bot

Para crear nuestro propio bot tendremos que recurrir a @BotFather, que es el bot usado por Telegram para la creación de los mismos. Lo iniciamos y luego escribimos /newbot o lo seleccionamos del menú. Nos pedirá un nombre para el bot, así que escribimos el que nos parezca adecuado. A continuación nos pedirá que escribamos un nombre de usuario, que debe terminar en bot. Con esto ya está creado el bot, por lo que nos mostrará el token que vamos a necesitar luego para usar la API. Por último, necesitamos obtener nuestro identificador o ID de Telegram, que es único para cada usuario. Para conseguirlo, tenemos que iniciar un bot llamado @userinfobot, que nos lo mostrará.

Con el token y nuestro ID, volvemos al bot @BotFather y lanzamos el comando /mybots. Abrimos nuestro bot haciendo clic en él (aparecerá al final de Here it is: xxxxxxx@mibot) y lo iniciamos. Nos mostrará ya lanzado el comando /start y debajo del mismo es donde recibiremos las notificaciones.


Crear los scripts

Vamos a crear una serie de scripts en nuestra carpeta /home/pi para recibir notificaciones. Empezaremos por uno sencillo que nos muestre la temperatura de la CPU. Para ello, creamos un nuevo fichero que llamaremos, por ejemplo, así:

nano bot-temp.sh

Dentro del mismo vamos a añadir este contenido:

#!/bin/bash
TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ID="xxxxxxxxx"
MENSAJE="Temperatura de la RPi: $(/opt/vc/bin/vcgencmd measure_temp)"
URL="https://api.telegram.org/bot$TOKEN/sendMessage"
curl -s -X POST $URL -d chat_id=$ID -d text="$MENSAJE" > /dev/null 2>&1

En las dos primeras líneas, como es obvio, sustituimos las "xxxxxx" por nuestro TOKEN y nuestra ID, que obtuvimos más arriba.

Antes de lanzar el script, hay que hacerlo ejecutable:

chmod +x bot-temp.sh

Cada vez que lo ejecutemos (./bot-temp.sh), recibiremos una lectura de la temperatura en nuestro bot. Pero si queremos que se autoejecute, por ejemplo, un par de veces al día, recurriremos a cron. Para ello añadiremos una nueva tarea mediante la edición del fichero crontab:

crontab -e

Al final del todo incluiremos una línea para ejecutar el script dos veces al día (a las 15 y a las 23 horas):

0 15,23 * * * /home/pi/bot-temp.sh > /dev/null 2>&1

Bien, a continuación vamos a crear un par de scripts más: uno para recibir un mensaje cuando se arranque o reinicie la Raspberry y otro para conocer su IP pública. Comenzamos con el primero:

nano bot-boot.sh

en el que pegaremos lo siguiente:

#!/bin/bash
TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ID="xxxxxxxxx"
MENSAJE="Ha arrancado la RPi"
URL="https://api.telegram.org/bot$TOKEN/sendMessage"
curl -s -X POST $URL -d chat_id=$ID -d text="$MENSAJE" > /dev/null 2>&1

Y este será el segundo:

nano bot-ip.sh

que tendrá un contenido ligeramente diferente:

#!/bin/bash
TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ID="xxxxxxxxx"
MENSAJE="IP pública de la RPi:  $(curl ifconfig.co)"
URL="https://api.telegram.org/bot$TOKEN/sendMessage"
curl -s -X POST $URL -d chat_id=$ID -d text="$MENSAJE" > /dev/null 2>&1

Al igual que antes, pondremos en las primeras líneas el TOKEN y el ID que obtuvimos cuando creamos el bot.

Ya sólo nos resta hacer ejecutables ambos ficheros:

chmod +x bot-boot.sh
chmod +x bot-ip.sh

Como hicimos más arriba con el primer script, vamos a lograr que también estos se autoejecuten durante el arranque o reinicio de la Raspberry, para lo que recurriremos a cron, añadiendo una nueva tarea mediante la edición del fichero crontab:

crontab -e

Al final del todo incluiremos una línea para ejecutar ambos scripts:

@reboot (sleep 30; /home/pi/bot-boot.sh; /home/pi/bot-ip.sh)

A partir de ahora, cada vez que se arranque o se reinicie la Raspberry, y una vez transcurridos 30 segundos (tiempo para que el sistema cargue todos los procesos necesarios antes de poder ejecutar el script), recibiremos dos mensajes en el bot:

Ha arrancado la RPi
IP pública de la RPi: xxxx.xxxx.xxxx.xxxx

Seguidamente, y por razones prácticas, en lugar de usar un script, recurriremos directamente a curl para lograr que se nos avise cuando alguien se conecta a la Raspberry por SSH. Resulta que cada vez que alguien inicia una sesión SSH en la terminal, el sistema lee el archivo .bashrc del usuario que se conecta. Así pues, lo editamos:

nano .bashrc

y al final del mismo pegamos la siguiente línea:

curl -s -X POST https://api.telegram.org/bot"TOKEN"/sendMessage -d chat_id="ID" -d text="Iniciada sesión SSH en la RPi desde la IP $(echo $SSH_CLIENT | awk '{ print $1}')" > /dev/null 2>&1

Sustituimos lo que aparece en negrita (TOKEN e ID) por los nuestros correspondientes y, una vez hechas estas modificaciones y guardados los cambios, si abrimos una sesión SSH, recibiremos en el bot este mensaje:

Iniciada sesión SSH en la RPi desde la IP xxx.xxx.xxx.xxx

NOTA: Si tenemos instalada la versión Desktop de Raspberry Pi OS (con la versión Lite no hay necesidad de hacerlo), debemos ir al escritorio (conectándonos directamente o por medio de VNC), desplegar el menú superior > Preferencias > Configuración de Raspberry Pi y en la pestaña Sistema, desmarcar (Disabled) el Ingreso automático. De no hacerlo, recibiremos en el bot la notificación de un inicio de sesión SSH nada más arrancar o reiniciar la Raspberry, aunque no nos hayamos conectado aún por SSH.