Cómo conectarte a una red wifi desde la terminal en Linux

Publicado el 22 marzo 2016 por Drassill
Hoy os vengo con un uso ligeramente distinto al habitual de las redes inalámbricas; generalmente cuando queremos conectarnos a una red wifi lo hacemos mediante una interfaz gráfica y la ayuda de recursos tales como Network Manager, pero a veces carecemos de dicha interfaz; ya sea porque el equipo tiene muy pocos recursos o porque directamente no se quieren añadir funcionalidades innecesarias al equipo, ya que generalmente se usará más como servidor que como equipo orientado al usuario final. Es por eso que en ocasiones como ésta, es necesario buscar alternativas al entorno gráfico, alternativas que pueden ser desde muy sencillas y orientadas a conectarse siempre a la misma red inalámbrica a recursos un poco más laboriosos pero que están orientados a adaptarse a todo tipo de redes. En el articulo de hoy veremos ambas opciones, pudiendo seleccionar cualquiera de ellas dependiendo de nuestras necesidades.

Método "laborioso" pero flexible
Comencemos con el método de conexión más versátil de todos, aquel que generalmente más usaremos y que nos permitirá conectaros a cualquier Wifi a la que tengamos acceso (de forma normal, es decir sin "forzar" ninguna contraseña ni recurrir a métodos ilícitos) con la misma flexibilidad que nos ofrecería Network Manager. Para ello se combinan tres herramientas que está instaladas por defecto en el sistema: ifconfig, dhclient, iwlist y iwconfig; las dos últimas solamente podrían usarse en caso de tener instalada alguna tarjeta de red inalámbrica, pero en nuestro caso esto se daría por hecho pues en caso contrario el post carecería de sentido.
Lo primero que tendríamos que hacer sería habilitar nuestra interfaz inalámbrica, la cual probablemente se encuentre por defecto inhabilitada. Esto es tan sencillo como hacer:
ifconfig wlan0 up
En caso de no funcionaros el comando habría que revisar si poseemos los drivers adecuados instalados; una buena forma de comprobar si nuestro sistema detecta adecuadamente nuestros elementos de red; ya sean ethernet o Wifi, sería consultando el fichero /etc/udev/rules.d/70-persistent-net.rules; en caso de aparecer NAME="wlan0", el sistema estaría detectando correctamente la interfaz de red. Con la interfaz de red activa, tendríamos que analizar qué redes tenemos cerca de nuestro equipo, comprobando su ESSID, el cifrado usado, la calidad de la señal, etc... El comando para realizar dicho análisis sería:
iwlist wlan0 scan
El ESSID sería el nombre al que haríamos referencia cuando queremos conectarnos a una red inalámbrica; nombre que dependiendo de si el router ha sido configurado o no, puede tener un nombre intuitivo, o puede tener un nombre como WLAN_... He de suponer que nos conectaremos a una red con una contraseña cifrada (hacer lo contrario sería una imprudencia), con lo que emularemos una conexión a una red en la que es necesario introducir la contraseña.
Supongamos que hemos detectado una red con el ESSID PRIVADO y con la contraseña N03ntr3s3nm1f1f1; para conectarnos a dicha red tendríamos que escribir:
iwconfig wlan0 essid PRIVADO key N03ntr3s3nm1w1f1
Por último, aunque estemos conectados a la red inalámbrica en cuestión, tenemos que solicitarle una ip válida que nos permita navegar y comunicarnos con el resto de elementos de dicha red; es por ello que es necesario usar la herramienta dhclient.
dhclient wlan0
Si somos muy vagos y no queremos hacer el proceso a mano, podemos intentar sintetizar todo lo que hemos visto dentro de un script; un script que dependiendo de nuestro nivel de vagancia, puede ser más completo o no. Una opción podría ser ésta:
  1. #!/bin/bash
  2. ifconfig wlan0 up
  3. iwlist wlan0 scan > /tmp/ESSID.txt
  4. echo "Escoja un ESSID por favor:"
  5. cat /tmp/ESSID.txt |grep 'ESSID'
  6. read SELECCION
  7. echo "Introduzca la password"
  8. read CONTRASENA
  9. iwconfig wlan0 essid ${SELECCION} key ${CONTRASENA} 2&>1 > /dev/null
  10. if [ $? -eq 0 ];
  11. then
  12.         dhclient wlan0 2&>1 > /dev/null
  13.         if [ $? -eq 0];
  14.         then
  15.                 echo "CONEXION EXITOSA"
  16.         else
  17.                 echo "Se ha conectado a la wifi, pero no ha recibido ip"
  18.         fi
  19. else
  20.         echo "No ha podido establecerse la conexion con: ${SELECCION}. Revise los parametros introducidos"
  21. fi
  22. rm/tmp/ESSID.txt

