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 &

Acceso directo en Windows para suspender el equipo

Para suspender el equipo con un simple doble click, podemos hacerlo del siguiente modo:

  • Con el ratón en el escritorio, apretaremos el botón derecho del ratón y del menú y seleccionamos Nuevo Acceso directo.
  • Aparecerá una pantalla con el título: Crear acceso directo.
  • En la caja de texto (Escribimos la ubicación del elemento) escribiremos rundll32.exe PowrProf.dll, SetSuspendState
  • Click en siguiente y le ponemos un nombre al acceso directo, por ejemplo, Suspender.

El acceso directo se creará en el escritorio, y cada vez que queramos suspender el equipo ejecutaremos dicho acceso directo.

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

Crear BBDD en MySQL, y dar permisos a un usuario

Para crear una base de datos en mysql se utiliza la siguiente sentencia:

mysql> CREATE DATABASE NombreBaseDeDatos;

Para dar permisos a un usuario para que use la base de datos, se utiliza el siguiente comando:

mysql> GRANT ALL ON NombreBaseDeDatos.* TO el_usuario@localhost IDENTIFIED BY "la_password";
mysql> FLUSH privileges;

También hay más formas de hacerlo:

# mysql -u root -p
mysql> CREATE DATABASE moodle;
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER ON moodle.*
TO moodleuser@localhost IDENTIFIED BY 'yourpassword';
mysql> quit
# mysqladmin -p reload

La diferencia es que la primera forma da todos los privilegios al usuario, y en la segunda se va especificando uno a uno los privilegios que le quieres dar al usuario sobre la BBDD. Además en la primera se aplican los cambios con la sentencia flush y en la segunda con un reload de la BBDD.