Cómo resolver nombre de máquinas Linux (Ubuntu) en una red local

En casa tengo una red local con varios PCs y algunas máquinas virtuales, principalmente con Windows y Linux. En el CPE tengo configurado DHCP para asignación de IPs. Pura comodidad.

Para poder conectarme de una máquina a otra conociendo sólo el hostname es necesario que haya una resolución del hostname. En mi caso, me encontré con el siguiente escenario:

  • Máquina Windows resuelve hostname de otra máquina Windows.
  • Máquina Windows no resuelve hostname de una máquina Linux.
  • Máquina Linux no resuelve hostname de una máquina Windows.
  • Máquina Linux no resuelve hostname de una máquina Linux.

Para poder dar resolución de hostnames en la red, tuve que hacer lo siguiente:

1. Cómo hacer que máquina Windows resuelva hostname de máquina Linux (Ubuntu)

En este caso la solución es instalar el paquete winbind en la máquina Linux (destino), para que utilice el protocolo NetBIOS de Windows y publique su resolución de nombres.

sudo apt-get install winbind

Una vez instalado, el fichero /etc/nsswitch.conf habrá añadido la palabra wins en la entrada de hosts. El fichero tendrá una pinta así:

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files wins dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Con esto, ya deberías de poder hacer ping a la máquina Linux desde una máquina Windows y resolver correctamente su hostname.

2. Cómo hacer que máquina Linux (Ubuntu) resuelva hostname de máquina Linux (Ubuntu)

Para este tema tuve que instalar en ambas máquinas Linux el paquete avahi-daemon . Con este paquete, ya se resuelven los hostnames añadiendo el sufijo «.local».

Esto probablemente te modificará el fichero /etc/nsswitch.conf de ambas máquinas y dejará la línea de hosts así:

hosts: files wins mdns4_minimal [NOTFOUND=return] dns mdns4

Con esto, ya debes de poder resolver nombres entre máquinas Linux con el hostname estilo «.local»:

[23:04:02] yvoictra|trinity:~$ ping tesla.local
PING tesla.local (192.168.1.111) 56(84) bytes of data.
64 bytes from tesla.local (192.168.1.111): icmp_seq=1 ttl=64 time=0.455 ms
64 bytes from tesla.local (192.168.1.111): icmp_seq=2 ttl=64 time=0.524 ms
64 bytes from tesla.local (192.168.1.111): icmp_seq=3 ttl=64 time=0.489 ms
64 bytes from tesla.local (192.168.1.111): icmp_seq=4 ttl=64 time=0.499 ms

Y ahora queda poder resolver máquinas Windows desde máquinas Linux. De momento no he encontrado la manera de hacerlo… pero seguiré investigando. Cuando lo consiga actualizaré el post (Si alguien me echa un cable os lo agradeceré…).

En resumen, el tema en mi red local ha quedado:

  • Máquina Windows resuelve hostname de otra máquina Windows.
  • Máquina Windows resuelve hostname de una máquina Linux.
  • Máquina Linux no resuelve hostname de una máquina Windows.
  • Máquina Linux resuelve hostname de una máquina Linux.

¡Y esto es todo amigos!

Extraer un fichero de un paquete comprimido tar.gz

tar.gz_200pxHace poco me encontré con un fichero tar.gz de cerca de 40 Gb que tenía comprimidos un montón de ficheros de log. El caso es que sólo me interesaba un fichero de todos los que tenía el paquete, pero normalmente suelo descomprimir todo el contenido del tar.gz (tar xvzf fichero.tgz).

En este caso descomprimir los 40Gb puede ser inasumible por la cantidad de espacio que puede llegar a ocupar todo eso sin comprimir.

Lo que hice para poder extraer un único fichero fue:

1. Localizar el fichero a extraer

Con el comando tar tzf se muestra un listado de los ficheros que contiene el fichero tar.gz.

