Limpiar boot de kernels antiguos en Ubuntu

Nos conectamos como superusuarios:

sudo su

Luego ejecutamos el siguiente comando que nos limpiará la carpeta /boot de kernel que ya no se utilizan.

 
dpkg --get-selections|grep 'linux-image*'|awk '{print $1}'|egrep -v "linux-image-$(uname -r)|linux-image-generic" |while read n;do apt-get -y remove $n;done
sudo apt autoremove

Por último para dejarlo como un a patena:

apt-get autoclean

 

rsync con certificado

Seguramente la herramienta más utilizada que hay hoy en día para hacer copias de seguridad sea “rsync“, si resulta que las copias son entre servidores remotos, pues su compeñero ideal será “ssh“.

Las opciones de “rsync” que necesitaría si quiero que se copien todos los archivos y una vez copiados se vaya actualizando con los nuevos archivos o los modificados:

  • -r: Aplica recursividad al origen de la copia. Se lleva los archivos y directorios que están dentro de la ruta que marquemos como origen.
  • -u: Modo de actualización, tan sólo se lleva los archivos que sean más nuevos en el origen que en el destino.
  • -o -g: Transfiere la propiedad de usuario (-o) y grupo (-g). Esto se aplica a los números de UID, no al nombre de usuario concreto. Si en nuestro origen el usuario con UID 3333 es usuario1 y en el destino el UID 3333 corresponde a usuario 2, habrá un problema de permisos ya que usuario 2 de repente pasará a tener control sobre esos datos.
  • -X: Transferir atributos extendidos que tengan aplicados los archivos
  • -p: Transfiere los permisos del archivo (diferente a la propiedad del mismo)
  • -t:Conserva las fechas de modificación, haciendo que rsync marque en el destino la misma fecha de modificación que tenía el archivo en origen.
  • -l: Conserva los enlaces simbólicos copiándolos como tales y apuntando al mismo destino, exista o no.
  • -D: Copia dispositivos especiales
  • -S: Manejar archivos dispersos de forma eficiente, de tal manera que si tenemos un archivo que tiene marcados 4GB como tamaño pero solo usa 100MB, lo transfiera con mayor efectividad.
  • -x: No cruzar filesystems. Es útil cuando tenemos un punto de montaje dentro de nuestro origen y no queremos llevarnos su contenido.
  • –remove-source-files: Elimina los archivos del ORIGEN una vez copiados. Interesante a la hora de archivados.
  • –delete: Borrará los archivos que haya en DESTINO y que no estén en origen. Útil para mantener una copia exacta 1:1 del origen
  • -z: Aplica compresión a los datos durante la transferencia. Muy útil si se transfieren logs.
  • –progress: Mostrará información del archivo que se está transfiriendo, así como del tiempo que se espera que tardará la transferencia en terminar. Si no hay cambios en los archivos, –progress no mostrará nada.
  • -e: Permite especificar opciones al comando que usaremos de shell remota. Por ejemplo, si tenemos el servidor ssh remoto en el puerto 1234, ejecutaremos: rsync -e “ssh -p 1234” -otrasopciones origen destino
  • -a: Esta es una metaopción, que activa de golpe las opciones -rlptgoD.
  • -W: Esta opción activa la copia completa de los archivos, para que no haya que dedicar tiempo a calcular los diferenciales.
  • -c: Esta opción desactiva la comprobación de checksum de datos, es decir, solo utiliza fecha de modificación y tamaño para determinar si un archivo se transfiere o no.
  • -avz

luego si queremos usar “ssh” lo haremos con la opción:

  • e: “-e ssh

si lo que queremos es una copia exacta usaremos:

  • –delete-after: que eliminaría en e lservidor 2, los archivos eliminados antes de hacer la copia del servidor 1.

La idea ahora sería poner en el servidor 2 un cron que copie los archivos del servidor 1.

$ rsync -e shh -avz usuario1@ip-servidor1:/directorio/servidor1 /directorio/servidor2

