Nuevos capítulos sobre Bash en Linux

Esta semana he publicado dos nuevos artículos en Gulvi.com sobre sobre Bash:

Y una nueva entrega del curso de programación en Bash:

Incluir otros ficheros en BASH / Programación en BASH

Con un poco de suerte la semana que viene publicaré también algunos vídeos del curso.

Linux: ¿Qué sistema operativo usan los ordenadores de mi red?

Hace unos días vimos cómo saber qué ordenadores estaban conectados a nuestra red local. Es una forma de saber si tenemos intrusos en nuestra red y es conveniente comprobarlo cada cierto tiempo (sobre todo si tenemos una red wifi).

Una vez tengamos el listado de los equipos conectados, si vemos alguno que no debería estar debemos empezar a actuar. Normalmente podemos echar a los que se han conectado a nuestro wifi cambiando la clave del router y reiniciándolo, usando WPA en lugar de WEP para mayor seguridad o filtrando por MAC (ojo, que las direcciones MAC se pueden falsear).

Averiguar el sistema operativo con nmap

Una vez tenemos localizada la posible IP intrusa (supongamos que es la 192.168.1.101) bastaría con hacer:

sudo nmap -O 192.168.1.101

Esto nos dará una información que puede ser similar a ésta:

Host is up (0.0093s latency).
Not shown: 996 closed ports
PORT     STATE    SERVICE
21/tcp   filtered ftp
23/tcp   filtered telnet
25/tcp   filtered smtp
3971/tcp open     lanrevserver
MAC Address: 00:22:F7:26:39:9D (Conceptronic)
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.13 - 2.6.32
Network Distance: 1 hop

Vemos que ha habido suerte y ya tenemos el sistema operativo aproximado que usa el ordenador en cuestión.

Una anécdota

Os voy a contar un caso curioso que me sucedió hace un tiempo. En una red descubrieron que había conectado un equipo que no tenían identificado. Dicho equipo estaba conectado no a través de Wifi sino de cable. Gracias al nmap descubrieron que el misterioso ordenador funcionaba con alguna versión de Linux. El problema es que ellos, salvo el router, usaban MS Windows en todos los equipos.

Se dispararon todas las alarmas y empezó la caza del intruso. Hicieron un inventario de todos los equipos con sus IP, se comprobaron todos los ordenadores por si alguno tenía alguna máquina virtual instalada, e incluso revisaron todo el cableado por si alguien había instalado algún dispositivo “extraño” oculto.

Cuando estaban en medio de la investigación me avisaron a ver si se me ocurría algo. Al final resultó que en el almacén tenían otro router del que nadie se acordaba (al almacén no entraba nadie de la oficina) y esa era la misteriosa máquina con Linux.

Arrancar un programa al inicio en Linux Mint (Cinnamon)

Hace un tiempo expliqué cómo iniciar un programa automáticamente al entrar en Ubuntu. El sistema es parecido en Linux Mint (Cinnamon):

1) Entramos en Menú -> Preferencias -> Aplicaciones al inicio (Startup Applications):

Configuración de aplicaciones que se inician automáticamente en Linux Mint

Listado de aplicaciones que se cargan al inicio

2) Click en el botón Add (o Añadir):

Añadir aplicación para el inicio automático

Añadir aplicación para el inicio automático

En el campo “Nombre” escribimos el nombre que queremos que aparezca en el listado anterior. En el campo “Comando” debemos poner la ruta al programa que queremos ejecutar (lo más habitual es que esté en los directorios /bin, /usr/bin o /usr/local/bin).

Linux: ¿mi sistema operativo es de 32 bits o de 64 bits?

En múltiples ocasiones nos encontraremos con esta duda. Hay varias formas de saberlo, por ejemplo, en Ubuntu podemos hacerlo yendo a Configuración del sistema -> Sistema -> Hardware. Allí se nos especifica el tipo de sistema operativo (32 bits o 64 bits).

