Apartamento En Familia

Apartamento En Familia
Apartamento de playa para vacaciones. http://www.apartamentoenfamilia.es. Número registro HUTT-005768

martes, 5 de marzo de 2013

Cambiar la fecha ctime atime o mtime de un archivo


El programa DebugFS es un depurador interactivo del sistema de nuestro sistema de archivos. Se puede utilizar para examinar y cambiar el estado de un sistema de archivos en ext2, ext3 o ext4. Cuando digo cambiar, quiero decir que podemos incluso recuperar un archivo borrado.

Hoy voy a explicar como hacer algo más sencillo como es cambiar la fecha de modificación del estado del archivo (ctime). 

Para ello entendamos un poco que son las diferentes marcas de tiempo:

ctime: 'change time' indica el tiempo de la última modificación que se realizó al archivo en términos de su inodo (inode). Es decir, cambios en los permisos, propietario, etc. También, lo utiliza el comando dump para determinar el último respaldo que se realizó al archivo. Es posible ver este tiempo con la opción c del comando ls. Ejemplo ls -lc

atime: 'access time' indica el tiempo en que el archivo fue por última accedido para mostrar su contenido. Por ejemplo cuando se usan los comandos cat, more, less o un script, en que se despliega el contenido del archivo se modificará su atime. Es posible ver este tiempo con la opción u del comando ls. Ejemplo ls -lu

mtime: 'modify time' indica el tiempo en que el contenido del archivo fue por última vez mofificado o editado, por ejemplo cuando usas un editor de texto o se altera por un script, etc. Con la opción l del comando ls se muestra este tiempo, que entonces, es el que estamos acostumbrados a observar con el listado típico: ls -l 
(Fuente LinuxTotal)
 
En alguna ocasión podemos necesitar cambiar la fecha de modificación de los datos del archivo o bien la fecha en la que se actualizó el estado de cambios del archivo.

Imaginemos que creamos un archivo a dia 4 de Marzo:

touch /home/user1/temp/hora_hacktime.txt

ediaz@pcediaz:~/temp$ ls -lath
total 16K
drwxrwxr-x  2 ediaz ediaz 4,0K mar  4 16:55 .
-rw-rw-r--  1 ediaz ediaz    0 mar  4 16:55 hora_hacktime.txt
drwxr-xr-x 92 ediaz ediaz  12K mar  4 16:55 ..


Como vemos, la hora ctime corresponde lógicamente con la mtime. Ahora modifiquemos la hora ctime. Para ello usaremos el comando debugfs. Tiene muchísimas posibilidades este comando, pero nos centraremos en las opciones -w y -R:

-w: El sistema de archivos tiene que ser abierto de lectura-escritura
-R: Lanzamos un comando de debugfs sin ejecutarlo en modo interactivo.

En nuestro caso el comando de debugfs que lanzamos será set_inode_field:
set_inode_field filespec field value

en donde filespec el archivo en cuestión, field en nuestro caso sera ctime y value es el valor datetime que queremos darle. Vamos a probarlo:


sudo debugfs -w -R 'set_inode_field /home/user1/temp/hora_hacktime.txt ctime 200901010101' /dev/sda1

Como veis, al final de todo especifico el sistema de archivos en donde esta el archivo que quiero modificar. En mi caso era /dev/sda1.

¿Y ya esta?. Realmente si. Lo que pasa es que si lo miramos, puede ser que no veamos el cambio aplicado. Como no es algo que haya realizado el sistema, puede ser que necesitemos usar el comando sync para hacer una limpieza (flush) del sistema de buffer:

sudo -s
sync
echo 2 > /proc/sys/vm/drop_caches



Ahora miramos la fecha ctime:

root@maquina:~/temp# ls -lathc
total 16K
drwxrwxr-x  2 ediaz ediaz 4,0K mar  4 16:55 .
drwxr-xr-x 92 ediaz ediaz  12K mar  4 16:55 ..
-rw-rw-r--  1 ediaz ediaz    0 ene  1  2009 hora_hacktime.txt

Y ya lo tenemos modificado.

That u don't know what you've got 'til it's gone