Este comando evidentemente nos pedirá la contraseña por lo que para poner en un cron, no nos sirve, para solucionar esto tenemos dos posibilidades:

  • utilizar la aplicación sshpass dentro de rsync.
    • sshpass -p 'elpassword' rsync --progress -avz -e ssh usuario1@ipservidor1:/servidor1/directorio/* /servidor2/directorio
  • o utilizar llaves públicas y llaves privadas.

En el servidor 2 vamos a crear las claves:

$ ssh-keygen -tdsa

A todas las preguntas las dejamos en blanco, esto genera id_dsa.pub en el directorio oculto /home/admin/.ssh/ la clave pública que copiaremos en el servidor1

Para ello simplemente:

 ssh-copy-id root@<ip-del-que-se-quiere-conectar>

 


Comentarios 0

ssh-keygen

Como crear los “keys” para “ssh login” automático

Para los que bregamos con paginas web y desarrollo de aplicaciones basadas en tecnología web, el hacer ssh (remote login) a un servidor en el web es cosa de todos los dias.Vía ssh tenemos control absoluto de esos servidores remotos y nos permite usar herramientas como SVN o Git para desplegar (deploy) nuestras aplicaciones o web sites.

El problema es que si uno esta conectandose a varios servidores muchas veces al día y cada uno de estos tiene un password diferente, la cosa se vuelve complicada. Tengo una aplicación que me ayuda a recordar los passwords pero estoy cansado de copiar y pegar el mismo password 10 veces al día.

La solución a este problema es usar un ssh key. Cuando tienes un ssh key configurado no tienes que entrar el password cada vez que te conectas a un servidor que tiene tu “public key”. Para entender mejor un public key es como una cerradura en una puerta y el private key es la llave que lo abre. Puedes poner la misma cerradura a muchas puertas (servidores) y usar la misma llave para entrar a todas.

Para entender más facilmente (suponiendo que sabes trabajar con ssh):

  1. Tienes que crear un Public y un Private key
  2. Debes guardar el private key como si tu vida dependiera de ello
  3. Debes enviar el public key a todos los servidores o computadoras que te quires conectar

1. En tu computadora personal (Mac OS X / Linux) debes crear el Private y Public key. Esto es muy fácil, simplemente abre el terminal y entra:

ssh-keygen

Luego de entrado este comando te preguntará por un nombre para la pareja de “keys”. En este caso para dejar el nombre que pone por defecto, presionando enter en el teclado. Esto produce tanto el Public (id_rsa) como el Private key (id_rsa.pub). Luego te preguntará por un “passphrase” para el que puedes poner lo que quieras, pero debes recordarlo. Los dos files (id_rsa y id_rsa.pub) se crearán en el directorio .ssh dentro del home folder. Es importante el nombre de estos ficheros, a que renombrándolos no me ha funcionado.

2. Haz un backup de estos dos files. Son muy importantes y si alguien tiene acceso a ellos tambien tendrá acceso a todos los servidores o computadoras que usen esa pareja de llaves.

3. Ahora vamos a colocar el public key (id_rsa.pub) o la cerradura de la puerta al servidor donde queremos conectarnos. Para esto es necesario hacer login al servidor remoto via ssh para decirle que use este file cuando se este tratando de hacer un login desde nuestra computadora personal.

ssh [email protected]

Verifica que el directorio .ssh tiene permisos 700. Si no haces:

chmod 700 .ssh/

cd ~/.ssh

Ahora hay que crear un file para guardar los keys que este servidor acepta.

touch authorized_keys

chmod 600 authorized_keys

Ahora hay que poner nuestro Public key en este file.

Copiamos el contenido de id_rsa.pub con :

cat id_rsa.pub

Editamos el fichero donde almacenaremos esta clave:

joe /root/.ssh/authorized_keys

y pegaremos el contenido del id_rsa.pub que generamos en el servidor o equipo desde el que queremos acceder.

Listo ahora debemos volver a nuestra computadora personal. Si todo salió bien el servidor deberia permitirte conectarte sin perdir ningun password mas allá del passphrase que usaste al principio para genera los keys. De este momento en adelante podrás conectarte al servidor remoto usando solamente:

ssh [email protected]

En caso de tener algún problema al conectarnos por ssh del tipo:

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

debemos editar el fichero “known_hosts” para eliminar la línea que ha almacenado  cuando nos hemos conectado anteriormente desde la misma IP, para ello ejecutamos:

#ssh-keygen -f "/root/.ssh/known_hosts" -R [IP]:PUERTO_SSH

ejemplo:

#ssh-keygen -f "/root/.ssh/known_hosts" -R [192.168.0.1]:22

Aquí les dejo el enlace al mejor articulo que encontré sobre el tema.



Instalación de VestaCP sobre Ubuntu

VestaCP Panel de ControlVestaCP es un panel de control para servidores Web.

Página web para generar el comando de instalación: https://vestacp.com/install/

En nuestro caso solicitaremos los siguientes servicios:

  • nginx + apache
  • proftpd
  • iptables + fail2ban
  • BD: MySQL
  • Repositorio remi
  1. # Conectarse a nuestro servidor via SSH ssh [email protected]
  2. # Descargar el script script curl -O http://vestacp.com/pub/vst-install.sh
  3. # Ejecutar  sudo bash vst-install.sh –nginx yes –apache yes –phpfpm no –named no –remi yes –vsftpd no –proftpd yes –iptables yes –fail2ban yes –quota no –exim no –dovecot no –spamassassin no –clamav no –mysql yes –postgresql no –hostname ri-gata.lared.com.es –email [email protected] –password LaClaveQueSea

Pantalla Instalación VestaCP

 

Luego de la instalación porbaríamos a entrar al panel de control:

https://200.200.200.32:8083/login/

VestaCP

La versión de PHP instalada es la 7

juanjo@ri-gata:~$ php -v
PHP 7.0.18-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
 with Zend OPcache v7.0.18-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies
juanjo@ri-gata:~$

Para añadir ciertos módulos del PHP como son php-zip

sudo apt-get install php-zip

vjh



Instalación de un Servidor Ubuntu

En este ejemplo vamos a instalar un Ubuntu Server 16.

Previamente hemos descargado la ISO básica que vienen a ser unos 800 Mb.

1.- Instalación Ubuntu

Arrancamos la máquina con la ISO y después de pedirnos que seleccionemos el idioma tenemos nuestra primera parada en la configuración de red, sin decirnos nada el intenta encontrar un DHCP y si lo encuentra pues no da la opción de continuar con la configuración automática, no obstante en nuestro caso ya que se trata de un servidor vamos a obligarle a tener una IP fija de nuestra red por lo que le diremos “NO” nos vale esa configuración automática y pasaremos a una manual:

Configura tarjeta red linux ubuntu

Configura red manualmente

En nuestro caso utilizando la notación CIDR será la 200.200.200.32/26 (que se corresponde con la máscara 255.255.255.192) el Gateway y servidor DNS será el propio router: 200.200.200.1

Poniendo la IP en Ubuntu

Hay que indcar también un nombre de máquina: loquesea.com por ejemplo.

Luego nos pide un usuario, a diferencia de otros sistemas como  CentoOS que nos permite trabajar sólo como root, Ubuntu nos obliga a crear un usuario:

usuario en ubuntu

Luego nos pedirá dos veces el password.

Poniendo el password

Luego le decimos que no queremos cifrar nuestra carpeta personal, que la zona horaria es la Península, y que queremos utilizar el disco completo:

Particionado de disco

Escribir cambios en discoConfoirmación particionado disco

Empieza la instalación básica del sistema Ubuntu:

Instalando Sistema Linux Ubuntu

A mitad instalación … nos pregunta si estamos trabajando con algún proxy, en nuestro caso lo dejamos en blanco porque trabajamos directamente con el Router:

proxy

Casi finalizando nos pregunta si queremos que se instalen actualizaciones automáticas, a lo cual diremos que sí.

Actualizaciones automáticas

Casi último le indicamos que paquetes queremos instalar, en nuestro caso son las utilidades standard y el openSSH Server para conectarnos en remoto:

Paquetes de instalación

Se terminan de instalar los programas:

INstalación de programas

Para finalizar le indicamos si tiene que instalar el GRUB, en nuestro caso como se trata de un servidor con un único sistema podemos insertarlo sin miedo, si la máquina tuviera distintos sistemas instalados hay que tener cuidado al instalar el GRUB porque puede que luego no sea accesible alguno de los sistemas:

Instalación GRUB

Antes de reiniciar el equipo hay que asegurarse que no se encuentre la ISO montada o el CD de instalción para que no vuelva a intentar instalarse.

Fin de la Instalación

2.- Comprobación del correcto funcionamiento del sistema

Normalmente la tarjeta de red no suele estar activa al arrancar o bien se puede quedar mal configurada, vemos como debería activarse manualmente y/o configurarla manualmente:

Editamos el archivo interfaces:

sudo nano /etc/network/interfaces

interfaces

Luego para reiniciar la tarjeta:

sudo /etc/init.d/networking restart

Ahora podemos arrancar en remoto con un ssh como bitvise:

bitvise

ssh - bitvise

Para comprobar si tenemos bien configurada la tarjeta de red y la salida a internet instalamos un pequeño paquete como es el nmap que nos servirá para ver que puertos tiene abiertos nuestro servidor.

sudo apt-get install nmap

Si ejecutamos la la instruccion sudo nmap 127.0.0.1:

juanjo@ri-gata:~$ sudo nmap 127.0.0.1

Starting Nmap 7.01 ( https://nmap.org ) at 2017-05-27 20:23 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000018s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
22/tcp open ssh

Nmap done: 1 IP address (1 host up) scanned in 1.64 seconds

Vemos que sólo está abierto el puerto del SSH

3.- Actualización del sistema.

Al arrancar el sistema por primera vez ya nos avisa de que hay paquetes por actualizar y actualizaciones de seguridad:

terminal ubuntu

una actualización del mismo:

sudo apt-get update
sudo apt-get upgrade

En nuestro caso se descargará unos 70 Mb de actualizaciones.

upgrade ubuntu

 

 



rsync para hacer copias de seguridad

En ¿Piensas en si un día te roban el portátil? mencioné que me gusta hacer los backups con rsync. Me gusta usarlo para backups tanto locales (copiar ficheros de un directorio a otro del mismo sistema) como remotos (copiar ficheros de un sistema a otro), y tanto en en Linux como en Windows usando Cygwin sin ningún problema de interoperabilidad para hacer backups remotos usando uno u otro como destino de las copias de seguridad.

rsync es una herramienta para sincronizar los ficheros y directorios que tenemos almacenados en un sitio en otro diferente minimizando la transferencia de datos (Wikipedia: rsync). En realidad, rsync son dos cosas: un algoritmo de delta compression para sincronizar dos ficheros similares y una utilidad que usa dicho algoritmo junto con otras técnicas para hacer mirroring de ficheros y directorios en otro sitio transfiriendo la mínima cantidad de datos posible.

A nivel de un árbol de directorios con sus ficheros, la idea es sencilla. rsync nos copiará esos ficheros y directorios tal y como estaban en el nuevo sitio pero sin copiar todo, sino sólo lo que ha cambiado en el origen respecto al destino. Hacer lo mismo copiando los ficheros y directorios, incluso en remoto usando una carpeta compartida, sería equivalente si nos fijamos únicamente en el resultado, pero tenemos que transferir mucha más información.

A nivel de ficheros individuales, podemos imaginar un fichero muy grande (p.e. de varios GiB) de una base de datos. Si quisiéramos hacer backup de él sin tener herramientas como rsync, tendríamos que copiarlo cada vez, cuando en realidad en muchos casos la inmensa mayoría de bloques del fichero no habrá cambiado. rsync, en cambio, analiza el fichero en origen y en destino y sólo transmite (de forma comprimida, además) las partes que realmente hayan cambiado.

Debian, por ejemplo, pone a nuestra disposición servidores de rsync para descargar sus imágenes de CDs, aunque hay un debate sobre si el descenso en el uso de ancho de banda de los servidores compensa el aumento en el uso de CPU y memoria a causa del propio algoritmo de rsync (About integration of rsync and Debian). Y es que rsync consume la CPU necesaria para su algoritmo y además mantiene en memoria una lista con todos los ficheros a ser sincronizados (unos 100 bytes por cada uno), por lo que necesita bastante memoria. También se debate el problema de que el rsync no es muy eficiente con ficheros comprimidos con gzip y con bzip2 porque un pequeño cambio en el contenido modifica en cadena todo el archivo creando una especie de efecto mariposa que causa que dos archivos parecidos no guarden ninguna semejanza aprovechable por rsync tras la compresión.

En cualquier caso, si las anteriores pequeñas pegas no nos detienen, veremos que rsync es, en definitiva, una excelente utilidad de línea de comandos para hacer copias de seguridad locales y remotas.

El listado de características especiales que nos da la página de man de rsync es:

  • Soporte para copiar enlaces, ficheros de dispositivo, propietarios, grupos y permisos
  • Opciones de exclusión (exclude y exclude-from) similares a las del GNU tar
  • Modo CVS para ignorar los fichero que CVS ignoraría
  • Se puede usar cualquier shell remota transparente, como ssh o rsh
  • No es necesario ser root para usarlo
  • pipelining de los ficheros transferidos para minimizar la latencia
  • Soporte para usuarios anónimos o autentificados usando el demonio de rsync (ideal para hacer mirroring)

En su forma más sencilla de uso, es similar a un cp. Si queremos sincronizar un fichero en otro podemos, simplemente, hacer (el -v es para que nos muestre información más detallada sobre lo que hace):

$ ll fichero1
-rw-r----- 1 vicente users 7625431 2008-01-13 11:40 fichero1
$ rsync -v fichero1 fichero2
fichero1

sent 7626448 bytes  received 42 bytes  15252980.00 bytes/sec
total size is 7625431  speedup is 1.00

$ ll fichero?
-rw-r----- 1 vicente users 7625431 2008-01-13 11:40 fichero1
-rw-r----- 1 vicente users 7625431 2008-01-13 11:41 fichero2

Pero si el comando lo ejecutamos desde otro usuario (en el ejemplo root), vemos que no se está manteniendo el usuario, aunque sí los permisos, y que incluso la hora es diferente:

# rsync fichero1 fichero3
# ll fichero?
-rw-r----- 1 vicente users 7625431 2008-01-13 11:40 fichero1
-rw-r----- 1 vicente users 7625431 2008-01-13 11:41 fichero2
-rw-r----- 1 root    root  7625431 2008-01-13 11:44 fichero3

Y tampoco es capaz de hacer nada con directorios:

$ rsync dirA dirB
skipping directory dirA

Por eso, para propósitos de backup, el rsync en la mayoría de los casos se utiliza con la opción -a:

-a, --archive               archive mode; same as -rlptgoD (no -H, -A)

Esta opción combina el parámetro -r para que el recorra toda la estructura de directorios que le indiquemos, el -l para que copie enlaces simbólicos como enlaces simbólicos, la -p para que mantenga los permisos, la -t para que se mantenga la hora del fichero, la -g para que se mantenga el grupo, la -o para que se mantenga el propietario, la -D para que se mantengan los ficheros de dispositivo (sólo para root). Ni se mantienen los hard links (-H) ni las ACLs (-A) por defecto. En definitiva, con la opción -a obtenemos una copia exacta de una jerarquía de ficheros y directorios.

Veamos un ejemplo de sincronización de un directorio llamado dirA que contiene otros directorios y ficheros en otro llamado dirB que, de momento, aún no existe:

$ rsync -av dirA/ dirB/
building file list ... done
created directory dirB
dirA/
dirA/fichero1
dirA/fichero2
dirA/dirA1/
dirA/dirA1/fichero3
dirA/dirA2/
dirA/dirA2/fichero4

sent 6540542 bytes  received 126 bytes  13081336.00 bytes/sec
total size is 6539349  speedup is 1.00

Si ahora modificamos un poco sólo uno de los ficheros y volvemos a ejecutar exactamente el mismo comando, veremos que esta vez sólo se copia el fichero modificado:

$ echo prueba >> dirA/fichero1
$ rsync -av dirA dirB
building file list ... done
fichero1

sent 65884 bytes  received 42 bytes  131852.00 bytes/sec
total size is 6539356  speedup is 99.19

Sin embargo, vemos que aunque el fichero sea sólo ligeramente distinto, rsync copia todo el fichero completo cada vez:

$ rm fichero2
$ rsync -av fichero1 fichero2
fichero1

sent 7626462 bytes  received 42 bytes  15253008.00 bytes/sec
total size is 7625445  speedup is 1.00

$ echo prueba >> fichero1
$ rsync -av fichero1 fichero2
fichero1

sent 7626469 bytes  received 42 bytes  15253022.00 bytes/sec
total size is 7625452  speedup is 1.00

No es que haya ningún defecto en su algoritmo, es que para un uso en local, rsync usa la opción -W por defecto, ya que considera que el esfuerzo en calcular la diferencia entre los ficheros es mayor que copiar directamente todo el fichero:

-W, --whole-file            copy files whole (without rsync algorithm)

Si contrarrestamos la -W con --no-whole-file veremos que que ahora sí que sólo copia el bloque donde ha encontrado el cambio:

$ echo prueba >> fichero1
$ rsync -av --no-whole-file fichero1 fichero2
building file list ... done
fichero1

sent 13514 bytes  received 16620 bytes  20089.33 bytes/sec
total size is 7625459  speedup is 253.05

Y si encima usamos la opción -z, comprimirá el bloque antes de pasarlo:

$ echo prueba >> fichero1
$ rsync -avz --no-whole-file fichero1 fichero2
building file list ... done
fichero1

sent 843 bytes  received 16620 bytes  34926.00 bytes/sec
total size is 7625466  speedup is 436.66

El uso de la opción -z puede ser beneficioso o perjudicial, ya que la menor transferencia de datos redunda en un mayor consumo de CPU.

Por cierto, ¿en qué se basa rsync para decidir que un fichero ha cambiado? Normalmente sólo mira la fecha del fichero y su tamaño, por lo que si ninguna de las dos cosas cambia, por defecto el rsync no copiará el fichero. Es muy raro que dos ficheros con la misma fecha y tamaño sean diferentes, pero puede ocurrir. Si en nuestro entorno se puede dar ese caso, tendremos que usar la opción -c para que se determine por CRC si realmente los ficheros son iguales:

-c, --checksum              skip based on checksum, not mod-time & size

Pero claro, esto también aumentará sensiblemente el uso de CPU.

La barra al final de los nombres de directorio

Respecto a cómo pasarle los nombres de los directorios, hay que tener una especial atención respecto a si ponemos una barra al final del nombre del directorio o no, ya que significan cosas distintas:

You can think of a trailing / on a source as meaning “copy the contents of this directory” as opposed to “copy the directory by name”, but in both cases the attributes of the containing directory are transferred to the containing directory on the destination. In other words, each of the following commands copies the files in the same way, including their setting of the attributes of /dest/foo:

              rsync -av /src/foo /dest
              rsync -av /src/foo/ /dest/foo

Efectivamente, /path/foo significa “el directorio foo“, mientras que /path/foo/ significa “lo que hay dentro de foo“. Pongamos algunos ejemplos para entenderlo.

Este es el uso más estándar en el que sincronizamos dos directorios (dirA y dirB) para que sean exactamente iguales (“rsync -av dirA/ dirB/” o “rsync -av dirA/ dirB“):

$ rm -rf dirB
$ rsync -av dirA/ dirB/
building file list ... done
created directory dirB
./
fichero1
fichero2
dirA1/
dirA1/fichero3
dirA2/
dirA2/fichero4

sent 6540550 bytes  received 126 bytes  13081352.00 bytes/sec
total size is 6539363  speedup is 1.00

$ ll dirB
total 164
drwxr-xr-x 4 vicente users  4096 2008-01-13 11:48 ./
drwxr-xr-x 4 vicente users  4096 2008-01-13 14:00 ../
drwxr-xr-x 2 vicente users  4096 2008-01-13 11:48 dirA1/
drwxr-xr-x 2 vicente users  4096 2008-01-13 11:59 dirA2/
-rwxr-xr-x 1 vicente users 65638 2008-01-13 13:59 fichero1*
-rw-r--r-- 1 vicente users 71033 2008-01-13 11:39 fichero2

En cambio, si lo que queremos es que que copie dirA dentro de dirB, tenemos que poner “rsync -av dirA dirB/” o “rsync -av dirA dirB“:

$ rm -rf dirB
$ rsync -av dirA dirB
building file list ... done
created directory dirB
dirA/
dirA/fichero1
dirA/fichero2
dirA/dirA1/
dirA/dirA1/fichero3
dirA/dirA2/
dirA/dirA2/fichero4

sent 6540549 bytes  received 126 bytes  13081350.00 bytes/sec
total size is 6539356  speedup is 1.00

$ ll dirB
total 12
drwxr-xr-x 3 vicente users 4096 2008-01-13 13:35 ./
drwxr-xr-x 4 vicente users 4096 2008-01-13 13:35 ../
drwxr-xr-x 4 vicente users 4096 2008-01-13 11:48 dirA/

La diferencia entre poner la barra al final y no ponerla es una de las cosas que tenemos que tener en todo momento más claras a la hora de pensar en qué parámetros le vamos a pasar al comando para hacer un backup con rsync con éxito.

Eliminando ficheros del destino de backups anteriores

En muchos casos, es posible que hayamos borrados ficheros de origen que ya no queremos que aparezcan en el destino, pero por defecto rsync no los elimina. Para que lo haga, debemos usar la opción --delete:

$ rm -rf dirB/
$ rsync -a dirA/ dirB/
$ touch dirB/ficheroextraño
$ rsync -av dirA/ dirB/
building file list ... done
./

sent 199 bytes  received 26 bytes  450.00 bytes/sec
total size is 6539363  speedup is 29063.84

$ rsync -av --delete dirA/ dirB/
building file list ... done
deleting ficheroextraño
./

sent 199 bytes  received 26 bytes  450.00 bytes/sec
total size is 6539363  speedup is 29063.84

Cuando se hagan pruebas con el --delete hay que llevar mucho cuidado, porque si elegimos erróneamente el directorio de destino podemos borrar en cascada muchísimos ficheros que no queríamos borrar. Es por eso que se aconseja que se use en las pruebas la opción -n/--dry-run para que el comando no haga nada en realidad y así podamos depurar el comando antes de ponerlo en funcionamiento definitivamente.

Otra opción que puede ser interesante en algunos entorno es la -u, para que no se sobreescriban los ficheros del destino que son más recientes que los del origen. Esta opción es útil si es posible que en un momento dado se trabaje sobre los ficheros del backup, de modo que en ningún caso reemplacemos los archivos que se puedan haber modificado en destino:

$ touch dirB/fichero1
$ rsync -av --delete dirA/ dirB/
building file list ... done
fichero1

sent 65885 bytes  received 42 bytes  131854.00 bytes/sec
total size is 6539363  speedup is 99.19

$ touch dirB/fichero1
$ rsync -av --delete -u dirA/ dirB/
building file list ... done

sent 193 bytes  received 20 bytes  426.00 bytes/sec
total size is 6539363  speedup is 30701.23

Y en este punto, ya tenemos varias forma de usar el comando perfectamente válidas para hacer backups en función de nuestras necesidades:

$ rsync -av --delete directorioorigen/ directoriodestino/
$ rsync -av --delete directorioorigen directoriodestino
$ rsync -av --delete -u directorioorigen/ directoriodestino/
$ rsync -av --delete -u directorioorigen directoriodestino

Backups incrementales

Si queremos tener un archivo con los ficheros que vamos modificando, un backup incremental, las opciones -b/--backup y --backup-dir=DIR (y también --suffix=SUF) son de mucha utilidad para nosotros.

Supongamos que tenemos dos directorios dirA y dirB perfectamente sincronizados y actualizamos un fichero en el directorio origen:

$ rsync -a dirA/ dirB/
$ echo prueba >> dirA/fichero1

Si volvemos a sincronizar, el rsync borraría el dichero dirA/fichero1 que teníamos almacenado del backup anterior en dirB. Para que no nos lo elimine completamente, vamos a usar la opción -b y le vamos a decir que almacene la versión previa en el directorio “backup_fechahoradehoy” (ponemos dos opciones -v para que nos informe sobre el backup):

$ rsync -avvb --delete --backup-dir=$PWD/rsync/backup_$(date +%y%m%d%H%M) dirA/ dirB/
backup_dir is /home/vicente/rsync/backup_0801131917/
building file list ...
done
deleting in .
delta-transmission disabled for local transfer or --whole-file
fichero1
fichero2 is uptodate
dirA1/fichero3 is uptodate
dirA2/fichero4 is uptodate
backed up fichero1 to /home/vicente/rsync/backup_0801131917/fichero1
total: matches=0  hash_hits=0  false_alarms=0 data=65708

sent 65991 bytes  received 78 bytes  132138.00 bytes/sec
total size is 6539433  speedup is 98.98

Y vemos que ya tenemos un directorio de backup que sólo contiene los fichero que han sido reemplazados esta vez:

$ ll
total 20
drwxr-xr-x  5 vicente users 4096 2008-01-13 19:18 ./
drwxr-x--- 56 vicente users 4096 2008-01-13 18:43 ../
drwxr-xr-x  2 vicente users 4096 2008-01-13 19:17 backup_0801131917/
drwxr-xr-x  4 vicente users 4096 2008-01-13 11:48 dirA/
drwxr-xr-x  5 vicente users 4096 2008-01-13 11:48 dirB/

$ ll backup_0801131917/
total 80
drwxr-xr-x 2 vicente users  4096 2008-01-13 19:17 ./
drwxr-xr-x 5 vicente users  4096 2008-01-13 19:18 ../
-rwxr-xr-x 1 vicente users 65701 2008-01-13 19:17 fichero1*

Si ahora modificamos otro fichero, veremos que antes de reemplazarse, se almacenará en un nuevo directorio de backup:

$ echo prueba >> dirA/fichero2
$ rsync -ab --delete --backup-dir=$PWD/backup_$(date +%y%m%d%H%M) dirA/ dirB/
$ ll
total 28
drwxr-xr-x  7 vicente users 4096 2008-01-13 19:21 ./
drwxr-x--- 56 vicente users 4096 2008-01-13 18:43 ../
drwxr-xr-x  2 vicente users 4096 2008-01-13 19:17 backup_0801131917/
drwxr-xr-x  2 vicente users 4096 2008-01-13 19:21 backup_0801131921/
drwxr-xr-x  4 vicente users 4096 2008-01-13 11:48 dirA/
drwxr-xr-x  4 vicente users 4096 2008-01-13 11:48 dirB/
$ ll backup_0801131921/
total 84
drwxr-xr-x 2 vicente users  4096 2008-01-13 19:21 ./
drwxr-xr-x 7 vicente users  4096 2008-01-13 19:21 ../
-rw-r--r-- 1 vicente users 71040 2008-01-13 19:20 fichero2/

Es importante no usar paths relativos en el parámetro --backup-dir, porque son relativos al directorio destino. En los ejemplos anteriores, si hubiéramos hecho “--backup-dir=backup_$(date +%y%m%d%H%M)“, el directorio “backup_0801131917” de turno se hubiera creado dentro del dirB y sería eliminado en el siguiente rsync con --delete.

Actualización 15/1/07 (inspirada por los comentarios de MetalAgent):

También podemos hacer backups incrementales con las opciones:

--compare-dest=DIR      also compare received files relative to DIR
--copy-dest=DIR         ... and include copies of unchanged files
--link-dest=DIR         hardlink to files in DIR when unchanged

La opción --compare-dest=DIR hace casi lo mismo que la -b/--backup / --backup-dir=DIR, pero al revés. En lugar de guardar los ficheros viejos en DIR, como hace la -b, la --compare-dest lo que hace es guardar en el directorio destino sólo los ficheros que han cambiado respecto a DIR. Es como un backup incremental pero mientras que con la -b tienes todos los ficheros de la última versión en el directorio destino, con la --compare-dest sólo tienes en el directorio destino los ficheros que han cambiado desde el último backup.

Como variación de la --compare-dest, está la --copy-dest=DIR, que hace lo mismo que la anterior pero además copia los ficheros que no hayan cambiado. ¡Pero ojo!, la ventaja de esta opción es que la copia de los ficheros que no han cambiado es local, de forma que en un rsync remoto, todos los ficheros que ya estaban en DIR no se tienen que transferir. La desventaja es que necesita mucho espacio en disco.

Finalmente, la variante más interesante es la --link-dest=DIR, que hace lo mismo que la --copy-dest pero sin consumir más espacio en disco porque usa hard links a los ficheros que ya existen. ¡Una opción realmente útil!

Incluyendo y excluyendo ficheros del backup

La mayoría de las veces no querremos hacer backup de un único directorio y ya está, sino que querremos hacer backup de una lista determinada de directorios. En esos casos, o especificamos uno por uno en la línea de comandos o, mucho mejor, los especificamos en una lista. Si especificamos los ficheros en una lista, nos podemos permitir tener un script de backup que lance rsync con las opciones deseadas y que no modificaremos nunca y el fichero con la lista de directorios de los que hay que hacer backup que será lo que modificaremos. Las opciones son:

--exclude=PATTERN       exclude files matching PATTERN
--exclude-from=FILE     read exclude patterns from FILE
--include=PATTERN       don't exclude files matching PATTERN
--include-from=FILE     read include patterns from FILE
--files-from=FILE       read list of source-file names from FILE

Los patrones que usa rsync no son muy intuitivos, así que lo mejor es leer detenidamente la sección que los explica (INCLUDE/EXCLUDE PATTERN RULES) en la página de man de rsync, pero podemos ver un ejemplo que nos aclarará un poco este tema.

Imaginemos que queremos hacer un backup de los directorios “/var/log/” y “/var/www/“. Podríamos usar un comando como:

rsync -av --delete --prune-empty-dirs --include-from=lista_dirs_backup.txt / /mnt/disco/Backup/

en el que el fichero lista_dirs_backup.txt contiene:

+ */
+ /var/www/**
+ /var/log/**
- *

El “+ */” de la primera línea especifica que todos los directorios pasan el filtro y es necesario porque aunque especifiquemos los directorios que nos interesan en las siguientes líneas, el propio directorio /var/ y los /var/log/ y /var/www/ no pasaría el filtro. Además, como esta opción nos permite pasar todos los directorios pero sin los ficheros y directorios que contienen, tenemos que usar la opción --prune-empty-dirs para que no copie directorios vacíos.