En Linux Mint (Cinnamon) sería muy parecido. Deberíamos ir a Menu -> Icono “Preferencias de sistema” -> en la sección “Hardware” buscamos “Información de sistema”. Allí, en “Información de la distribución” veremos si se trata de la versión de 32bits (i686) o la de 64 bits (x86-64).

Determinar si nuestro kernel es de 32 bits o 64 bits desde consola

Si estamos en un sistema que no incluye ninguna opción en el entorno gráfico para saber el tipo de kernel (o no tenemos entorno gráfico) podemos hacerlo también desde un terminal o consola.

Bastaría con teclear:

uname -a

Y tendremos un resultado similar a éste:

Linux dellgorka 3.11.0-14-generic #21-Ubuntu SMP Tue Nov 12 17:07:40 UTC 2013 i686 i686 i686 GNU/Linux

Si en el resultado vemos que pone, como en este caso, i686 esto significa que tenemos un sistema operativo de 32 bits. Si, por el contrario, indicase x86_64 se trataría de uno de 64 bits.

También podemos usar:

uname -m

que mostará únicamente:

i686

en un sistema operativo de 32 bits o x86_64 en uno de 64 bits.

Procesador de 64 bits y sistema operativo de 32 bits

Es importante destacar que nuestro procesador puede ser de 64 bits y nuestro sistema operativo, en cambio, de 32 bits. Por eso, lo que nos interesa es saber los bits del sistema operativo y no del procesador.

Linux: ¿Cómo puedo saber qué máquinas hay conectadas en mi red local?

La forma sencilla de averiguarlo es entrando en el panel de control del router y buscar una pesataña o un lugar donde diga “Attached devices”, “Dispositivos conectados” o algo similar.

En muchos casos es posible que no tengamos acceso al router por lo que habría que buscar otras formas.

Detectar ordenadores en mi red local desde la consola

El primer paso es saber qué formato tienen las IP de nuestra red. Abrimos una consola y tecleamos:

$ ifconfig

que mostrará algo como:

eth1      Link encap:Ethernet  HWaddr 00:24:2b:a5:7d:b3  
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::224:2bff:fea5:7db3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:23155 errors:0 dropped:0 overruns:0 frame:235583
          TX packets:17955 errors:19 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:17069467 (17.0 MB)  TX bytes:2957881 (2.9 MB)
          Interrupt:19

Aquí vemos que la red tiene un formato 192.168.1.X y que la IP de broadcast (para buscar todos los equipos) es 192.168.1.255 (es la que viene justo detrás de Bcast:).

así que con estos datos podemos hacer:

$ ping -b 192.168.1.255

Este método no siempre funciona porque, por ejemplo, algunos equipos no responden a los pings. En mi red local no responde ninguno.

Detectar ordenadores con nmap

Si no te ha funcionado el anterior método no desesperes, hay otra forma. En la consola teclea:

sudo nmap -sP 192.168.1.1-254

nmap mostrará un resultado similar a éste:

Nmap scan report for 192.168.1.1
Host is up (0.0022s latency).
MAC Address: C1:3D:C7:82:38:AD (Netgear)
Nmap scan report for 192.168.1.101
Host is up (0.0026s latency).
MAC Address: 00:22:F7:26:39:9D (Conceptronic)
...
Nmap scan report for 192.168.1.108
Host is up (0.14s latency).
MAC Address: 44:33:4C:60:06:DA (Unknown)
Nmap scan report for 192.168.1.120
Host is up (0.030s latency).
MAC Address: B8:27:EB:D8:7E:37 (Raspberry Pi Foundation)

(sí, hay una Raspberry Pi en mi red).

Podemos ver que por cada dispositivo tenemos esta información:

Nmap scan report for 192.168.1.101
Host is up (0.0026s latency).
MAC Address: 00:22:F7:26:39:9D (Conceptronic)

Aquí tenemos la IP del dispositivo, su MAC y algo de información adicional (lo que aparece en el paréntesis).