# tar tzf trinity-15-03-09.tar.gz 
trinity_20150309000036_54133_15-03-09_00
trinity_20150309000041_54134_15-03-09_00
trinity_20150309000152_54135_15-03-09_00
trinity_20150309000158_54136_15-03-09_00
trinity_20150309000313_54137_15-03-09_00
trinity_20150309000320_54138_15-03-09_00
trinity_20150309000434_54139_15-03-09_00
trinity_20150309000443_54140_15-03-09_00
trinity_20150309000556_54141_15-03-09_00
trinity_20150309000606_54142_15-03-09_00
trinity_20150309000718_54143_15-03-09_00
trinity_20150309000730_54144_15-03-09_00
trinity_20150309000839_54145_15-03-09_00
trinity_20150309000853_54146_15-03-09_00
trinity_20150309001002_54147_15-03-09_00
trinity_20150309001017_54148_15-03-09_00
trinity_20150309001126_54149_15-03-09_00
...

2. Extraer el fichero

Una vez localizado el fichero, para extraerlo habría que incluir en el programar tar la ruta en la que está comprimido. Algo de este estilo:

# tar xvzf fichero.tar.gz */ruta_al_fichero/fichero.ext

En nuestro caso, utilicé el siguiente comando:

# tar xvzf trinity-15-03-09.tar.gz trinity_20150309000718_54143_15-03-09_00

Con esto, se descomprime únicamente el fichero deseado.

Cómo cambiar el hostname del equipo a través de la shell (Ubuntu / Linux)

Prerrequisito: Utilizar el usuario root ó bien tener permisos para utilizar sudo con otro usuario.

Para cambiar el nombre de una máquina Linux (hostname) a través de la shell (CLI) hay que hacer dos cosas.

1. Editar el fichero de configuración hostname:

# sudo vi /etc/hostname

En este fichero sólo hay una palabra, que define el hostname de la máquina.

2. Editar el fichero hosts:

# sudo vi /etc/hosts

Que tendrá un aspecto similar:
change_hostname
Lo que hay que modificar es la línea de la IP 127.0.1.1, y cambiar la palabra que sigue a la IP (Que es el nombre de la máquina, en este caso trinity).

Por último, y para que surta efecto este cambio, es necesario reiniciar el sistema. Para ello haremos un reboot:

# sudo reboot

¡Y listo!

Cómo activar sudo en Ubuntu

Lo primero. ¿Qué es sudo? Y no, no es del verbo sudar. El programa sudo es una utilidad que viene en los sistemas operativos Unix, como Linux, BSD, Mac OS ó incluso Android, que permite a un usuario ejecutar otro programa con privilegios de otro usuario (Normalmente el usuario root).

Lo típico es estar usando un sistema operativo Unix con un usuario diferente de root, para no liarla. Pero hay veces que necesitamos ejecutar programas que requieren tener permisos de root. Una opción sería cambiar al usuario root, y ejecutar lo que sea necesario… pero aquí es  donde sudo lo hace más sencillo: no hace falta iniciar sesión con el usuario root para ejecutar lo que necesites.

sudo-sandwichLa famosa tira cómida de xkcd explica claramente qué es lo que permite hacer sudo.

¿Y por qué os cuento esta peli? Pues porque Ubuntu, por defecto trae deshabilitada la opción de poder ejecutar este comando.

Para habilitarla hay dos formas de hacerlo.

Forma 1 (La más sencilla)

Este método consiste en añadir el usuario al que le queremos habilitar el sudo, dentro del grupo sudo. Esto hay que hacerlo con el usuario root.

# usermod -a -G sudo yvoictra

Con el comando id podemos comprobar si el usuario pertenece al grupo sudo. En este caso el 27.

yvoictra@trinity:~$ id
uid=1000(yvoictra) gid=1000(yvoictra) grupos=1000(yvoictra),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lpadmin),111(sambashare)

y ya se debe de poder utilizar el programa sudo.

Forma 2 (Otra sencilla)

Este método es igual que el anterior, pero con otro comando.

# gpasswd -a yvoictra sudo

Con el comando id comprobamos el cambio:

yvoictra@trinity:~$ id
uid=1000(yvoictra) gid=1000(yvoictra) grupos=1000(yvoictra),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lpadmin),111(sambashare)

y ya se debe de poder utilizar el programa sudo.

Forma 3 (La alternativa)

Otro método consiste en editar (con usuario root) el siguiente fichero:

# vi /etc/sudoers

Encontrarás una línea del siguiente aspecto:

root ALL=(ALL:ALL) ALL

Lo que hay que hacer es añadir una línea igual que la anterior, pero incluyendo el usuario con el cual quieres ejecutar sudo. En este caso, con mi usuario yvoictra:

