Comprimir/Descomprimir ficheros en entornos UNIX

A veces es complicado saber tódos los comandos que existen para comprimir/descomprimir ficheros en entorno UNIX.

Ficheros .tar

Tar es un formato que sólo empaqueta múltiples ficheros en uno sólo, pero no comprime.

  • Empaquetar: # tar -cvf  fichero.tar ficheros
  • Desempaquetar: # tar -xvf fichero.tar
  • Ver contenido: # tar -tf fichero.tar

Ficheros .gz

  • Comprimir: # gzip -9 ficheros
  • Descomprmir: # gzip -d ficheros.gz

Ficheros .bz2

  • Comprimir: # bzip2 ficheros
  • Descomprmir: # bzip2 -d ficheros.bz2

Ficheros .tgz (ó .tar.gz) -> tar+gzip

  • Empaquetar/Comprimir: # tar -czf fichero.tgz ficheros
  • Desempaquetar/Descomprimir: # tar -xvzf fichero.tgz
  • Ver contenido: # tar -tzf fichero.tgz

Ficheros tar.bz2 -> tar+bzip

  • Empaquetar/Comprimir: # tar -c ficheros | bzip2 > fichero.tar.bz2
  • Desempaquetar/Descomprimir: # bzip2 -cd fichero.tar.bz2 | tar -xv
  • Ver contenido: # bzip2 -cd nombre.tar.bz2 | tar -t

Ficheros .zip

  • Empaquetar/Comprimir: # zip fichero.zip ficheros
  • Desempaquetar/Descomprimir: # unzip fichero.zip

Ficheros .rar

  • Empaquetar/Comprimir: # rar -a fichero.rar fichero
  • Desempaquetar/Descomprimir: # rar -x fichero.rar
  • Ver contenido: # rar -l fichero.rar
  • Ver contenido: # rar -v fichero.rar

HOWTO comunicarse entre terminales Linux

A veces es interesante el hecho de poder comunicarte con los usuarios logeados en una máquina. En el mundo Unix existen varios modos de poder hacer esto:

Método 1

Primero, tenemos que averiguar qué usuarios hay conectados en el sistema. Para ello podemos utilizar el comando who.

[00:27:51] yvoictra@goloso:~$ who
yvoictra pts/0        2008-12-31 00:17 (154.pool85-53-191.dynamic.orange.es)
yvoictra pts/1        2008-12-31 00:20 (154.pool85-53-191.dynamic.orange.es)
yvoictra pts/2        2008-12-31 00:20 (154.pool85-53-191.dynamic.orange.es)
yvoictra pts/3        2008-12-31 00:27 (154.pool85-53-191.dynamic.orange.es)

Una vez que hemos localizada la terminal a la que queremos enviar un mensaje, ejecutamos el siguiente comando:

echo "Hola!! Esto es una prueba xD" >> /dev/pts/1

de este modo, la terminal definida por /dev/pts/1 habrá recibido el mensaje en cuestión.

Método 2

Consiste en utilizar el comando write. Con el comando who podemos ver qué usuarios están conectados, y enviar un mensaje.

Por ejemplo:

echo "Hola!! Esto es una prueba xD" | write yvoictra

ó

write yvoictra
Hola
Control+C

Así, el usuario yvoictra habrá recibido el mensaje correspondiente.

Método 3

Envío Masivo de mensajes. Esta vez utilizaremos el comando wall. Con él, conseguiremos enviar a todas las sesiones abiertas un mensaje (Broadcast).

Ejemplo:

echo "Hola!! Esto es una prueba xD" | wall

También podemos combinar estos comandos para conseguir enviar palabras en ASCII:

figlet "Prueba" | wall

Que generaría la siguiente salida en todas las terminales:

Broadcast message from yvoictra (Wed Dec 31 00:44:20 2008):
 _ __  _ __ _   _  ___| |__   __ _ 
