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.

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.

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

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

Setencias MySQL directamente desde la terminal

Hoy he descubierto un modo interesante, y sobretodo ágil para ejecutar sentencias de MySQL directamente en la terminal de comandos del SSOO, sin tener que estar dentro del propio sistemas de gestión de BBDD.

La sentencia en concreto sería:

[root@host01:~]# mysql -umiusuario -pmipassword -e 'select * from mi_tabla where fecha > "2009-09-17 17:00:00";' mi_base_de_datos

donde:

  • -u: indica el usuario de acceso a la BBDD.
  • -p: indica la password de acceso a la BBDD.

El único problema que le veo a esto, es que en el histórico se quedan almacenados tanto el usuario como la password de la BBDD, lo cuál puede ser un agujero de seguridad…

Para evitar que en el histórico se quede almacenada la password de la BBDD, es posible no indicar la password en el propio comando y que el propio MySQL la pida posteriormente de esta forma:

[root@host01:~]# mysql -umiusuario -p -e 'select * from mi_tabla where fecha > "2009-09-17 17:00:00";' mi_base_de_datos

El problema es que este comando no nos valdrá para usarlo en scripts.

Logear mensajes personales en el /var/log/messages

Para logear mensajes personales en el fichero /var/log/messages puedes usar la herramienta logger de unix.

Un ejemplo sencillo sería:

logger Esto es una prueba cutrecilla

y podrías observar el resultado así:

tail -20 /var/log/messages

Puedes incluso poner más información (Esto tiene que ser incluído en el código de un bash script):

logger -t `basename $0` i am still testing

Fuente

Trucos sobre el comando history de Unix

A veces nos interesa poder eliminar todos los registros que quedan almacenados en el history del usuario, para ello existen los siguientes comandos:

Borrar el history:

history -c

Existe otro modo (más cutre, y que sólo elimina el histórico de sesiones antiguas, y no de la actual…):

cat /dev/null > ~/.bash_history

Si sólo queremos que no se almacenen los comandos de la sesión actual, basta con utilizar los siguientes comandos:

unset HISTFILE
unset SAVEHISE

Otra opción, más drástica, es evitar que se genere el fichero donde se almacenen los comandos. Esto se haría así:

ln -s /dev/null ~/.bash_history

ngrep (Network GREP)

Ngrep es un grep para el tráfico de red, es una utilidad que puede ser usada para encontrar los patrones de búsqueda en la capa de red.

Para instalarla:

  1. Ir a http://ngrep.sourceforge.net/ y descargar los binarios del programa.
  2. Descomprimimos: bzip2 -cd ngrep-1.45.tar.bz2 | tar -xv
  3. configuramos el ejecutable: ./configure
  4. make
  5. Instalamos: make install (Para ejecutar este paso tienes que ser usuario root). El programa se habrá instalado en el directorio /usr/local/bin y el manual en el directorio/usr/local/man.

Ejemplos:

ngrep '' udp (print all UDP packets)
ngrep '' icmp (print all ICMP packets)
ngrep '' port 53 (print TCP or UDP port 53 packets)
ngrep '' tcp port 23 (print TCP port 23 packets)
ngrep 'LILWORD' port 138 (print Microsoft browsing traffic for NT domain LILWORLD)
ngrep -iq 'rcpt to|mail from' tcp port 25 (monitor current delivery and print sender and recipients)
ngrep 'user' port 110 (monitor POP3)
ngrep -q 'abcd' icmp (Microsoft operating systems fill the ICMP payload with the alphabet; is the "pinging" host running a Microsoft operating system?)
ngrep -iq 'user-agent' tcp port 80 (determine client application that client host is running)
ngrep '220' port 21 (determine version of FTP server)
ngrep 'SSH' port 22 (investigate Secure Shell)
ngrep -v '' port 23 (see all traffic but telnet)
ngrep -d le0 '' (listen to le0)
ngrep -x ssword
ngrep -e -x host 192.168.1.10
ngrep -d wlan0 -n 3
ngrep -wi -d wlan0 'user|pass' port 6667
ngrep -q -wi 'user|pass'
ngrep -q -W byline port 8000 -n 5

Fuente en InformIT.

Aprendiendo a usar rsync

rsync es una aplicación del mundo Unix que permite sincronizar ficheros entre máquinas.

Un ejemplo de su uso sería el siguiente:

rsync -avrP --times --perms --links --exclude "*~" /ruta/a/documentos usuario@servidor:documentos

donde:

  • rsync: el programa que va a hacerse cargo del respaldo.
  • avrP: son las opciones: a significa “modo de archivo”, v por “verbose” (o sea, que verás en la terminal toda la información relevante sobre el proceso), r es por “recursivo” (respaldará el directorio ~/documentos y todo lo que esté dentro de él, incluyendo directorios) y P es para permitir la transfrerencia parcial de archivos (muy útil si se transfieren archivos muy grandes; si se llegara a cortar la conexión, retomará donde quedó, no desde el principio).
  • –times: Indica a rsync que envíe la fecha de modificación del fichero, de modo que se detecten actual¡zaciones de éstos y se sincronicen correctamente.
  • –perms: Para que se sincronicen también los permisos.
  • –links: Para que se sincronicen los links.
  • –exclude «*~»: con esto conseguimos que no sincronice los ficheros de backup.
  • /ruta/a/documentos es el directorio local que quieres sincronizar.
  • usuario@servidor:documentos es la información del servidor remoto donde se sincronizarán los ficheros.

Para poder utilizar esto de forma automática, sería necesario tener las llaves de SSH preparados para un login automático.