yvoictra ALL=(ALL:ALL) ALL

Y debería de quedar algo así:

Guardas el fichero con el cambio realizado y ya se puede utilizar el programa sudo.

¡Listo! ¿Qué alternativa te ha gustado más?

Comprobar si el servicio de NTP está levantado en un servidor ajeno

Hoy he necesitado comprobar si un servidor tenía levantado el servicio de NTP. Como no tenía acceso a dicho servidor y no quería configurar un cliente para hacer la comprobación, he decidido usar una herramienta alternativa: nmap.

Con esta herramienta básicamente lo que se comprueba es que el puerto de NTP (UDP 123) esté levantado.

[16:11:55 root@danubio:~]# nmap -sU -p123 10.192.4.2

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2013-05-16 16:11 CEST
Interesting ports on 10.192.4.2:
PORT STATE SERVICE
123/udp open|filtered ntp

Nmap finished: 1 IP address (1 host up) scanned in 0.336 seconds

Con esto sólo se garantiza que hay un proceso (presumiblemente el de NTP) escuchando en ese puerto y atendiendo peticiones. Para asegurar que funciona correctamente habría que configurar el cliente.

Fuente: http://www.rgrjr.com/linux/ntp.html.

Abrir varios perfiles simultáneos de Firefox [II]

En 2009 ya descubrí uno de mis trucos favoritos del navegador Firefox, y que a día de hoy sigo utilizando. Hoy simplemente vengo a recordarlo porque probablemente muchos ni lo habréis leído, y además a explicaros la forma en la finalmente yo más utilizo: Con las opciones «-p» y «-no-remote«.

En Windows, que por suerte o desgracia es el SSOO de escritorio que más utilizo, lo que suelo hacer es:

  1. Pulsar la combinación de teclas Windows +R para conseguir la ventana de ejecutar.
  2. Ejecutar el comando: firefox -p -no-remote.

firefox_no-remote

Así consigues tener las n instancias de Firefox que quieras, cada una con el perfil que quieras. Es muy útil cuando tienes distintos perfiles (Por ejemplo el del trabajo y el personal) y quieres usarlos a la vez sin que interfieran.

Este truco es válido para todos los SSOO (Linux, MacOS…), salvo que la parte de ejecutar que se hace en Windows resulta casi más sencilla desde una consola Linux/MacOS.

 

Crear ficheros de un tamaño determinado en entornos Unix y Windows

Para crear un fichero de un tamaño determinado de bytes en entornos Unix se suele utilizar el comando dd en el que podemos definir el tamaño exacto del fichero que queremos.

# dd if=<fichero_entrada> of=<fichero_salida> bs=<tamaño_en_bytes_del_fichero> count=1

Podemos utilizar el fichero /dev/zero que contiene carácteres NULL para completar el fichero:

# dd if=/dev/zero of=prueba.txt bs=8388608 count=1

Aunque también se pueden utilizar carácteres aleatorios con /dev/urandom.

# dd if=/dev/urandom of=prueba.txt bs=8388608 count=1

Importante: el parámetro bs se expresa en bytes.

En Windows existe otro comando para conseguir ficheros de tamaño determinado, se realiza con el comando fsutil.

# fsutil file createnew <nombre_del_fichero_de_salida> <tamaño_en_bytes_del_fichero>

Ejemplo:

# C:\>fsutil file createnew prueba.txt 8388608
El archivo C:\prueba1.txt está creado

Montar un host FTP como partición de Linux

ftpHace un tiempo contraté un hosting web y a no ser que contrates algo que se va de precio, el acceso suele ser a través WEB o a través del protocolo FTP. Esto es bastante coñazo si cada vez que modificas un fichero, tienes que tener algún software cliente de FTP subiendo y bajando continuamente.

A este problema, le he encontrado 2 soluciones:

  • Usar un editor que soporte la edición vía FTP. Por ejemplo, ultraedit.
  • Crear una partición en Linux que sea montaje del servidor FTP.

En este post os voy a explicar el segundo caso. Para ello necesitamos el software curlftpfs. Si no lo tienes instalado, ejecuta:

# sudo aptitutde install curlftpfs