| '_ \| '__| | | |/ _ \ '_ \ / _` |
| |_) | |  | |_| |  __/ |_) | (_| |
| .__/|_|   \__,_|\___|_.__/ \__,_|
|_|                                

También podéis probar el siguiente comando:

banner "Prueba" | wall

Y para los que se arriesgan, pueden probar este comando divertido:

yes | write yvoictra

Pasar un proceso de Unix de Foreground a Background

Muchas veces me he encontrado en la necesidad de utilizar una terminal en la que se está ejecutando un proceso, y por ello finalmente no poder usarla.

La solución para esto es pasar el proceso a background, de modo que nos libera la terminal, y podemos interactuar de nuevo con la máquina.

¡Ojo! Si el proceso escupe texto, y no hemos redireccionado la salida estandar, nos saldrán los mensajes del proceso en la terminal, así que no te asustes si lo ves 😛

Para pasar el proceso a background:

  1. Pulsa Control+Z.
  2. Ejecuta el comando bg.
  3. Puedes observar el estado de tus procesos con el comando jobs.
lpr -Pps23 part[1-8].ps
^Z
Stopped
bg
[1]    lpr -Pps23 interface.ps &
jobs
[1]    Running              lpr -Pps7 interface.ps

Para volver a pasarlo a Foreground podemos usar el comando fg.

También es posible dejar un comando en background directamente al ejecutarlo, añadiendo el carácter &.

lpr -Pps23 interface.ps &

Eliminar procesos «zombies» de SSH

Hay veces que con SSH se cierran mal las conexiones, y se quedan procesos abiertos (zombies) en la máquina que tiene el demonio de SSH.

Ejemplo:

#ps -ef
calidad   7762  7761  0 Nov03 ?        00:00:00 [scp] <defunct>
root      1898  2384  0 Nov03 ?        00:00:00 sshd -i -f /etc/ssh/sshd_config
calidad   1913  1898  0 Nov03 ?        00:00:00 sshd -i -f /etc/ssh/sshd_config
calidad   1914  1913  0 Nov03 ?        00:00:00 [scp] <defunct>
root      4664  2384  0 Nov03 ?        00:00:00 sshd -i -f /etc/ssh/sshd_config
calidad   4669  4664  0 Nov03 ?        00:00:00 sshd -i -f /etc/ssh/sshd_config
calidad   4670  4669  0 Nov03 ?        00:00:00 [scp] <defunct>
root      6344  2384  0 Nov03 ?        00:00:00 sshd -i -f /etc/ssh/sshd_config
calidad   6349  6344  0 Nov03 ?        00:00:00 sshd -i -f /etc/ssh/sshd_config
calidad   6350  6349  0 Nov03 ?        00:00:00 [scp] <defunct>

Para eliminar estas sesiones que se quedan sin cerrar correctamente, se puede enviar la señal de reinicio al proceso de SSH, por cada una de las sesiones mal cerradas:

pstree -cpal | egrep [s]shd | perl -lne '($i)=(/(d+)/); `kill -1 $i`'

Con esto conseguimos que se reinicien todas las conexiones de SSH que tiene la máquina.

(Recuerda que hay que tener Perl instalado para poder ejecutar el comando anterior).

Conectar a una VPN con vpnc

vpnc es un cliente libre de redes VPN para Unix, que se usa a través de la consola. Existen otros clientes de este estilo que incluso utilizan la interfaz gráfica.

Para instalarlo utilizaremos lo siguiente:

sudo apt-get install vpnc

Que tendrá en cuenta que todas las dependencias con otras librerias están correctamente instaladas.

vpnc buscará los ficheros /etc/vpnc.conf o /etc/vpnc/default.conf, si ninguno de estos ficheros existe, al ejecutar vpnc pedirá por consola los parámetros necesarios.

Para que vpnc utilize un fichero de configuración distinto a los anteriores, tiene que utilizar se puede utilizar la siguiente orden:

sudo vpnc miconfiguracion

o

sudo vpnc miconfiguracion.conf

cuyo fichero tiene que estar en el directorio /etc/vpnc/ y necesita la extensión .conf.

El aspecto de este fichero es el siguiente:

IPSec gateway gateway
IPSec ID nombre_del_grupo
IPSec secret contraseña_del_grupo
Xauth username mi_usuario
Xauth password mi_contraseña

Para desconectar de la VPN, se usa el siguiente comando:

sudo vpnc-disconnect

Fuente.

Administrar usuarios de MySQL

Para administrar los usuarios de una base de datos de mysql, existen los siguientes comandos:

mysql> use mysql;
Database Changed
mysql> set password for 'elforum'@'localhost' = password('98m4@9er');
Query OK, 0 rows affected (0.00 sec)
mysql> set password for 'mysysad'@'localhost' = password('950v4.Kr');
Query OK, 0 rows affected (0.00 sec)

Y para mostrar los usuarios, y las passwords asociadas…

mysql> SELECT user, password FROM user;
+---------------+-------------------------------------------+
| user          | password                                  |
+---------------+-------------------------------------------+
...
| elforum |   *EAE7DE143B1B9598745AD571885A98E723ABE9056 |
| mysysad | *Ebe7D596878627EDD581EADEFSA98E723ABE9C58 |
...

Qué son los ficheros FIFO

FIFO es el acrónimo de First Input First Output (Primero que entra, primero que sale). En informática se suele utilizar para crear estructuras de datos.

Usando esta teoría, en UNIX existen una especie de ficheros que se utilizan para comunicar procesos, de modo que se puedan sincronizar e intercambiar información. El funcionamiento es bastante sencillo, un proceso se  encarga de escribir en el fichero FIFO, y otro de leer. Cada uno de los procesos se quedarán bloqueados hasta que el otro actúe.

Esto lo podemos probar del siguiente modo:

$ mkfifo /tmp/fi

Con el comando anterior, habrás creado el fichero FIFO. Puedes comprobarlo con un ls -l /tmp

$ echo Hola Mundo > /tmp/fi

El proceso que hemos lanzado, se quedará bloqueado intentando escribir hasta que haya otro proceso lea ese fichero. Para ello lanzamos este comando:

$ cat /tmp/fi
Hola Mundo

En este momento, habrán quedado ambos procesos desbloqueados.

lsof (List Open Files)

Ya hice una pequeña introducción de lsof, pero se merece una entrada completa. Se trata de una de las herramientas más útiles para administrar un sistema basado en Unix. El nombre de lsof viene de Lists Open files y nos puede dar toda la información que necesitamos acerca de los descriptores que tiene el sistema en un momento determinado. Entiéndase descriptores, tanto las conexiones de red, como descriptores de ficheros.

Los usos más interesantes son los siguientes:

  • lsof -i :80: Muestra información acerca de los procesos que están en estado LISTEN en el puerto 80.
  • lsof -iTCP: Muestra las conexiones TCP.
  • lsof  +D /home/usuario: Muestra qué procesos están utilizando el directorio /home/usuario.
  • lsof -u usuario: Muestra los descriptores de fichero abiertos por el usuario.
  • lsof -i@192.168.1.5: Muestra conexiones con una determinada IP.
  • lsof -i@192.168.1.5:2322: Muestra conexiones con una determinada IP y un determinado puerto.
  • lsof -c httpd: Muestra los ficheros y conexiones tiene abiertas un proceso determinado, dado el nombre del proceso.
  • lsof -p 12212: Muestra los descriptores de fichero asociados a un proceso, dado su PID.
  • kill -HUP `lsof -t -c sshd`: Enviaría una señal a los procesos que estén corriendo de sshd.
  • lsof +L1: Muestra los ficheros que tienen menos de un enlace apuntando a ellos. Suelen ser ficheros que un cracker intenta ocultar.

Fuente: lsof, lsof 2