Nota: Si no hubiésemos sacado el listado con sudo no tendríamos las direcciones MAC.

¿Cómo averiguar el modelo de mi cámara USB en Linux?

¿No te ha ocurrido nunca que has echado mano a una cámara web o algún otro aparato cuyo modelo desconoces? Muchos fabricantes tienen la costumbre de no poner una etiqueta con el modelo del aparato y, en ocasiones, podemos volvernos locos identificándolo. En este artículo os cuento un par de métodos para localizar el modelo.

Buscar información del dispositivo con lsusb

Bastaría con abrir una consola y teclear:

lsusb

Este comando nos mostrará los dispositivos USB localizados. Tan sólo debemos buscar el nuestro en la lista. Si no consigues identificar cuál es puedes probar a desconectarlo y volver a teclear lsusb. El que haya desaparecido de la lista será el que buscamos.

El listado de lsusb tendrá un aspecto similar a éste:

gorka@dellgorka:~$ lsusb
Bus 002 Device 007: ID 046d:082b Logitech, Inc. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 004: ID 413c:3012 Dell Computer Corp. Optical Wheel Mouse
Bus 005 Device 002: ID 046d:c31d Logitech, Inc. Media Keyboard K200
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

En mi caso el que yo estoy buscando es el primero. Ahora tan sólo tendría que buscar en Internet por el ID, que en este caso es: 046d:082b.

Una búsqueda rápida y ¡voilá! veo que es la cámara Logitech C170. Por cierto, en este sitio suelo encontrar muchos dispositivos.

Buscar información del dispositivo con dmesg

Otra forma de hacerlo es con dmesg. Enchufamos el dispositivo a analizar, abrimos una consola y tecleamos:

dmesg | tail

NOTA: Como dmesg puede mostar un listado enorme usamos el comando tail. tail es un comando que permite mostrar las últimas líneas de un fichero.

El resultado será similar a éste:

[40327.849750] usb 2-4: New USB device found, idVendor=046d, idProduct=082b
[40327.849760] usb 2-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[40327.849767] usb 2-4: Product: Webcam C170
[40327.849773] usb 2-4: Manufacturer:  
[40328.577443] Linux video capture interface: v2.00
[40328.679924] uvcvideo: Found UVC 1.00 device Webcam C170 (046d:082b)
[40328.685648] input: Webcam C170 as /devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0/input/input15
[40328.685859] usbcore: registered new interface driver uvcvideo
[40328.685862] USB Video Class driver (1.1.1)
[40328.727155] usbcore: registered new interface driver snd-usb-audio

Aquí puedo ver que sí lo ha detectado correctamente y hasta me indica el modelo de la cámara:

[40327.849767] usb 2-4: Product: Webcam C170

Escribir una imagen (iso) en una memoria SD en Linux

Si tienes que grabar una imagen (por ejemplo de la Raspberri Pi) en una tarjeta SD o en USB no basta con copiarla directamente en la tarjeta, debemos usar un programa para volcado de imágenes iso.

Uno que uso yo muy sencillito es USB-Imagewriter.

Si no lo tenemos instalado basta con abrir una consola y teclear:

sudo apt-get install usb-imagewriter

Una vez instalado abrimos el programa con el siguiente comando:

sudo imagewriter

También podemos abrirlo a través del menú (suele estar en Aplicaciones->Imagewriter) .

Imagewriter

Imagewriter

1) Seleccionamos la imagen con el desplegable junto a “Escribir imagen”.

2) Seleccionamos el dispositivo USB o SD en el que la vamos a escribir pinchando en el desplegable junto a “a”.

3) Click en “Escribir al dispositivo”.

4) Esperar a que termine y listo.

Kiki un sencillo programa para probar expresiones regulares

Kiki es un programa (con un curioso nombre) que nos permite probar de manera rápida y sencilla expresiones regulares. Puede ser de mucha ayuda cuando estás diseñando tu propia expresión regular.

Por ejemplo, si estás buscando una expresión regular para comprobar si un email es válido puede venirte muy bien.