Método sencillo pero orientado a conectase siempre a la misma red
Si en cambio queremos tener todo más orientado a conectarnos siempre a la misma red inalámbrica y queremos optar por alternativas todavía más sencillas que la anterior (aún con el script), podemos optar por usar una herramienta muy útil llamada wpasupplicant, herramienta que si bien no está instalada por defecto en el sistema como ocurría con la alternativa anterior, es muy útil en entornos domésticos o "fijos" en los que sabemos que siempre vamos a conectarnos a la misma red y no queremos ser preguntados por el sistema cada vez que nos queramos conectar a dicha red. Para ello lo primero que necesitaríamos hacer sería instalar la herramienta en cuestión, la cual afortunadamente se encuentra en los repositorios del sistema con lo que simplemente habría que escribir:
apt-get install wpasupplicant
La instalación apenas dura unos segundos, tras los cuales podemos prepararlo todo para que conectarnos automáticamente. Esto lo lograremos gracias al comando wpa_passphrasse, que nos creará una salida de datos que habría que volcar en un fichero de configuración llamado wpa_supplicant.conf, alojado en /etc/wpa_supplicant; usando como base el anterior ESSID y la anterior contraseña, podríamos crear el siguiente ejemplo:
wpa_passphrase PRIVADO N03ntr3s3nm1w1f1 >/etc/wpa_supplicant/wpa_supplicant.conf
Al tener dhclient instalado por defecto en el equipo, y como éste por defecto comprueba la existencia de un fichero wpa_supplicant.conf; durante cada arranque se conectaría automáticamente a la red inalámbrica en caso de que ésta fuese alcanzable; si deseasemos conectarnos manualmente a la red inalámbrica mediante wpa_supplicant, podríamos ejecutar este comando:
wpa_supplicant -B-i wlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf
Podríamos también usar como base el script anterior para hacer que en caso de realizarse una conexión exitosa con una wifi en concreto, tengamos la opción de guardar el ESSID y sus credenciales; algo que quedaría así:
  1. #!/bin/bash
  2. ifconfig wlan0 up
  3. iwlist wlan0 scan > /tmp/ESSID.txt
  4. echo "Escoja un ESSID por favor:"
  5. cat /tmp/ESSID.txt |grep 'ESSID'
  6. read SELECCION
  7. echo "Introduzca la password"
  8. read CONTRASENA
  9. iwconfig wlan0 essid ${SELECCION} key ${CONTRASENA} 2&>1 > /dev/null
  10. if [ $? -eq 0 ];
  11. then
  12.         dhclient wlan0 2&>1 > /dev/null
  13.         if [ $? -eq 0];
  14.         then
  15.                 echo "CONEXION EXITOSA. Desea guardar las credenciales usadas para futuras conexiones?[s/n]"
  16.                 read RESPUESTA
  17.                 if [ "$RESPUESTA" == "s" ];
  18.                 then
  19.                         wpa_passphrase ${SELECCION} ${CONTRASENA} >> /etc/wpa_supplicant/wpa_supplicant.conf
  20.                         echo "Credenciales guardadas en el equipo"
  21.                 else
  22.                         echo "Has seleccionado NO"
  23.                 fi
  24.         else
  25.                 echo "Se ha conectado a la wifi, pero no ha recibido ip"
  26.         fi
  27. else
  28.         echo "No ha podido establecerse la conexion con: ${SELECCION}. Revise los parametros introducidos"
  29. fi
  30. rm /tmp/ESSID.txt

Con esto tendríamos una solución que combinaría la flexibilidad de iwlist junto con la comodidad de wpa supplicant. Estos scripts han sido testeados en Debian y Ubuntu pero no tendriais que tener problemas en el resto de distribuciones.
Espero que os haya resultado útil.
Saludos.