Montar carpetas SFTP en OS X

Estoy acostumbrado a montar carpetas SFTP directamente desde Nautilus en Linux, es muy cómodo. En OS X me he encontrado que no es tan sencillo, y estoy muy mayor para usar cosas como Transmit o Filezilla. Así que me he vuelto a la consola, y he decidido hacerlo manualmente hasta que encuentre alguna forma de automatizarlo.

Para montar carpetas SFTP son necesarios FUSE y SSHFS. En OS X pueden descargarse desde la página del proyecto OSXFUSE, puede instalarse mediante Homebrew:

~$ brew install osxfuse sshfs

Acabada la instalación lo siguiente es crear la carpeta donde se montará la carpeta SFTP.

~$ mkdir /Users/jorge/Mounts/sevidor

Y a continuación montarla con:

~$ sshfs usuario@servidor:/home/jorge /Users/jorge/Mounts/servidor

El contenido remoto aparecerá en la carpeta creada antes, y se podrá acceder desde Finder y desde un icono en el escritorio.

El comando para desmontar el sistema de archivos SFTP es:

~$ unmount -f /Users/jorge/Mounts/servidor

Y eso es todo. Si alguien conoce alguna forma de montarlo automáticamente desde Finder con un servicio, o alguna otra chapuza, puede enviarme un correo o un tweet (ahí a la izquierda están).

Compilar y ejecutar C dentro de Subime Text

Estas son las configuraciones para compilar y ejecutar C dentro de Sublime Text para Linux, Windows Y Mac OS X.

Linux o Mac OS X

{ "cmd" : ["gcc $file_name -o $file_base_name && ./$file_base_name"],
"selector" : "source.c",
"working_dir" : "$file_path" }

Windows

{ "cmd" : ["gcc", "$file_name", "-o", "${file_base_name}.exe", "&&", "${file_base_name}.exe"],
"selector" : "source.c",
"shell" : true,
"working_dir" : "$file_path" }

Para añadir un nuevo método de compilación en Sublime Text: Tools → Build System → New Build System… En la nueva pestaña copiar la configuración que corresponda y guardar como C.sublime-build, al hacerlo Sublime text lo hará en la carpeta correspondiente. En caso contrario la ubicación es [carpeta de configuración de Sublime Text]/Packages/User.

Ahora en Tools → Build System aparecerá el nuevo método.

Túnel SSH + SOCKS Proxy = Navegación segura

Ninguna red pública es segura, a veces ni la de tu cuñado lo es. Añadir una capa de seguridad a esas conexiones es tan fácil como crear un túnel entre el dispositivo y una conexión segura, como la de tu casa. Es más fácil de lo que parece, sólo hace falta tener un servidor Seure Shell y un cliente en el dispositivo.

Secure Shell permite crear un túnel entre dos dispositivos y convertirlo en un proxy SOCKS5 simplemente añadiendo el parametro -D al commando.

~$ ssh -N -D 8000 usuario@servidor

El parámetro -N sólo crea el túnel, no carga el términal remoto.

Para usar el proxy hay que añadirlo o al navegador o a la configuración del sistema operativo. En el navegador el complemento que más me gusta es FoxyProxy. Al configurar el proxy el servidor es localhost y el puerto 8000, ya que el túnel empieza en nuestro equipo, y el tipo de servidor proxy es SOCKS5.

Así la conexión será un poco más segura.

PROGMEM, prog_char y avr-gcc ya no son amigos

Tengo entre manos un proyecto de domótica que combina un par de Arduino Nano y una Raspberry Pi. Durante el desarrollo todo funcionó perfectamente, usé el IDE de arduino 5.0.1. Todo funcionaba perfectamente hasta que trasladé el desarrollo a la Raspberry Pi.

En la RPi uso Arduino-Makefile, que permite de una forma muy sencilla compilar y cargar los programas a Arduino. Al compilar los sketches que vienen de ejemplo compiló y cargó todo, perfecto. Al compilar el proyecto empezaron a aparecer errores de compilación por todos lados, todos relacionados con PROGMEM y prog_char. prog_char ya no existí y la solución era cambiar las variables de PROGMEM prog_char nombre a const char nombre PROGMEM. Cambiarlo en mi código fué sencillo, sólo había dos variables de ese tipo, el problema eran las librerias, que no eran pocas.

Ante la imposibilidad de ponerme a reescribir las librerías decidí buscar otra solución. Lo primero que se me ocurrió fue instalar una versión anterior de avr-gcc a la 4.6, pero sabía que más adelante no podría mantenerme en esa versión. La otra añadir algunos parámetros a la compilación para que ignorase los errores y compilara como la versión anterior. Los parámetros son:

-Wno-deprecated-declarations -D__PROG_TYPES_COMPAT__

Los añadí en la variable CFLAGS (línea 936) del archivo Arduino.mk. La siguiente compilación se produjo con éxito.

Verificación en dos pasos en Secure Shell con Google Authenticator

Una de las cosas más importante al abrir Secure Shell a Internet es la seguridad. Es fácil que se convierta en el objetivo de bots y niñatos, por eso mismo toda medida que se tome para protejerlo es poco.

Además de limitar el rango de IP, los usuarios o el puerto de conexión existe la posibilidad de usar la validación en dos pasos para conectarse a Secure Shell.

Google ofrece un software llamado Google Authenticator que permite configurar la validación en dos pasos para diferente servicios. Es totalmente independiente, no comparte ninguna información con Google y el usuario tiene control absoluto sobre el servicio.

Puede instalarse a partir de código o con:

~$ sudo apt-get install libpam-google-authenticator