Esta aplicación se encarga de hacer transparente la gestión de ficheros por FTP, de modo que a nivel de usuario, es como si estuvieras manejando los ficheros en local. La única diferencia es que se nota que las acciones de abrir un fichero, o grabarlo tardan más de lo normal, ya que al realizar esa acción internamente curlftpfs está realizando un GET o un PUT vía FTP.

Al lío, para crear un punto de montaje, basta con crear un directorio donde vayamos a montar el FTP:

# mkdir /punto/de/montaje

y ahora ya podemos ejecutar:

# curlftpfs ftp://servidorftp.algo /punto/de/montaje

En caso de que el FTP tenga usuario y password:

# curlftpfs ftp://usuario:password@servidorftp.algo /punto/de/montaje

El puerto habitual de FTP es el 21, pero a veces es diferente. Esto se podría indicar así:

# curlftpfs ftp://servidorftp.algo:numeroDePuerto /punto/de/montaje

y podemos realizar una combinación de todas las opciones:

# curlftpfs ftp://usuario:password@servidorftp.algo:numeroDePuerto /punto/de/montaje

De este modo podemos visualizar, editar, borrar los ficheros de forma transparente a las transacciones FTP. Para desmontar, se ejecutaría el siguiente comando:

# sudo umount -l /punto/de/montaje

Si tenéis cualquier duda o comentario, sois bienvenidos!

Commandlinefu

Hace un tiempo descubrí la web commandlinefu.com y resulta que ahora es una de las páginas que más visito.La idea de la web es, como todas las buenas ideas, muy simple: Se trata de un portal en el que los usuarios pueden añadir comandos de Unix/Linux y éstos son votados por el resto de usuarios. Entre otras, permite las siguientes opciones:

  • Mostrar el resultado de una ejecución del comando con Show sample output.
  • Añadir comentarios al comando.
  • Añadir el comando a la lista de favoritos que puede tener cada usuario.
  • Añadir un comando alternativo que realice la misma función.
  • Indicar que el comando el malicioso.

Permite ordenar los comandos de distintas formas. Según los votos recibidos en un período de tiempo, o según la antiguedad del comando en la web. Permite variar el período de tiempo de nuestra elección de orden.

Os recomiendo que visitéis directamente los comandos más votados, donde yo he encontrado joyas como:

# mtr, better than traceroute and ping combined
mtr google.com
# Serve current directory tree at http://$HOSTNAME:8000/
python -m SimpleHTTPServer
# Runs previous command replacing foo by bar every time that foo appears
!!:gs/foo/bar

Además cuenta con una fantástica API que aparte de ser sencilla, permite acceder a los contenidos desde la propia consola:

$ curl http://www.commandlinefu.com/commands/browse/sort-by-votes/plaintext

Clientes para conexión remota (PuTTy, SecureCRT…)

En mis comienzos con el Telnet y SSH y las conexiones con máquinas remotas utilizaba PuTTy, una herramienta que me enseñó mi querido colega Roberto Andradas en alguna clase de EDI o MTP… jeje, qué tiempos.

Investigando en su momento descubrí PuTTy Tray, un interesante proyecto que ofrecía ciertas mejoras al tradicional cliente de PuTTy. Entre otras, transparencias, poder minimizar directamente al System Tray, mejorar la portabilidad, linkar desde PuTTy a un navegador las URLs…

En la actualidad, debido al inmenso número de máquinas que administro en el trabajo, tuve que hacer un cambio obligado de cliente SSH. Con PuTTy lo intenté, a través del PuTTy Session Manager, que proporciona una nueva ventana en la que se pueden visualizar de forma ordenada las sesiones guardadas, para acceder directamente a ellas.

Pero debido a que para acceder a ciertas máquinas tengo que saltar pasando por otras…. y PuTTy no ofrece generar scripts que automaticen esta tarea, al final tuve que recurrir al cliente SecureCRT, que aunque es de pago, ofrece bastantes mejoras para poder trabajar con varias terminales a la vez. Entre otras cosas, permite ejecutar scripts y comandos en varias ventanas a la vez… bastante útil cuando administras muchas máquinas.

En definitiva, cada cliente tiene sus ventajas e inconvenientes, dependiendo del uso que se le va a dar… por eso, es mejor ir probando cada uno, hasta encontrar el que realmente se ajuste a tus necesidades. A pesar de todo, yo sigo abriendo de vez en cuando mi querido PuTTy 🙂 .