En la última línea le especificamos con “- *” que todo lo que en ese punto ya no ha pasado el filtro, que sea descartado. Los dos asteriscos (**) indican que todos los ficheros y directorios que hay debajo pasarán el filtro.

Una alternativa sin --prune-empty-dirs sería incluir específicamente todos los directorios involucrados:

+ /var/
+ /var/www/
+ /var/log/
+ /var/www/**
+ /var/log/**
- *

Pero es evidente que en el caso de tener muchos directorios y con mucha profundidad, esta forma se puede complicar mucho y es claramente más sencilla la anterior (aunque también es más lenta por tener que recorrer todos los directorios del origen).

En versiones de rsync >=2.6.7 también existe la posibilidad de poner tres asteriscos (***) para especificar que el propio directorio especificado también pasa el filtro, facilitándonos nuestra labor en el caso de que queramos hacerlo sin “+ */” y sin --prune-empty-dirs:

+ /var/
+ /var/www/***
+ /var/log/***
- *

Y también es importante tener en cuenta si los directorios especificados son relativos o absolutos. En los ejemplos anteriores, el directorio origen era el raíz (/) y por ello, los directorios se guardaban con todo el path (/var/log/ y /var/www/) y así los especificábamos en el fichero de include:

$ ll /mnt/disco/Backup/var/
total 16
drwxr-xr-x  4 root root 4096 2007-10-31 21:10 ./
drwxr-xr-x  3 root root 4096 2007-12-09 18:19 ../
drwxr-xr-x 14 root root 4096 2008-01-13 18:43 log/
drwxr-xr-x  3 root root 4096 2007-06-27 20:19 www/

pero también podríamos haber decidido hacerlo con referencia a /var/:

rsync -av --delete --prune-empty-dirs --include-from=lista_dirs_backup.txt /var/ /mnt/disco/Backup/

Con lo que en el fichero lista_dirs_backup.txt tendríamos que poner (suponemos versión <2.6.7):

+ www
+ log
+ www/**
+ log/**
- *

Y el resultado sería un backup sin la parte del directorio /var/:

$ ll /mnt/disco/Backup/
total 16
drwxr-xr-x  4 root root 4096 2007-10-31 21:10 ./
drwxrwxrwt 18 root root 4096 2008-01-13 20:07 ../
drwxr-xr-x 14 root root 4096 2008-01-13 18:43 log/
drwxr-xr-x  3 root root 4096 2007-06-27 20:19 www/

Pero como regla fácil que siempre funciona, tenemos lo primero que hemos comentado. Un comando como este:

rsync -av --delete --prune-empty-dirs --include-from=lista_dirs_backup.txt / /mnt/disco/Backup/

con un lista_dirs_backup.txt como este:

+ */
+ /directorio1/**
+ /directorio2/directorio2A/**
+ /directorio2/directorio2B/**
- *

rsync remoto

Hasta ahora hemos hecho todos los ejemplos en local. Sin embargo, la máxima utilidad de rsync llega cuando se usa para hacer backups en una máquina remota, de forma que el backup cumpla mejor su función al estar físicamente en otro sistema.

En la máquina destino es posible usar el propio proceso rsync funcionando como demonio y escuchando por defecto en el puerto 873 para recibir estas conexiones, pero es mucho más cómodo y fácil hacerlo por SSH, algo para lo que rsync ya está preparado por defecto.

Para esto es conveniente configurar el cliente y el servidor de SSH involucrados para entrar de forma transparente usando autentificación por clave pública (Autentificación trasparente por clave pública/privada con OpenSSH) para evitar tener que introducir la contraseña cada vez, aunque no es estrictamente necesario. Una vez que lo tengamos así (o si optamos por introducir la contraseña manualmente) y verifiquemos que podemos entrar en la otra máquina sin introducir usuario ni contraseña, podemos usar rsync exactamente igual que si trabajáramos con la máquina local, solo que tenemos que especificar el prefijo “usuario@maquina:” en el origen o en el destino (no en ambos):

$ rsync -av --delete dirA vicente@remoto:/backup/
building file list ... done
dirA/
dirA/fichero1
dirA/fichero2
dirA/dirA1/
dirA/dirA1/fichero3
dirA/dirA2/
dirA/dirA2/fichero4

sent 6540658 bytes  received 126 bytes  2616313.60 bytes/sec
total size is 6539461  speedup is 1.00
# rsync -av --delete vicente@remoto:/backup/dirA/ dirC/
receiving file list ... done
created directory dirC
./
fichero1
fichero2
dirA1/
dirA1/fichero3
dirA2/
dirA2/fichero4

sent 126 bytes  received 6540665 bytes  2616316.40 bytes/sec
total size is 6539461  speedup is 1.00


Cron y crontab: el programador de tareas de linux

Crontab, la lista de tareas.

Crontab se trata archivo de texto que guarda la lista de comandos a ejecutar en un momento determinado.

Estos comando siempre se lanzan en background, así que no habrá interacción con el usuario.

Crontab comprueba la fecha y hora en que se debe ejecutar el script o el comando, los permisos de ejecución y lo realizará en el background.

Cada usuario puede tener su propio archivo crontab, de hecho el /etc/crontab se asume que es el archivo crontab del usuario root, cuando los usuarios normales (e incluso root) desean generar su propio archivo de crontab, entonces utilizaremos el comando crontab.

Veamos un ejemplo sencillo.

Vamos a automatizar la limpieza de archivos temporales que genera un servidor web en nuestro sistema, estos archivos se encuentran en la carpeta “tmp” del usuario administrador del servidor web, supongamos que nuestro usuario es “admin” y la ruta completa será “/home/admin/tmp”, los archivos tienen la forma “sess_4abmmo96i9m2uhb364kc7sq181” así que podemos considerar que haciendo un “rm sess_*” se borrarán todos, no obstante vamos a borrar sólo los ficheros que tengan más de 24 horas.

Para este menester existe una opción más aconsejable como es el “systemd” pero el resultado será el mismo.

Vamos a automatizar la actualización de un sistema, para eliminar la molesta de “siempre tengo que andar actualizando y eso no me gusta!”.

Primero que nada haremos un script. Este script será llamado por cron y contendrá todas las instrucciones que queremos que haga, por lo tanto es necesario probarlo en varios casos y de varias formas antes de incluirlo a cron, un sencillo script de actualizacion como este:

#!/bin/bash
#script ejemplo de actualizacion
#elija su distribucion
#debian-ubuntu
#apt-get update & apt-get -y upgrade
#fedora
#yum -y update
#Arch
#pacman –noconfirm -Syu
Quitale el # a la línea de tu distro. En caso de que sea Ubuntu/Debian, a la que empieza con apt-get.

Guardamos el script como actualizacion.sh (ej. directorio scripts tu home). Cambiamos los permisos de ejecucion del dichoso script con:

chmod a+x ~/scripts/actualizacion.sh
Ejecutamos el script un par de veces para verificar que todo ejecute sin problemas, modificamos lo necesario (no debe contener errores, si no cron solo repetira un error una y otra vez). Ahora a agregar la tarea a nuestro crontab.

Agregar tareas a crontab

Ejecutamos la edición del crontab con crontab -e, en algunas distros (como ubuntu) nos da la opcion de elegir el editor de textos que deseemos, los demás nos quedamos con vi. El archivo crontab lucirá algo asi.

# m h dom mon dow user command
donde:

m corresponde al minuto en que se va a ejecutar el script, el valor va de 0 a 59
h la hora exacta, se maneja el formato de 24 horas, los valores van de 0 a 23, siendo 0 las 12:00 de la medianoche.
dom hace referencia al día del mes, por ejemplo se puede especificar 15 si se quiere ejecutar cada dia 15
dow significa el día de la semana, puede ser numérico (0 a 7, donde 0 y 7 son domingo) o las 3 primeras letras del día en inglés: mon, tue, wed, thu, fri, sat, sun.
user define el usuario que va a ejecutar el comando, puede ser root, u otro usuario diferente siempre y cuando tenga permisos de ejecución del script.
command refiere al comando o a la ruta absoluta del script a ejecutar, ejemplo: /home/usuario/scripts/actualizar.sh, si acaso llama a un script este debe ser ejecutable
Para que quedara claro unos cuantos ejemplos de tareas de cron explicados:

15 10 * * * usuario /home/usuario/scripts/actualizar.sh
Ejecutará el script actualizar.sh a las 10:15 a.m. todos los días

15 22 * * * usuario /home/usuario/scripts/actualizar.sh
Ejecutará el script actualizar.sh a las 10:15 p.m. todos los días

00 10 * * 0 root apt-get -y update Usuario root
Ejecutará una actualización todos los domingos a las 10:00 a.m

45 10 * * sun root apt-get -y update
Usuario root ejecutará una actualización todos los domingos (sun) a las 10:45 a.m

30 7 20 11 * usuario /home/usuario/scripts/actualizar.sh
El día 20 de noviembre a las 7:30 el usuario correra el script

30 7 11 11 sun usuario /home/usuario/scripts/pastel_con_velitas.sh
El día 11 de noviembre a las 7:30 a.m. y que sea domingo, el usuario festejará su sysadmin (o sea a mí)

01 * * * * usuario /home/usuario/scripts/molestorecordatorio.sh
Un molesto recordatorio cada minuto de cada hora todos los días (NO recomendable).

Igual se pueden manejar rangos especiales:

30 17 * * 1,2,3,4,5
A las 5:30 de la tarde todos los días de lunes a viernes.

00 12 1,15,28 * *
A las 12 del día todos los días primero, quince y 28 de cada mes (ideal para nóminas)

Si esto resulta confuso, crontab maneja cadenas especiales para definir estos rangos.

@reboot Ejecuta una vez, al inicio
@yearly ejecuta sólo una vez al año: 0 0 1 1 *
@annually igual que @yearly
@monthly ejecuta una vez al mes, el día primero: 0 0 1 * *
@weekly Semanal el primer minuto de la primer hora de la semana. 0 0 * * 0″.
@daily diario, a las 12:00A.M. 0 0 * * *
@midnight igual que @daily
@hourly al primer minuto de cada hora: 0 * * * *

Su uso es muy sencillo.

@hourly usuario /home/usuario/scripts/molestorecordatorio.sh
@monthly usuario /home/usuario/scripts/respaldo.sh
@daily root apt-get update && apt-get -y upgrade
Por último y no menos importante:

Administracion de trabajos en cron

crontab archivo
Remplaza el existente archivo crontab con un archivo definido por el usuario

crontab -e
Editar el archivo crontab del usuario, cada linea nueva sera una nueva tarea de crontab.

crontab -l
Lista todas las tareas de crontab del usuario

crontab -d
Borra el crontab del usuario

crontab -c dir
Define el directoriod e crontab del usuario (este debe tener permisos de escritura y ejecucion del usuario)

crontab -u usuario
prefijo para manejar el crontab de otro usuario, ejemplos:

$ sudo crontab -l -u root
$ sudo crontab -e usuario2
#crontab -d -u usuario
Esta herramienta, como muchas otras se pueden ver a mas profundidad y con mas detalle en:



tar ejemplos para comprimir y descomprimir archivos

1. Crear “tar” Fichero de Archivos

The below example command will create a tar archive file tecmint-14-09-12.tar for a directory /home/tecmint in current working directory. See the example command in action.

# tar -cvf tecmint-14-09-12.tar /home/tecmint/
 /home/tecmint/
 /home/tecmint/cleanfiles.sh
 /home/tecmint/openvpn-2.1.4.tar.gz
 /home/tecmint/tecmint-14-09-12.tar
 /home/tecmint/phpmyadmin-2.11.11.3-1.el5.rf.noarch.rpm
 /home/tecmint/rpmforge-release-0.5.2-2.el5.rf.i386.rpm

Let’s discuss the each option we have used in the above command for creating tar archive file.

c – Creates a new .tar archive file.
v – Verbosely show the .tar file progress.
f – File name type of the archive file.

2. Crear “tar.gz” Fichero de Archivos Comprimidos

To create a compressed gzip archive file we use the option as z. For example the below command will create a compressed MyImages-14-09-12.tar.gz file for the directory /home/MyImages. (Note : tar.gz and tgz both are similar).

# tar cvzf MyImages-14-09-12.tar.gz /home/MyImages
OR
# tar cvzf MyImages-14-09-12.tgz /home/MyImages
/home/MyImages/
/home/MyImages/Sara-Khan-and-model-Priyanka-Shah.jpg
/home/MyImages/RobertKristenviolent101201.jpg
/home/MyImages/Justintimerlake101125.jpg
/home/MyImages/Mileyphoto101203.jpg
/home/MyImages/JenniferRobert101130.jpg
/home/MyImages/katrinabarbiedoll231110.jpg
/home/MyImages/the-japanese-wife-press-conference.jpg
/home/MyImages/ReesewitherspoonCIA101202.jpg
/home/MyImages/yanaguptabaresf231110.jpg
3. Create tar.bz2 Archive File

The bz2 feature compress and create archive file less than the size of the gzip. The bz2 compression takes more time to compress and decompress files as compared to gzip which takes less time. To create highly compressed tar file we use option as j. The following example of command will create a Phpfiles-org.tar.bz2 file for a directory /home/php. (Note: tar.bz2 and tbz is similar as tb2).

# tar cvfj Phpfiles-org.tar.bz2 /home/php
OR
# tar cvfj Phpfiles-org.tar.tbz /home/php
OR
# tar cvfj Phpfiles-org.tar.tb2 /home/php
/home/php/
/home/php/iframe_ew.php
/home/php/videos_all.php
/home/php/rss.php
/home/php/index.php
/home/php/vendor.php
/home/php/video_title.php
/home/php/report.php
/home/php/object.html
/home/php/video.php
4. Untar tar Archive File

To untar or extract a tar file, just issue following command using option x (extract). For example the below command will untar the file public_html-14-09-12.tar in present working directory. If you want untar in a different directory then use option as -C (specified directory).

## Untar files in Current Directory ##
# tar -xvf public_html-14-09-12.tar
## Untar files in specified Directory ##
# tar -xvf public_html-14-09-12.tar -C /home/public_html/videos/
/home/public_html/videos/
/home/public_html/videos/views.php
/home/public_html/videos/index.php
/home/public_html/videos/logout.php
/home/public_html/videos/all_categories.php
/home/public_html/videos/feeds.xml
5. Uncompress tar.gz Archive File

To Uncompress tar.gz archive file, just run following command. If would like to untar in different directory just use option -C and the path of the directory, like we shown in the above example.

# tar -xvf thumbnails-14-09-12.tar.gz
/home/public_html/videos/thumbnails/
/home/public_html/videos/thumbnails/katdeepika231110.jpg
/home/public_html/videos/thumbnails/katrinabarbiedoll231110.jpg
/home/public_html/videos/thumbnails/onceuponatime101125.jpg
/home/public_html/videos/thumbnails/playbutton.png
/home/public_html/videos/thumbnails/ReesewitherspoonCIA101202.jpg
/home/public_html/videos/thumbnails/snagItNarration.jpg
/home/public_html/videos/thumbnails/Minissha-Lamba.jpg
/home/public_html/videos/thumbnails/Lindsaydance101201.jpg
/home/public_html/videos/thumbnails/Mileyphoto101203.jpg
6. Uncompress tar.bz2 Archive File

To Uncompress highly compressed tar.bz2 file, just use the following command. The below example command will untar all the .flv files from the archive file.

# tar -xvf videos-14-09-12.tar.bz2
/home/public_html/videos/flv/katrinabarbiedoll231110.flv
/home/public_html/videos/flv/BrookmuellerCIA101125.flv
/home/public_html/videos/flv/dollybackinbb4101125.flv
/home/public_html/videos/flv/JenniferRobert101130.flv
/home/public_html/videos/flv/JustinAwardmovie101125.flv
/home/public_html/videos/flv/Lakme-Fashion-Week.flv
/home/public_html/videos/flv/Mileyphoto101203.flv
/home/public_html/videos/flv/Minissha-Lamba.flv
7. List Content of tar Archive File

To list the content of tar archive file, just run the following command with option t (list content). The below command will list the content of uploadprogress.tar file.

# tar -tvf uploadprogress.tar
-rw-r–r– chregu/staff 2276 2011-08-15 18:51:10 package2.xml
-rw-r–r– chregu/staff 7877 2011-08-15 18:51:10 uploadprogress/examples/index.php
-rw-r–r– chregu/staff 1685 2011-08-15 18:51:10 uploadprogress/examples/server.php
-rw-r–r– chregu/staff 1697 2011-08-15 18:51:10 uploadprogress/examples/info.php
-rw-r–r– chregu/staff 367 2011-08-15 18:51:10 uploadprogress/config.m4
-rw-r–r– chregu/staff 303 2011-08-15 18:51:10 uploadprogress/config.w32
-rw-r–r– chregu/staff 3563 2011-08-15 18:51:10 uploadprogress/php_uploadprogress.h
-rw-r–r– chregu/staff 15433 2011-08-15 18:51:10 uploadprogress/uploadprogress.c
-rw-r–r– chregu/staff 1433 2011-08-15 18:51:10 package.xml
8. List Content tar.gz Archive File

Use the following command to list the content of tar.gz file.

# tar -tvf staging.tecmint.com.tar.gz
-rw-r–r– root/root 0 2012-08-30 04:03:57 staging.tecmint.com-access_log
-rw-r–r– root/root 587 2012-08-29 18:35:12 staging.tecmint.com-access_log.1
-rw-r–r– root/root 156 2012-01-21 07:17:56 staging.tecmint.com-access_log.2
-rw-r–r– root/root 156 2011-12-21 11:30:56 staging.tecmint.com-access_log.3
-rw-r–r– root/root 156 2011-11-20 17:28:24 staging.tecmint.com-access_log.4
-rw-r–r– root/root 0 2012-08-30 04:03:57 staging.tecmint.com-error_log
-rw-r–r– root/root 3981 2012-08-29 18:35:12 staging.tecmint.com-error_log.1
-rw-r–r– root/root 211 2012-01-21 07:17:56 staging.tecmint.com-error_log.2
-rw-r–r– root/root 211 2011-12-21 11:30:56 staging.tecmint.com-error_log.3
-rw-r–r– root/root 211 2011-11-20 17:28:24 staging.tecmint.com-error_log.4
9. List Content tar.bz2 Archive File

To list the content of tar.bz2 file, issue the following command.

# tar -tvf Phpfiles-org.tar.bz2
drwxr-xr-x root/root 0 2012-09-15 03:06:08 /home/php/
-rw-r–r– root/root 1751 2012-09-15 03:06:08 /home/php/iframe_ew.php
-rw-r–r– root/root 11220 2012-09-15 03:06:08 /home/php/videos_all.php
-rw-r–r– root/root 2152 2012-09-15 03:06:08 /home/php/rss.php
-rw-r–r– root/root 3021 2012-09-15 03:06:08 /home/php/index.php
-rw-r–r– root/root 2554 2012-09-15 03:06:08 /home/php/vendor.php
-rw-r–r– root/root 406 2012-09-15 03:06:08 /home/php/video_title.php
-rw-r–r– root/root 4116 2012-09-15 03:06:08 /home/php/report.php
-rw-r–r– root/root 1273 2012-09-15 03:06:08 /home/php/object.html
10. Untar Single file from tar File

To extract a single file called cleanfiles.sh from cleanfiles.sh.tar use the following command.

# tar -xvf cleanfiles.sh.tar cleanfiles.sh
OR
# tar –extract –file=cleanfiles.sh.tar cleanfiles.sh
cleanfiles.sh
11. Untar Single file from tar.gz File

To extract a single file tecmintbackup.xml from tecmintbackup.tar.gz archive file, use the command as follows.

# tar -zxvf tecmintbackup.tar.gz tecmintbackup.xml
OR
# tar –extract –file=tecmintbackup.tar.gz tecmintbackup.xml
tecmintbackup.xml
12. Untar Single file from tar.bz2 File

To extract a single file called index.php from the file Phpfiles-org.tar.bz2 use the following option.

# tar -jxvf Phpfiles-org.tar.bz2 home/php/index.php
OR
# tar –extract –file=Phpfiles-org.tar.bz2 /home/php/index.php
/home/php/index.php
13. Untar Multiple files from tar, tar.gz and tar.bz2 File

To extract or untar multiple files from the tar, tar.gz and tar.bz2 archive file. For example the below command will extract “file 1” “file 2” from the archive files.

# tar -xvf tecmint-14-09-12.tar “file 1” “file 2”
# tar -zxvf MyImages-14-09-12.tar.gz “file 1” “file 2”
# tar -jxvf Phpfiles-org.tar.bz2 “file 1” “file 2”
14. Extract Group of Files using Wildcard

To extract a group of files we use wildcard based extracting. For example, to extract a group of all files whose pattern begins with .php from a tar, tar.gz and tar.bz2 archive file.

# tar -xvf Phpfiles-org.tar –wildcards ‘*.php’
# tar -zxvf Phpfiles-org.tar.gz –wildcards ‘*.php’
# tar -jxvf Phpfiles-org.tar.bz2 –wildcards ‘*.php’
/home/php/iframe_ew.php
/home/php/videos_all.php
/home/php/rss.php
/home/php/index.php
/home/php/vendor.php
/home/php/video_title.php
/home/php/report.php
/home/php/video.php
15. Add Files or Directories to tar Archive File

To add files or directories to existing tar archived file we use the option r (append). For example we add file xyz.txt and directory php to existing tecmint-14-09-12.tar archive file.

# tar -rvf tecmint-14-09-12.tar xyz.txt
# tar -rvf tecmint-14-09-12.tar php
drwxr-xr-x root/root 0 2012-09-15 02:24:21 home/tecmint/
-rw-r–r– root/root 15740615 2012-09-15 02:23:42 home/tecmint/cleanfiles.sh
-rw-r–r– root/root 863726 2012-09-15 02:23:41 home/tecmint/openvpn-2.1.4.tar.gz
-rw-r–r– root/root 21063680 2012-09-15 02:24:21 home/tecmint/tecmint-14-09-12.tar
-rw-r–r– root/root 4437600 2012-09-15 02:23:41 home/tecmint/phpmyadmin-2.11.11.3-1.el5.rf.noarch.rpm
-rw-r–r– root/root 12680 2012-09-15 02:23:41 home/tecmint/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
-rw-r–r– root/root 0 2012-08-18 19:11:04 xyz.txt
drwxr-xr-x root/root 0 2012-09-15 03:06:08 php/
-rw-r–r– root/root 1751 2012-09-15 03:06:08 php/iframe_ew.php
-rw-r–r– root/root 11220 2012-09-15 03:06:08 php/videos_all.php
-rw-r–r– root/root 2152 2012-09-15 03:06:08 php/rss.php
-rw-r–r– root/root 3021 2012-09-15 03:06:08 php/index.php
-rw-r–r– root/root 2554 2012-09-15 03:06:08 php/vendor.php
-rw-r–r– root/root 406 2012-09-15 03:06:08 php/video_title.php
16. Add Files or Directories to tar.gz and tar.bz2 files

The tar command don’t have a option to add files or directories to a existing compressed tar.gz and tar.bz2 archive file. If we do try will get tbe following error.

# tar -rvf MyImages-14-09-12.tar.gz xyz.txt
# tar -rvf Phpfiles-org.tar.bz2 xyz.txt
tar: This does not look like a tar archive
tar: Skipping to next header
xyz.txt
tar: Error exit delayed from previous errors
17. How To Verify tar, tar.gz and tar.bz2 Archive File

To verfify any tar or compressed archived file we use option as W (verify). To do, just use the following examples of command. (Note : You cannot do verification on a compressed ( *.tar.gz, *.tar.bz2 ) archive file).

# tar tvfW tecmint-14-09-12.tar
tar: This does not look like a tar archive
tar: Skipping to next header
tar: Archive contains obsolescent base-64 headers
tar: VERIFY FAILURE: 30740 invalid headers detected
Verify -rw-r–r– root/root 863726 2012-09-15 02:23:41 /home/tecmint/openvpn-2.1.4.tar.gz
Verify -rw-r–r– root/root 21063680 2012-09-15 02:24:21 /home/tecmint/tecmint-14-09-12.tar
tar: /home/tecmint/tecmint-14-09-12.tar: Warning: Cannot stat: No such file or directory
Verify -rw-r–r– root/root 4437600 2012-09-15 02:23:41 home/tecmint/phpmyadmin-2.11.11.3-1.el5.rf.noarch.rpm
tar: /home/tecmint/phpmyadmin-2.11.11.3-1.el5.rf.noarch.rpm: Warning: Cannot stat: No such file or directory
Verify -rw-r–r– root/root 12680 2012-09-15 02:23:41 home/tecmint/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
tar: /home/tecmint/rpmforge-release-0.5.2-2.el5.rf.i386.rpm: Warning: Cannot stat: No such file or directory
Verify -rw-r–r– root/root 0 2012-08-18 19:11:04 xyz.txt
Verify drwxr-xr-x root/root 0 2012-09-15 03:06:08 php/
18. Check the Size of the tar, tar.gz and tar.bz2 Archive File

To check the size of any tar, tar.gz and tar.bz2 archive file, use the following command. For example the below command will display the size of archvie file in Kilobytes (KB).

# tar -czf – tecmint-14-09-12.tar | wc -c
12820480
# tar -czf – MyImages-14-09-12.tar.gz | wc -c
112640
# tar -czf – Phpfiles-org.tar.bz2 | wc -c
20480
Tar Usage and Options

c – create a archive file.
x – extract a archive file.
v – show the progress of archive file.
f – filename of archive file.
t – viewing content of archive file.
j – filter archive through bzip2.
z – filter archive through gzip.
r – append or update files or directories to existing archive file.
W – Verify a archive file.
wildcards – Specify patters in unix tar command.
That’s it for now, hope the above tar command examples are enough for you to learn and for more information please use man tar command.