Una vez instalado el módulo PAM hay que configurarlo para que funcione con Secure Shell.

El primer paso es crear una clave de verificación para el usuario. Iniciada sesión con el usuario, se crea con el comando google-authenticator.

Google Authenticator pregunta al usuario una serie de parámetros de seguridad, como el tiempo de validez de las claves, el número de intentos…

Google Authetificator dispone de aplicaciones para Android e iOS. En la aplicación puede introducirse la clave secreta o capturar el código QR. Además Google authenticator facilita unos códigos de emergencia por si perdemos el generador de códigos o la clave secreta.

Activar Google Authenticator

Para activar el módulo PAM para que se requiera el código de verificación al iniciar sesión en Secure Shell hay que añadir la siguiente línea en el archivo /etc/pam.d/sshd:

auth required pam_google_authenticator.so

A continuación se activa en la configuración de Secure Shell. Para ello hay que cambiar la opción ChallengeResponseAuthentication de no a yes.

Reiniciamos Secure Shell con:

~$ sudo service ssh restart

Y la próxima vez que se conecte el usuario , tras introducir la contraseña, se solicitará el código de verificación.

rtl8188 (0bda:0179 Realtek Semiconductor Corp), el adaptador WiFi maldito.

Si has llegado aquí es porque tienes la mala suerte de haber adquirido un adaptador WiFi con el chip rtl8188, y como temías no funciona con Raspberry Pi.

Yo también tuve la desgracia de comprar este adaptador. Así que estamos en la tesitura de tirar el aparato a la basura, y comprar otro, o iniciarnos en el maravilloso mundo de la instalación de controladores en Linux. Recomiendo lo primero, pero como me gustan las aventuras explicaré como instalar y configurar adaptadores basados en rtl8188.

Para empezar es necesario conocer la versión de kernel instalada en la RPi:

~$ uname -a
Linux Erebus 3.12.26+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l GNU/Linux

3.12.26+ es la versión, y si tienes ésta o una inferior estás de suerte. Puede descargarse de aquí. Si no, hay que compilarlo.

Son necesarios el código y los headers. Para empez… es coña, voy a intentar publicar los drivers para futuras versiones del kernel en este blog. Más adelante explicaré como compilarlos.

Los archivos pueden descargarse de aquí.

En el interior de cada contenedor hay dos archivos: rtl8188eufw.bin y 8188eu.ko.

El firmware rtl8188eufw.bin se instala con:

~$ sudo cp rtl8188eufw.bin /lib/firmware/rtlwifi

Y el controlador 8188eu.ko se instala y se carga en el kernel con:

~$ sudo install -p -m 644 8188eu.ko /lib/modules/3.12.28+/kernel/drivers/net/wireless
~$ sudo insmod /lib/modules/3.12.28+/kernel/drivers/net/wireless/8188eu.ko
~$ sudo depmod -a/code>

Para que funcione hay que reiniciar la RPi. Para compribar que funciona puede usarse ifconfig o iwlist wlan0 scan.

Ahora sólo queda conectarlo al punto de acceso WiFi, pero eso ya es otra historia…

Crear un nuevo usuario en Debian

Para crear un usuario en Debian se utilizan dos comandos. El primero crea el usuario, su carpeta y incluye en grupos adiconales:

~$ useradd -m -G grupo1[, grupo2, grupo3, ...] nombre

La opción -m crea a carpeta de usuario dentro del directorio /home. La opción -G incluye al nuevo usuario en los grupos indicados separados por comas, la opción mas común es añadir el usuario al grupo sudoers:

~$ useradd -m -G sudo jorge

Para terminal hay que asignar una contraseña al usuario con el comando:

~$ passwd usuario

A continuación se pregunta la contraseña y se pide su confirmación.

Bonjour (Zeroconf) en Microsoft Windows

Investigando sobre Avahi, y tras una pequeña confusión con netbios, he aprendido que Microsoft Windows no entiende de mDNS, DNS-SD ni cosas de esas. Parece ser que necesita Bonjour, la implementación de Zeroconf de Apple.

Apple no ofrece Bonjour por separado, viene empaquetado con iTunes, Quicktime, iCloud, dos kilos de hormigón, una piedra en el riñón y una vaca muerta. Para instalar sólo Bonjour descargad iTunes, y en vez de ejecutar el instalador abridlo con 7zip o WinRAR. En su interior están los instaladores de la piedra en el riñón, la vaca muerta y Bonjour (bonjour.msi o bonjour64.msi), extraedlo e instaladlo.

En el caso de no querer descargar los ~150 MB de iTunes aquí dejo los instaladores de Bonjour para 32 y 64 bits.

  • Bonjour 32 bits: Bonjour.msi - 2,55 MB - MD5 e14a6762e68472c648ea0eea0ebe01a0

  • Bonjour 64 bits: Bonjour64.msi - 2,56 MB - MD5 8dcf5c9eaacdaf4568220d103f393dea

Más sobre Avahi

¿Y qué pasa si no puede instalarse en el dispositivo?

Es posible que en el dispositivo al que quiere accederse no sea posible instalar Avahi o Bonjour, por ejemplo un router. Se puede difundir el nombre e IP del ese equipo mediante mDNS a través de un tercer equipo que si tenga Avahi instalado. Esto es, el equipo A difunde el nombre e IP en nombre del equipo B.

Para esto es necesario añadir el nombre e IP del equipo en el archivo /etc/avahi/hosts de la misma forma que se haría en el archivo hosts del sistema operativo.

~$ echo "192.168.0.1 router.local" >> /etc/avahi/hosts

Y reiniciar avahi-daemon:

~$ service avahi-daemon restart