En este caso vamos a probar la expresión:

[A-Za-z0-9_\.]+@[A-Za-z0-9_\.]+\.[A-Za-z]+

y vamos a usar estos emails para el test:

nombre.apellido@correo.com
nombre_2013@correofalso.es
minombre1234@fakeemail.net
nombre@mail.correo.es

Una vez introducidos los datos hacemos click en el botón Evaluate y tendremos el resultado de la operación.

Os dejo un para de capturas de pantalla para que veáis cómo funciona:

kiki - probar expresiones regulares

kiki – probar expresiones regulares

kiki - probar expresiones regulares

kiki – resultado de la prueba

Zenity (I): Interfaz gráfica en bash – Ejemplo de diálogo de selección de fichero

Zenity nos permite añadir diálogos gráficos a nuestros scripts bash. Tienen diversos tipos de diálogos: mensajes de mensajes (de error, información o alerta), diálogos para selección de fichero, para entrada de texto, etc.

Viene instalada por defecto en algunas distribuciones de Linux (imagino que será en las basadas en Gnome), por ahora lo he comprobado en Ubuntu 12.04 y Linux Mint Mate.

Aquí os dejo un ejemplo del uso de diálogos de selección. Este script permite al usuario elegir una serie de ficheros que serán añadidos a un fichero comprimido:

#!/bin/bash
 
# Pedimos al usuario que seleccione los archivos a comprimir
archivos=$(zenity --file-selection --multiple --filename=/home/gorka --title="Selecciona archivos para comprimir")
 
case $? in
         0)
		# Esta opción se ejecuta cuando se han seleccionado ficheros                
		zenity --info --text "Archivo(s) $archivos seleccionado(s)"
 
		;;
         1)
                zenity --error --text "No has seleccionado ningún archivo"
		exit
		;;
        -1)
                echo "Ha ocurrido un error inesperado."
		exit				
;;
esac
 
# Si se han seleccionado varios archivos tenemos que reemplazar | por un espacio
archivos=${archivos//|/ }
 
# Ahora pedimos al usuario que indique el nombre del fichero comprimido
nombre_fichero=$(zenity --file-selection --save --title="Nombre del fichero comprimido")
 
case $? in
         0)
                # Comprimimos los archivos
		tar -cf $nombre_fichero.tar $archivos
		gzip $nombre_fichero.tar
 
		;;
         1)
                zenity --error --text "No has seleccionado ningún directorio"
		exit
		;;
        -1)
                echo "Ha ocurrido un error inesperado."
		exit				
;;
esac

Notas

  • La opción –multiple permite al usuario seleccionar varios archivos. Si no la ponemos el usuario sólo podrá escoger un único fichero.
  • La opción –save se usa para poner el diálogo en “modo grabar”. Esto permitirá crear el fichero si no existe.
  • Si el usuario selecciona varios ficheros en el primer diálogo éste nos va a devolver una cadena con la lista de archivos seleccionados separados por un ‘|’. Debemos cambiar este símbolo por espacios. Esto lo hacemos con archivos=${archivos//|/ }

Probar el script

Para probar este ejemplo guardar el código anterior en un fichero llamado, por ejemplo, prueba_zenity.

Después tenemos que convertir el script en ejecutable. Para eso abre una consola y teclea:

$ chmod +x prueba_zenity

y ya podemos usarlo:

$ ./prueba_zenity

Screenshots en Linux Mint y Ubuntu con gnome-screenshot

Seguramente ya sabrás cómo hacer capturas de pantalla en Ubuntu o en Linux Mint (o distribuciones Linux similares). Algo que mucha gente desconoce es que se pueden hacer capturas de pantalla con algo más de control. Si tu gestor de ventanas está basado en Gnome puedes probar lo siguiente:

1) Abre una consola.

2) Teclea:

gnome-screenshot --interactive

Y verás una ventana que te ofrece varias opciones para tener más control en tus capturas.